1
1
package effekt .core
2
2
3
+ import scala .collection .mutable
4
+
3
5
/**
4
6
* This is testing the main/core.Renamer using the test/core.TestRenamer.
5
7
*/
@@ -17,6 +19,59 @@ class RenamerTests extends CoreTests {
17
19
assertAlphaEquivalent(obtained, pInput, clue)
18
20
}
19
21
22
+ def assertDefsUnique (in : ModuleDecl ,
23
+ clue : => Any = " Duplicate definition" ) = {
24
+ val seen = mutable.HashSet .empty[Id ]
25
+
26
+ def isFresh (id : Id ): Unit = {
27
+ assert(! seen.contains(id), clue)
28
+ seen.add(id)
29
+ }
30
+
31
+ object check extends Tree .Query [Unit , Unit ] {
32
+ override def empty = ()
33
+
34
+ override def combine = (_, _) => ()
35
+
36
+ override def visit [T ](t : T )(visitor : Unit ?=> T => Unit )(using Unit ): Unit = {
37
+ visitor(t)
38
+ t match {
39
+ case m : ModuleDecl =>
40
+ m.definitions.foreach { d => isFresh(d.id) }
41
+ case d : Def => isFresh(d.id)
42
+ case v : Val => isFresh(v.id)
43
+ case l : Let => isFresh(l.id)
44
+ case d : Declaration => isFresh(d.id)
45
+ case e : Extern .Def =>
46
+ isFresh(e.id)
47
+ e.tparams.foreach(isFresh);
48
+ e.vparams.foreach { p => isFresh(p.id) }
49
+ e.bparams.foreach { p => isFresh(p.id) };
50
+ e.cparams.foreach { p => isFresh(p) }
51
+ case b : BlockLit =>
52
+ b.tparams.foreach(isFresh);
53
+ b.cparams.foreach(isFresh)
54
+ b.vparams.foreach { p => isFresh(p.id) };
55
+ b.bparams.foreach { p => isFresh(p.id) }
56
+ case i : Implementation =>
57
+ i.operations.foreach { o =>
58
+ o.vparams.foreach { p => isFresh(p.id) }; o.bparams.foreach { p => isFresh(p.id) }
59
+ }
60
+ case _ => ()
61
+ }
62
+ }
63
+ }
64
+ check.query(in)(using ())
65
+ }
66
+ def assertRenamingMakesDefsUnique (input : String ,
67
+ clue : => Any = " Duplicate definition" ,
68
+ names : Names = Names (defaultNames))(using munit.Location ) = {
69
+ val pInput = parse(input, " input" , names)
70
+ val renamer = new Renamer (names, " renamed" )
71
+ val obtained = renamer(pInput)
72
+ assertDefsUnique(obtained, clue)
73
+ }
74
+
20
75
test(" No bound local variables" ){
21
76
val code =
22
77
""" module main
@@ -26,6 +81,7 @@ class RenamerTests extends CoreTests {
26
81
|}
27
82
|""" .stripMargin
28
83
assertRenamingPreservesAlpha(code)
84
+ assertRenamingMakesDefsUnique(code)
29
85
}
30
86
31
87
test(" val binding" ){
@@ -38,6 +94,7 @@ class RenamerTests extends CoreTests {
38
94
|}
39
95
|""" .stripMargin
40
96
assertRenamingPreservesAlpha(code)
97
+ assertRenamingMakesDefsUnique(code)
41
98
}
42
99
43
100
test(" var binding" ){
@@ -50,6 +107,7 @@ class RenamerTests extends CoreTests {
50
107
|}
51
108
|""" .stripMargin
52
109
assertRenamingPreservesAlpha(code)
110
+ assertRenamingMakesDefsUnique(code)
53
111
}
54
112
55
113
test(" function (value) parameters" ){
@@ -61,6 +119,7 @@ class RenamerTests extends CoreTests {
61
119
|}
62
120
|""" .stripMargin
63
121
assertRenamingPreservesAlpha(code)
122
+ assertRenamingMakesDefsUnique(code)
64
123
}
65
124
66
125
test(" match clauses" ){
@@ -75,6 +134,7 @@ class RenamerTests extends CoreTests {
75
134
|}
76
135
|""" .stripMargin
77
136
assertRenamingPreservesAlpha(code)
137
+ assertRenamingMakesDefsUnique(code)
78
138
}
79
139
80
140
test(" type parameters" ){
@@ -86,6 +146,7 @@ class RenamerTests extends CoreTests {
86
146
|}
87
147
|""" .stripMargin
88
148
assertRenamingPreservesAlpha(code)
149
+ assertRenamingMakesDefsUnique(code)
89
150
}
90
151
91
152
test(" pseudo recursive" ){
@@ -100,6 +161,7 @@ class RenamerTests extends CoreTests {
100
161
| }
101
162
|""" .stripMargin
102
163
assertRenamingPreservesAlpha(code)
164
+ assertRenamingMakesDefsUnique(code)
103
165
}
104
166
test(" shadowing let bindings" ){
105
167
val code =
@@ -112,5 +174,6 @@ class RenamerTests extends CoreTests {
112
174
| }
113
175
|""" .stripMargin
114
176
assertRenamingPreservesAlpha(code)
177
+ assertRenamingMakesDefsUnique(code)
115
178
}
116
179
}
0 commit comments