@@ -24,12 +24,7 @@ class AstNode extends TAstNode {
2424 )
2525 }
2626
27- AstNode getParent ( ) {
28- toGenerated ( result ) = toGenerated ( this ) .getParent ( ) and
29- not result = this
30- or
31- result .getAChild ( _) = this
32- }
27+ AstNode getParent ( ) { result .getAChild ( _) = this }
3328
3429 /**
3530 * Gets a child of this node, which can also be retrieved using a predicate
@@ -88,7 +83,6 @@ class Select extends TSelect, AstNode {
8883 }
8984
9085 override string getAPrimaryQlClass ( ) { result = "Select" }
91- // TODO: Getters for VarDecls, Where-clause, selects.
9286}
9387
9488/**
@@ -112,13 +106,20 @@ class Predicate extends TPredicate, AstNode {
112106
113107 int getArity ( ) { result = count ( getParameter ( _) ) }
114108
109+ /**
110+ * Gets the return type (if any) of the predicate.
111+ */
112+ TypeExpr getReturnType ( ) { none ( ) }
113+
115114 // TODO: ReturnType.
116115 override AstNode getAChild ( string pred ) {
117116 result = super .getAChild ( pred )
118117 or
119118 pred = "getBody" and result = this .getBody ( )
120119 or
121120 exists ( int i | pred = indexedMember ( "getParameter" , i ) and result = this .getParameter ( i ) )
121+ or
122+ pred = "getReturnType" and result = this .getReturnType ( )
122123 }
123124
124125 override string getAPrimaryQlClass ( ) { result = "Predicate" }
@@ -155,12 +156,6 @@ class PredicateExpr extends TPredicateExpr, AstNode {
155156
156157 Predicate getResolvedPredicate ( ) { resolvePredicateExpr ( this , result ) }
157158
158- override AstNode getParent ( ) {
159- result = super .getParent ( )
160- or
161- this in [ result .( ClasslessPredicate ) .getAlias ( ) , result .( HigherOrderFormula ) .getInput ( _) ]
162- }
163-
164159 override AstNode getAChild ( string pred ) {
165160 result = super .getAChild ( pred )
166161 or
@@ -179,11 +174,13 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati
179174
180175 ClasslessPredicate ( ) { this = TClasslessPredicate ( member , pred ) }
181176
182- final PredicateExpr getAlias ( ) {
177+ final AstNode getAlias ( ) {
183178 exists ( Generated:: PredicateAliasBody alias |
184179 alias .getParent ( ) = pred and
185180 toGenerated ( result ) .getParent ( ) = alias
186181 )
182+ or
183+ toGenerated ( result ) = pred .getChild ( _) .( Generated:: HigherOrderTerm )
187184 }
188185
189186 final override predicate isPrivate ( ) {
@@ -201,6 +198,8 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati
201198 rank [ i ] ( Generated:: VarDecl decl , int index | decl = pred .getChild ( index ) | decl order by index )
202199 }
203200
201+ override TypeExpr getReturnType ( ) { toGenerated ( result ) = pred .getReturnType ( ) }
202+
204203 override AstNode getAChild ( string pred_name ) {
205204 result = Predicate .super .getAChild ( pred_name )
206205 or
@@ -209,6 +208,8 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati
209208 pred_name = "getBody" and result = this .getBody ( )
210209 or
211210 exists ( int i | pred_name = indexedMember ( "getParameter" , i ) and result = this .getParameter ( i ) )
211+ or
212+ pred_name = "getReturnType" and result = this .getReturnType ( )
212213 }
213214}
214215
@@ -226,8 +227,6 @@ class ClassPredicate extends TClassPredicate, Predicate {
226227
227228 override string getAPrimaryQlClass ( ) { result = "ClassPredicate" }
228229
229- override Class getParent ( ) { result .getAClassPredicate ( ) = this }
230-
231230 predicate isPrivate ( ) {
232231 exists ( Generated:: ClassMember member |
233232 pred = member .getChild ( _) and
@@ -244,12 +243,16 @@ class ClassPredicate extends TClassPredicate, Predicate {
244243
245244 predicate overrides ( ClassPredicate other ) { predOverrides ( this , other ) }
246245
246+ override TypeExpr getReturnType ( ) { toGenerated ( result ) = pred .getReturnType ( ) }
247+
247248 override AstNode getAChild ( string pred_name ) {
248249 result = super .getAChild ( pred_name )
249250 or
250251 pred_name = "getBody" and result = this .getBody ( )
251252 or
252253 exists ( int i | pred_name = indexedMember ( "getParameter" , i ) and result = this .getParameter ( i ) )
254+ or
255+ pred_name = "getReturnType" and result = this .getReturnType ( )
253256 }
254257}
255258
@@ -265,9 +268,7 @@ class CharPred extends TCharPred, Predicate {
265268
266269 override Formula getBody ( ) { toGenerated ( result ) = pred .getBody ( ) }
267270
268- override string getName ( ) { result = getParent ( ) .getName ( ) }
269-
270- override Class getParent ( ) { result .getCharPred ( ) = this }
271+ override string getName ( ) { result = getParent ( ) .( Class ) .getName ( ) }
271272
272273 override AstNode getAChild ( string pred_name ) {
273274 result = super .getAChild ( pred_name )
@@ -301,16 +302,6 @@ class VarDecl extends TVarDecl, VarDef {
301302
302303 override string getAPrimaryQlClass ( ) { result = "VarDecl" }
303304
304- override AstNode getParent ( ) {
305- result = super .getParent ( )
306- or
307- result .( Class ) .getAField ( ) = this
308- or
309- result .( Aggregate ) .getAnArgument ( ) = this
310- or
311- result .( Quantifier ) .getAnArgument ( ) = this
312- }
313-
314305 TypeExpr getType ( ) { toGenerated ( result ) = var .getChild ( 0 ) }
315306
316307 predicate isPrivate ( ) {
@@ -372,19 +363,11 @@ class TypeExpr extends TType, AstNode {
372363 */
373364 ModuleExpr getModule ( ) { toGenerated ( result ) = type .getChild ( ) }
374365
375- override AstNode getParent ( ) {
376- result = super .getParent ( )
377- or
378- result .( InlineCast ) .getType ( ) = this
379- or
380- result .( Class ) .getAliasType ( ) = this
381- or
382- result .( Class ) .getUnionMember ( ) = this
383- or
384- result .( MemberCall ) .getSuperType ( ) = this
385- }
386-
387366 Type getResolvedType ( ) { resolveTypeExpr ( this , result ) }
367+
368+ override ModuleExpr getAChild ( string pred ) {
369+ result = super .getAChild ( pred ) or
370+ pred = "getModule" and result = this .getModule ( ) }
388371}
389372
390373/**
@@ -431,12 +414,6 @@ class Module extends TModule, ModuleDeclaration {
431414 * Something that can be member of a module.
432415 */
433416class ModuleMember extends TModuleMember , AstNode {
434- override AstNode getParent ( ) {
435- result = super .getParent ( )
436- or
437- this in [ result .( Module ) .getAMember ( ) , result .( TopLevel ) .getAMember ( ) ]
438- }
439-
440417 /** Holds if this member is declared as `private`. */
441418 predicate isPrivate ( ) { none ( ) } // TODO: Implement.
442419}
@@ -585,14 +562,16 @@ class NewTypeBranch extends TNewTypeBranch, TypeDeclaration {
585562 /** Gets a field in this branch. */
586563 VarDecl getField ( int i ) {
587564 toGenerated ( result ) =
588- rank [ i ] ( Generated:: VarDecl var | var = branch .getChild ( i ) | var order by i )
565+ rank [ i + 1 ] ( Generated:: VarDecl var , int index |
566+ var = branch .getChild ( index )
567+ |
568+ var order by index
569+ )
589570 }
590571
591572 /** Gets the body of this branch. */
592573 Formula getBody ( ) { toGenerated ( result ) = branch .getChild ( _) .( Generated:: Body ) .getChild ( ) }
593574
594- override NewType getParent ( ) { result .getABranch ( ) = this }
595-
596575 override AstNode getAChild ( string pred ) {
597576 result = super .getAChild ( pred )
598577 or
@@ -715,6 +694,7 @@ class InlineCast extends TInlineCast, Expr {
715694 Expr getBase ( ) { toGenerated ( result ) = expr .getChild ( 0 ) }
716695
717696 override AstNode getAChild ( string pred ) {
697+ result = super .getAChild ( pred ) or
718698 pred = "getType" and result = this .getType ( )
719699 or
720700 pred = "getBase" and result = this .getBase ( )
@@ -777,17 +757,7 @@ class Import extends TImport, ModuleMember, ModuleRef {
777757}
778758
779759/** A formula, such as `x = 6 and y < 5`. */
780- class Formula extends TFormula , AstNode {
781- override AstNode getParent ( ) {
782- result = super .getParent ( )
783- or
784- result .( Predicate ) .getBody ( ) = this
785- or
786- result .( Aggregate ) .getRange ( ) = this
787- or
788- result .( NewTypeBranch ) .getBody ( ) = this
789- }
790- }
760+ class Formula extends TFormula , AstNode { }
791761
792762/** An `and` formula, with 2 or more operands. */
793763class Conjunction extends TConjunction , AstNode , Formula {
@@ -914,6 +884,8 @@ class ComparisonFormula extends TComparisonFormula, Formula {
914884 pred = "getLeftOperand" and result = this .getLeftOperand ( )
915885 or
916886 pred = "getRightOperand" and result = this .getRightOperand ( )
887+ or
888+ pred = "getOperator" and result = this .getOperator ( )
917889 }
918890}
919891
@@ -1215,6 +1187,8 @@ class Aggregate extends TAggregate, Expr {
12151187 or
12161188 pred = indexedMember ( "getOrderBy" , i ) and result = this .getOrderBy ( i )
12171189 )
1190+ or
1191+ pred = "getRange" and result = this .getRange ( )
12181192 }
12191193}
12201194
@@ -1262,16 +1236,6 @@ class AsExpr extends TAsExpr, VarDef, Expr {
12621236 */
12631237 Expr getInnerExpr ( ) { toGenerated ( result ) = asExpr .getChild ( 0 ) }
12641238
1265- override AstNode getParent ( ) {
1266- result = super .getParent ( )
1267- or
1268- result .( Aggregate ) .getExpr ( _) = this
1269- or
1270- result .( ExprAggregate ) .getExpr ( _) = this
1271- or
1272- result .( Select ) .getExpr ( _) = this
1273- }
1274-
12751239 override AstNode getAChild ( string pred ) {
12761240 result = super .getAChild ( pred )
12771241 or
@@ -1356,19 +1320,7 @@ class Negation extends TNegation, Formula {
13561320}
13571321
13581322/** An expression, such as `x+4`. */
1359- class Expr extends TExpr , AstNode {
1360- override AstNode getParent ( ) {
1361- result = super .getParent ( )
1362- or
1363- result .( Call ) .getArgument ( _) = this
1364- or
1365- result .( Aggregate ) .getOrderBy ( _) = this
1366- or
1367- result .( ExprAggregate ) .getOrderBy ( _) = this
1368- or
1369- result .( Select ) .getOrderBy ( _) = this
1370- }
1371- }
1323+ class Expr extends TExpr , AstNode { }
13721324
13731325class ExprAnnotation extends TExprAnnotation , Expr {
13741326 Generated:: ExprAnnotation expr_anno ;
@@ -1624,16 +1576,11 @@ class ModuleExpr extends TModuleExpr, ModuleRef {
16241576
16251577 override string getAPrimaryQlClass ( ) { result = "ModuleExpr" }
16261578
1627- override AstNode getParent ( ) {
1628- result = super .getParent ( ) or
1629- result .( PredicateCall ) .getQualifier ( ) = this or
1630- result .( PredicateExpr ) .getQualifier ( ) = this or
1631- result .( Module ) .getAlias ( ) = this
1632- }
1633-
16341579 override AstNode getAChild ( string pred ) {
16351580 result = super .getAChild ( pred )
16361581 or
16371582 pred = "getQualifier" and result = this .getQualifier ( )
16381583 }
16391584}
1585+
1586+ private AstNode noParent ( ) { not exists ( result .getParent ( ) ) and not result instanceof TopLevel }
0 commit comments