Skip to content

Commit cbd4ef4

Browse files
committed
Also added ForbiddenInTrigger functionality to extension expressions
1 parent cd88640 commit cbd4ef4

File tree

5 files changed

+26
-8
lines changed

5 files changed

+26
-8
lines changed

Diff for: src/main/scala/viper/silver/ast/Expression.scala

+8-1
Original file line numberDiff line numberDiff line change
@@ -1290,13 +1290,20 @@ sealed trait Lhs extends Exp
12901290
* reach the backend verifiers. */
12911291
trait ExtensionExp extends Exp {
12921292
def extensionIsPure: Boolean
1293+
12931294
def extensionSubnodes: Seq[Node]
1295+
12941296
def typ: Type
1297+
12951298
def verifyExtExp(): VerificationResult
1299+
12961300
/** Pretty printing functionality as defined for other nodes in class FastPrettyPrinter.
1297-
* Sample implementation would be text("old") <> parens(show(e)) for pretty-printing an old-expression.*/
1301+
* Sample implementation would be text("old") <> parens(show(e)) for pretty-printing an old-expression. */
12981302
def prettyPrint: PrettyPrintPrimitives#Cont
12991303

13001304
/** Defines whether this expression can be used as a trigger. Defaults to false. */
13011305
def extensionIsValidTrigger(): Boolean = false
1306+
1307+
/** Defines whether this expression is forbidden from occurring *anywhere* in a trigger. Defaults to true. */
1308+
def extensionIsForbiddenInTrigger(): Boolean = true
13021309
}

Diff for: src/main/scala/viper/silver/ast/utility/Consistency.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,8 @@ object Consistency {
270270
case Old(nested) => validTrigger(nested, program) // case corresponds to OldTrigger node
271271
case LabelledOld(nested, _) => validTrigger(nested, program)
272272
case ee: ExtensionExp => ee.extensionIsValidTrigger()
273-
case wand: MagicWand => wand.subexpressionsToEvaluate(program).forall(e => !e.existsDefined {case _: ForbiddenInTrigger => })
274-
case _ : PossibleTrigger | _: FieldAccess | _: PredicateAccess => !e.existsDefined { case _: ForbiddenInTrigger => }
273+
case wand: MagicWand => wand.subexpressionsToEvaluate(program).forall(e => !e.existsDefined(Expressions.isForbiddenInTrigger))
274+
case _ : PossibleTrigger | _: FieldAccess | _: PredicateAccess => !e.existsDefined(Expressions.isForbiddenInTrigger)
275275
case _ => false
276276
}
277277
}

Diff for: src/main/scala/viper/silver/ast/utility/Expressions.scala

+5
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,11 @@ object Expressions {
295295
leftConds ++ guardedRightConds
296296
}
297297

298+
def isForbiddenInTrigger: PartialFunction[Node, Unit] = {
299+
case _: ForbiddenInTrigger =>
300+
case ee: ExtensionExp if ee.extensionIsForbiddenInTrigger() =>
301+
}
302+
298303
/** See [[viper.silver.ast.utility.Triggers.TriggerGeneration.generateTriggerSetGroups]] */
299304
def generateTriggerGroups(exp: QuantifiedExp, tg: TriggerGeneration = DefaultTriggerGeneration): Seq[(Seq[tg.TriggerSet], Seq[LocalVarDecl])] = {
300305
tg.generateTriggerSetGroups(exp.variables map (_.localVar), exp.exp)

Diff for: src/main/scala/viper/silver/ast/utility/Triggers.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ object Triggers {
3939
/* Note: If Add and Sub were type arguments of GenericTriggerGenerator, the latter
4040
* could implement isForbiddenInTrigger already */
4141
def isForbiddenInTrigger(e: Exp) = (customIsForbiddenInTrigger orElse {
42-
case _: ForbiddenInTrigger => true
42+
case e if Expressions.isForbiddenInTrigger.isDefinedAt(e) => true
4343
case _ => false
4444
}: PartialFunction[Exp, Boolean])(e)
4545

Diff for: src/main/scala/viper/silver/plugin/standard/adt/AdtASTExtension.scala

+10-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ package viper.silver.plugin.standard.adt
99
import viper.silver.ast._
1010
import viper.silver.ast.pretty.FastPrettyPrinter.{ContOps, braces, brackets, char, defaultIndent, line, nest, nil, parens, show, showType, showVars, space, ssep, text}
1111
import viper.silver.ast.pretty.PrettyPrintPrimitives
12-
import viper.silver.ast.utility.Consistency
12+
import viper.silver.ast.utility.{Consistency, Expressions}
1313
import viper.silver.verifier.{ConsistencyError, Failure, VerificationResult}
1414

1515
/**
@@ -207,7 +207,9 @@ case class AdtConstructorApp(name: String, args: Seq[Exp], typVarMap: Map[TypeVa
207207
}
208208
}
209209

210-
override def extensionIsValidTrigger(): Boolean = args.forall(a => !a.existsDefined {case _: ForbiddenInTrigger => })
210+
override def extensionIsValidTrigger(): Boolean = args.forall(a => !a.existsDefined(Expressions.isForbiddenInTrigger))
211+
212+
override def extensionIsForbiddenInTrigger(): Boolean = false
211213
}
212214

213215
object AdtConstructorApp {
@@ -256,7 +258,9 @@ case class AdtDestructorApp(name: String, rcv: Exp, typVarMap: Map[TypeVar, Type
256258
}
257259
}
258260

259-
override def extensionIsValidTrigger(): Boolean = !rcv.existsDefined {case _: ForbiddenInTrigger => }
261+
override def extensionIsValidTrigger(): Boolean = !rcv.existsDefined(Expressions.isForbiddenInTrigger)
262+
263+
override def extensionIsForbiddenInTrigger(): Boolean = false
260264
}
261265

262266
object AdtDestructorApp {
@@ -310,7 +314,9 @@ case class AdtDiscriminatorApp(name: String, rcv: Exp, typVarMap: Map[TypeVar, T
310314
}
311315
}
312316

313-
override def extensionIsValidTrigger(): Boolean = !rcv.existsDefined {case _: ForbiddenInTrigger => }
317+
override def extensionIsValidTrigger(): Boolean = !rcv.existsDefined(Expressions.isForbiddenInTrigger)
318+
319+
override def extensionIsForbiddenInTrigger(): Boolean = false
314320
}
315321

316322
object AdtDiscriminatorApp {

0 commit comments

Comments
 (0)