Skip to content

Commit 8714b13

Browse files
committed
Every existing name will be registered now
1 parent 5a610ac commit 8714b13

File tree

1 file changed

+103
-18
lines changed
  • formver.compiler-plugin/viper/src/org/jetbrains/kotlin/formver/viper/ast

1 file changed

+103
-18
lines changed

formver.compiler-plugin/viper/src/org/jetbrains/kotlin/formver/viper/ast/Program.kt

Lines changed: 103 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ data class Program(
5050
context(nameResolver: NameResolver)
5151
fun toDebugOutput(): String = toSilver().toString()
5252
}
53+
5354
context(nameResolver: NameResolver)
5455
private fun registerExpNames(exp: Exp) {
5556
when (exp) {
@@ -58,24 +59,114 @@ private fun registerExpNames(exp: Exp) {
5859
nameResolver.register(exp.field.name)
5960
registerExpNames(exp.rcv)
6061
}
62+
6163
is Exp.PredicateAccess -> {
6264
nameResolver.register(exp.predicateName)
6365
exp.formalArgs.forEach { registerExpNames(it) }
6466
}
67+
6568
is BinaryExp -> {
6669
registerExpNames(exp.left)
6770
registerExpNames(exp.right)
6871
}
72+
6973
is Exp.FuncApp -> {
7074
nameResolver.register(exp.functionName)
7175
exp.args.forEach { registerExpNames(it) }
7276
}
77+
7378
is Exp.DomainFuncApp -> {
7479
nameResolver.register(exp.function.name)
7580
exp.function.formalArgs.forEach { arg -> nameResolver.register(arg.name) }
7681
exp.args.forEach { registerExpNames(it) }
7782
}
78-
else -> { }
83+
84+
is Exp.Forall -> {
85+
exp.variables.forEach { nameResolver.register(it.name) }
86+
registerExpNames(exp.exp)
87+
}
88+
89+
is Exp.Exists -> {
90+
exp.variables.forEach { nameResolver.register(it.name) }
91+
registerExpNames(exp.exp)
92+
}
93+
94+
is Exp.LetBinding -> {
95+
nameResolver.register(exp.variable.name)
96+
registerExpNames(exp.body)
97+
}
98+
99+
is Exp.Old -> registerExpNames(exp.exp)
100+
is Exp.TernaryExp -> {
101+
registerExpNames(exp.thenExp)
102+
registerExpNames(exp.elseExp)
103+
}
104+
105+
is AccessPredicate.FieldAccessPredicate -> {}
106+
is Exp.Acc -> registerExpNames(exp.field)
107+
is Exp.ExplicitSeq -> exp.args.forEach { registerExpNames(it) }
108+
is Exp.Minus -> registerExpNames(exp.arg)
109+
is Exp.Not -> registerExpNames(exp.arg)
110+
is Exp.SeqIndex -> {
111+
registerExpNames(exp.seq)
112+
registerExpNames(exp.idx)
113+
}
114+
115+
is Exp.SeqLength -> registerExpNames(exp.seq)
116+
is Exp.SeqTake -> {
117+
registerExpNames(exp.seq)
118+
registerExpNames(exp.idx)
119+
}
120+
121+
is Exp.Unfolding -> {
122+
registerExpNames(exp.predicateAccess)
123+
registerExpNames(exp.body)
124+
}
125+
// no else branch to make decisions explicit.
126+
is Exp.Result, is Exp.BoolLit, is Exp.EmptySeq, is Exp.IntLit, is Exp.NullLit -> {}
127+
}
128+
}
129+
130+
context(nameResolver: NameResolver)
131+
private fun Program.registerStmtNames(stmt: Stmt) = when (stmt) {
132+
is Stmt.Label -> {
133+
nameResolver.register(stmt.name)
134+
stmt.invariants.forEach { registerExpNames(it) }
135+
}
136+
137+
is Stmt.Seqn -> registerSeqnNames(stmt)
138+
is Stmt.Goto -> nameResolver.register(stmt.name)
139+
is Stmt.MethodCall -> {
140+
stmt.args.forEach { registerExpNames(it) }
141+
stmt.targets.forEach { registerExpNames(it) }
142+
nameResolver.register(stmt.methodName)
143+
}
144+
145+
is Stmt.If -> {
146+
registerExpNames(stmt.cond)
147+
registerSeqnNames(stmt.then)
148+
stmt.els?.let { registerSeqnNames(it) }
149+
}
150+
151+
is Stmt.While -> {
152+
registerExpNames(stmt.cond)
153+
registerSeqnNames(stmt.body)
154+
stmt.invariants.forEach { registerExpNames(it) }
155+
}
156+
157+
is Stmt.LocalVarAssign -> {
158+
nameResolver.register(stmt.lhs.name)
159+
registerExpNames(stmt.rhs)
160+
}
161+
162+
is Stmt.Fold -> nameResolver.register(stmt.acc.predicateName)
163+
is Stmt.Unfold -> nameResolver.register(stmt.acc.predicateName)
164+
is Stmt.Assert -> registerExpNames(stmt.exp)
165+
is Stmt.Exhale -> registerExpNames(stmt.exp)
166+
is Stmt.Inhale -> registerExpNames(stmt.exp)
167+
is Stmt.FieldAssign -> {
168+
registerExpNames(stmt.lhs)
169+
registerExpNames(stmt.rhs)
79170
}
80171
}
81172

