@@ -120,16 +120,16 @@ module QlBuiltinsMocks {
120
120
121
121
/**
122
122
* A mock that implements the `EquivalenceRelation` module.
123
- * The equivalent to the following is implemented: (TODO: WIP, MISSING THE LINES WITH //)
123
+ * The equivalent to the following is implemented:
124
124
* ```CodeQL
125
125
* module QlBuiltins {
126
126
* signature class T;
127
- * module EdgeSig<T MyT> {
127
+ * module EdgeSig<T MyT> { // This might not be needed.
128
128
* signature predicate edgeSig(MyT a, MyT b);
129
129
* }
130
- * module EquivalenceRelation<T MyT, EdgeSig<MyT>::edgeSig/2 edge> { //
131
- * class EquivalenceClass; //
132
- * EquivalenceClass getEquivalenceClass(MyT a); //
130
+ * module EquivalenceRelation<T MyT, EdgeSig<MyT>::edgeSig/2 edge> { // the `edge` parameter is not modeled
131
+ * class EquivalenceClass;
132
+ * EquivalenceClass getEquivalenceClass(MyT a);
133
133
* }
134
134
*}
135
135
*/
@@ -140,25 +140,26 @@ module QlBuiltinsMocks {
140
140
override string getName ( ) { result = "T" }
141
141
}
142
142
143
+ /** A mock TypeExpr with classname `T`. */
144
+ class DummyTTypeExpr extends MockTypeExpr:: Range {
145
+ DummyTTypeExpr ( ) { this = "Mock: QlBuiltins::T" }
146
+
147
+ override string getClassName ( ) { result = "T" }
148
+ }
149
+
143
150
module EdgeSig {
144
151
class EdgeSigModule extends MockModule:: Range {
145
152
EdgeSigModule ( ) { this = "Mock: QlBuiltins::EdgeSig" }
146
153
147
154
override string getName ( ) { result = "EdgeSig" }
148
155
149
156
override predicate hasTypeParam ( int i , string type , string name ) {
150
- i = 0 and name = "MyT" and type instanceof EdgeSigType
157
+ i = 0 and name = "MyT" and type instanceof DummyTTypeExpr
151
158
}
152
159
153
160
override string getMember ( int i ) { i = 0 and result instanceof EdgeSigPred }
154
161
}
155
162
156
- class EdgeSigType extends MockTypeExpr:: Range {
157
- EdgeSigType ( ) { this = "Mock: QlBuiltins::EdgeSig::MyT" }
158
-
159
- override string getClassName ( ) { result = "MyT" }
160
- }
161
-
162
163
class EdgeSigPred extends MockClasslessPredicate:: Range {
163
164
EdgeSigPred ( ) { this = "Mock: QlBuiltins::EdgeSig::edgeSig" }
164
165
@@ -182,7 +183,7 @@ module QlBuiltinsMocks {
182
183
183
184
override string getName ( ) { result = name }
184
185
185
- override MockTypeExpr:: Range getType ( ) { result instanceof EdgeSigType } // TODO: I'm just using one typeexpr for everything, that might break the parent relation.
186
+ override MockTypeExpr:: Range getType ( ) { result instanceof DummyTTypeExpr }
186
187
}
187
188
}
188
189
@@ -191,9 +192,50 @@ module QlBuiltinsMocks {
191
192
192
193
override string getName ( ) { result = "EquivalenceRelation" }
193
194
194
- override MockModule:: Range getMember ( int i ) {
195
- none ( ) // TODO: EquivalenceClass/getEquivalenceClass
195
+ override string getMember ( int i ) {
196
+ i = 0 and result instanceof EquivalenceClassClass
197
+ or
198
+ i = 1 and result instanceof GetEquivalenceClassPredicate
199
+ }
200
+
201
+ override predicate hasTypeParam ( int i , string type , string name ) {
202
+ i = 0 and name = "MyT" and type instanceof DummyTTypeExpr
203
+ or
204
+ none ( ) // TODO: `EdgeSig<MyT>::edgeSig/2 edge` is not implemented.
205
+ }
206
+ }
207
+
208
+ class GetEquivalenceClassPredicate extends MockClasslessPredicate:: Range {
209
+ GetEquivalenceClassPredicate ( ) {
210
+ this = "Mock: QlBuiltins::EquivalenceRelation::getEquivalenceClass"
211
+ }
212
+
213
+ override string getName ( ) { result = "getEquivalenceClass" }
214
+
215
+ override MockVarDecl:: Range getParameter ( int i ) {
216
+ result .( EdgeSig:: EdgeSigPredParam ) .getName ( ) = "a" and // just reusing another mock node that has the right name and type.
217
+ i = 0
218
+ }
219
+
220
+ override MockTypeExpr:: Range getReturnTypeExpr ( ) {
221
+ result instanceof EquivalenceClassTypeExpr
222
+ }
223
+ }
224
+
225
+ class EquivalenceClassClass extends MockClass:: Range {
226
+ EquivalenceClassClass ( ) {
227
+ this = "Mock: QlBuiltins::EquivalenceRelation::EquivalenceClass(Class)"
228
+ }
229
+
230
+ override string getName ( ) { result = "EquivalenceClass" }
231
+ }
232
+
233
+ class EquivalenceClassTypeExpr extends MockTypeExpr:: Range {
234
+ EquivalenceClassTypeExpr ( ) {
235
+ this = "Mock: QlBuiltins::EquivalenceRelation::EquivalenceClass(TypeExpr)"
196
236
}
237
+
238
+ override string getClassName ( ) { result = "EquivalenceClass" }
197
239
}
198
240
}
199
241
}
0 commit comments