11import ql
22private import codeql_ql.ast.internal.AstNodes
33private import codeql_ql.ast.internal.Module
4+ private import codeql_ql.ast.internal.Predicate
45private import codeql_ql.ast.internal.Type
56
67/** An AST node of a QL program */
@@ -82,13 +83,30 @@ class PredicateExpr extends TPredicateExpr, AstNode {
8283
8384 override string toString ( ) { result = "predicate" }
8485
86+ string getName ( ) {
87+ exists ( Generated:: AritylessPredicateExpr ape , Generated:: LiteralId id |
88+ ape .getParent ( ) = pe and
89+ id .getParent ( ) = ape and
90+ result = id .getValue ( )
91+ )
92+ }
93+
94+ int getArity ( ) {
95+ exists ( Generated:: Integer i |
96+ i .getParent ( ) = pe and
97+ result = i .getValue ( ) .toInt ( )
98+ )
99+ }
100+
85101 ModuleExpr getQualifier ( ) {
86102 exists ( Generated:: AritylessPredicateExpr ape |
87103 ape .getParent ( ) = pe and
88104 toGenerated ( result ) .getParent ( ) = ape
89105 )
90106 }
91107
108+ Predicate getResolvedPredicate ( ) { resolvePredicateExpr ( this , result ) }
109+
92110 override AstNode getParent ( ) {
93111 this in [ result .( ClasslessPredicate ) .getAlias ( ) , result .( HigherOrderFormula ) .getInput ( _) ]
94112 }
@@ -99,7 +117,7 @@ class PredicateExpr extends TPredicateExpr, AstNode {
99117/**
100118 * A classless predicate.
101119 */
102- class ClasslessPredicate extends TClasslessPredicate , Predicate , ModuleMember {
120+ class ClasslessPredicate extends TClasslessPredicate , Predicate , ModuleDeclaration {
103121 Generated:: ModuleMember member ;
104122 Generated:: ClasslessPredicate pred ;
105123
@@ -253,7 +271,7 @@ class TypeExpr extends TType, AstNode {
253271/**
254272 * A QL module.
255273 */
256- class Module extends TModule , AstNode , ModuleMember {
274+ class Module extends TModule , ModuleDeclaration {
257275 Generated:: Module mod ;
258276
259277 Module ( ) { this = TModule ( mod ) }
@@ -267,10 +285,7 @@ class Module extends TModule, AstNode, ModuleMember {
267285 )
268286 }
269287
270- /**
271- * Gets the name of the module.
272- */
273- string getName ( ) { result = mod .getName ( ) .( Generated:: ModuleName ) .getChild ( ) .getValue ( ) }
288+ override string getName ( ) { result = mod .getName ( ) .( Generated:: ModuleName ) .getChild ( ) .getValue ( ) }
274289
275290 /**
276291 * Gets a member of the module.
@@ -297,10 +312,22 @@ class ModuleMember extends TModuleMember, AstNode {
297312 predicate isPrivate ( ) { none ( ) } // TODO: Implement.
298313}
299314
315+ /** A declaration. */
316+ class Declaration extends TDeclaration , AstNode {
317+ /** Gets the name of this declaration. */
318+ string getName ( ) { none ( ) }
319+ }
320+
321+ /** An entity that can be declared in a module. */
322+ class ModuleDeclaration extends TModuleDeclaration , Declaration , ModuleMember { }
323+
324+ /** An type declaration. Either a `class` or a `newtype`. */
325+ class TypeDeclaration extends TTypeDeclaration , Declaration { }
326+
300327/**
301328 * A QL class.
302329 */
303- class Class extends TClass , AstNode , ModuleMember {
330+ class Class extends TClass , TypeDeclaration , ModuleDeclaration {
304331 Generated:: Dataclass cls ;
305332
306333 Class ( ) { this = TClass ( cls ) }
@@ -314,10 +341,7 @@ class Class extends TClass, AstNode, ModuleMember {
314341 )
315342 }
316343
317- /**
318- * Gets the name of the class.
319- */
320- string getName ( ) { result = cls .getName ( ) .getValue ( ) }
344+ override string getName ( ) { result = cls .getName ( ) .getValue ( ) }
321345
322346 /**
323347 * Gets the charateristic predicate for this class.
@@ -365,12 +389,12 @@ class Class extends TClass, AstNode, ModuleMember {
365389/**
366390 * A `newtype Foo` declaration.
367391 */
368- class NewType extends TNewType , ModuleMember {
392+ class NewType extends TNewType , TypeDeclaration , ModuleDeclaration {
369393 Generated:: Datatype type ;
370394
371395 NewType ( ) { this = TNewType ( type ) }
372396
373- string getName ( ) { result = type .getName ( ) .getValue ( ) }
397+ override string getName ( ) { result = type .getName ( ) .getValue ( ) }
374398
375399 override string getAPrimaryQlClass ( ) { result = "NewType" }
376400
@@ -390,15 +414,14 @@ class NewType extends TNewType, ModuleMember {
390414/**
391415 * A branch in a `newtype`.
392416 */
393- class NewTypeBranch extends TNewTypeBranch , AstNode {
417+ class NewTypeBranch extends TNewTypeBranch , TypeDeclaration {
394418 Generated:: DatatypeBranch branch ;
395419
396420 NewTypeBranch ( ) { this = TNewTypeBranch ( branch ) }
397421
398422 override string getAPrimaryQlClass ( ) { result = "NewTypeBranch" }
399423
400- /** Gets the name of this branch. */
401- string getName ( ) { result = branch .getName ( ) .getValue ( ) }
424+ override string getName ( ) { result = branch .getName ( ) .getValue ( ) }
402425
403426 /** Gets a field in this branch. */
404427 VarDecl getField ( int i ) {
0 commit comments