@@ -50,6 +50,7 @@ data class Program(
5050 context(nameResolver: NameResolver )
5151 fun toDebugOutput (): String = toSilver().toString()
5252}
53+
5354context(nameResolver: NameResolver )
5455private 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
109184context(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