@@ -120,16 +120,16 @@ module QlBuiltinsMocks {
120120
121121 /**
122122 * 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:
124124 * ```CodeQL
125125 * module QlBuiltins {
126126 * signature class T;
127- * module EdgeSig<T MyT> {
127+ * module EdgeSig<T MyT> { // This might not be needed.
128128 * signature predicate edgeSig(MyT a, MyT b);
129129 * }
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);
133133 * }
134134 *}
135135 */
@@ -140,25 +140,26 @@ module QlBuiltinsMocks {
140140 override string getName ( ) { result = "T" }
141141 }
142142
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+
143150 module EdgeSig {
144151 class EdgeSigModule extends MockModule:: Range {
145152 EdgeSigModule ( ) { this = "Mock: QlBuiltins::EdgeSig" }
146153
147154 override string getName ( ) { result = "EdgeSig" }
148155
149156 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
151158 }
152159
153160 override string getMember ( int i ) { i = 0 and result instanceof EdgeSigPred }
154161 }
155162
156- class EdgeSigType extends MockTypeExpr:: Range {
157- EdgeSigType ( ) { this = "Mock: QlBuiltins::EdgeSig::MyT" }
158-
159- override string getClassName ( ) { result = "MyT" }
160- }
161-
162163 class EdgeSigPred extends MockClasslessPredicate:: Range {
163164 EdgeSigPred ( ) { this = "Mock: QlBuiltins::EdgeSig::edgeSig" }
164165
@@ -182,7 +183,7 @@ module QlBuiltinsMocks {
182183
183184 override string getName ( ) { result = name }
184185
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 }
186187 }
187188 }
188189
@@ -191,9 +192,50 @@ module QlBuiltinsMocks {
191192
192193 override string getName ( ) { result = "EquivalenceRelation" }
193194
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)"
196236 }
237+
238+ override string getClassName ( ) { result = "EquivalenceClass" }
197239 }
198240 }
199241}
0 commit comments