@@ -87,23 +178,7 @@ private fun Program.registerSeqnNames(seqn: Stmt.Seqn) {
87178
is Declaration.LabelDecl -> nameResolver.register(decl.name)
88179
}
89180
}
90-
seqn.stmts.forEach { stmt ->
91-
when (stmt) {
92-
is Stmt.Label -> nameResolver.register(stmt.name)
93-
is Stmt.Seqn -> registerSeqnNames(stmt)
94-
is Stmt.Goto -> nameResolver.register(stmt.name)
95-
is Stmt.MethodCall -> nameResolver.register(stmt.methodName)
96-
is Stmt.If -> {
97-
registerSeqnNames(stmt.then)
98-
stmt.els?.let { registerSeqnNames(it) }
99-
}
100-
is Stmt.While -> registerSeqnNames(stmt.body)
101-
is Stmt.LocalVarAssign -> nameResolver.register(stmt.lhs.name)
102-
is Stmt.Fold -> nameResolver.register(stmt.acc.predicateName)
103-
is Stmt.Unfold -> nameResolver.register(stmt.acc.predicateName)
104-
else -> { }
105-
}
106-
}
181+
seqn.stmts.forEach { registerStmtNames(it) }
107182
}
108183

109184
context(nameResolver: NameResolver)
@@ -114,12 +189,20 @@ fun Program.registerAllNames() {
114189
nameResolver.register(function.name)
115190
function.formalArgs.forEach { arg -> nameResolver.register(arg.name) }
116191
}
192+
domain.axioms.forEach { axiom ->
193+
if (axiom.name is NamedDomainAxiomLabel) {
194+
nameResolver.register(axiom.name)
195+
}
196+
registerExpNames(axiom.exp)
197+
}
117198
}
118199
fields.forEach { nameResolver.register(it.name) }
119200

120201
functions.forEach { function ->
121202
nameResolver.register(function.name)
122203
function.formalArgs.forEach { arg -> nameResolver.register(arg.name) }
204+
function.pres.forEach { arg -> registerExpNames(arg) }
205+
function.posts.forEach { arg -> registerExpNames(arg) }
123206
function.body?.let { exp -> registerExpNames(exp) }
124207
}
125208

@@ -133,6 +216,8 @@ fun Program.registerAllNames() {
133216
nameResolver.register(method.name)
134217
method.formalArgs.forEach { arg -> nameResolver.register(arg.name) }
135218
method.formalReturns.forEach { ret -> nameResolver.register(ret.name) }
219+
method.pres.forEach { arg -> registerExpNames(arg) }
220+
method.posts.forEach { arg -> registerExpNames(arg) }
136221
method.body?.let { seqn -> registerSeqnNames(seqn) }
137222
}
138223
}

0 commit comments

Comments
 (0)