11import ql
22private import Builtins
33private import codeql_ql.ast.internal.Module
4+ private import codeql_ql.ast.internal.AstNodes as AstNodes
45
5- private predicate definesPredicate ( FileOrModule m , string name , ClasslessPredicate p , boolean public ) {
6+ private class TClasslessPredicateOrNewTypeBranch =
7+ AstNodes:: TClasslessPredicate or AstNodes:: TNewTypeBranch ;
8+
9+ string getPredicateName ( TClasslessPredicateOrNewTypeBranch p ) {
10+ result = p .( ClasslessPredicate ) .getName ( ) or
11+ result = p .( NewTypeBranch ) .getName ( )
12+ }
13+
14+ private predicate definesPredicate (
15+ FileOrModule m , string name , int arity , TClasslessPredicateOrNewTypeBranch p , boolean public
16+ ) {
617 m = getEnclosingModule ( p ) and
7- name = p .getName ( ) and
8- public = getPublicBool ( p )
18+ name = getPredicateName ( p ) and
19+ public = getPublicBool ( p ) and
20+ arity = [ p .( ClasslessPredicate ) .getArity ( ) , count ( p .( NewTypeBranch ) .getField ( _) ) ]
921 or
1022 // import X
1123 exists ( Import imp , FileOrModule m0 |
1224 m = getEnclosingModule ( imp ) and
1325 m0 = imp .getResolvedModule ( ) and
1426 not exists ( imp .importedAs ( ) ) and
15- definesPredicate ( m0 , name , p , true ) and
27+ definesPredicate ( m0 , name , arity , p , true ) and
1628 public = getPublicBool ( imp )
1729 )
1830 or
@@ -21,7 +33,8 @@ private predicate definesPredicate(FileOrModule m, string name, ClasslessPredica
2133 m = getEnclosingModule ( alias ) and
2234 name = alias .getName ( ) and
2335 resolvePredicateExpr ( alias .getAlias ( ) , p ) and
24- public = getPublicBool ( alias )
36+ public = getPublicBool ( alias ) and
37+ arity = alias .getArity ( )
2538 )
2639}
2740
@@ -34,8 +47,7 @@ predicate resolvePredicateExpr(PredicateExpr pe, ClasslessPredicate p) {
3447 m = pe .getQualifier ( ) .getResolvedModule ( ) and
3548 public = true
3649 |
37- definesPredicate ( m , pe .getName ( ) , p , public ) and
38- count ( p .getParameter ( _) ) = pe .getArity ( )
50+ definesPredicate ( m , pe .getName ( ) , count ( p .getParameter ( _) ) , p , public )
3951 )
4052}
4153
@@ -54,8 +66,7 @@ private predicate resolvePredicateCall(PredicateCall pc, PredicateOrBuiltin p) {
5466 m = pc .getQualifier ( ) .getResolvedModule ( ) and
5567 public = true
5668 |
57- definesPredicate ( m , pc .getPredicateName ( ) , p .getDeclaration ( ) , public ) and
58- p .getArity ( ) = pc .getNumberOfArguments ( )
69+ definesPredicate ( m , pc .getPredicateName ( ) , pc .getNumberOfArguments ( ) , p .getDeclaration ( ) , public )
5970 )
6071}
6172
@@ -74,6 +85,7 @@ predicate resolveCall(Call c, PredicateOrBuiltin p) {
7485
7586private newtype TPredOrBuiltin =
7687 TPred ( Predicate p ) or
88+ TNewTypeBranch ( NewTypeBranch b ) or
7789 TBuiltinClassless ( string ret , string name , string args ) { isBuiltinClassless ( ret , name , args ) } or
7890 TBuiltinMember ( string qual , string ret , string name , string args ) {
7991 isBuiltinMember ( qual , ret , name , args )
@@ -101,7 +113,7 @@ class PredicateOrBuiltin extends TPredOrBuiltin {
101113 )
102114 }
103115
104- Predicate getDeclaration ( ) { none ( ) }
116+ AstNode getDeclaration ( ) { none ( ) }
105117
106118 Type getDeclaringType ( ) { none ( ) }
107119
@@ -127,6 +139,7 @@ private class DefinedPredicate extends PredicateOrBuiltin, TPred {
127139
128140 override Type getParameterType ( int i ) { result = decl .getParameter ( i ) .getType ( ) }
129141
142+ // Can be removed when all types can be resolved
130143 override int getArity ( ) { result = decl .getArity ( ) }
131144
132145 override Type getDeclaringType ( ) {
@@ -140,6 +153,27 @@ private class DefinedPredicate extends PredicateOrBuiltin, TPred {
140153 }
141154}
142155
156+ private class DefinedNewTypeBranch extends PredicateOrBuiltin , TNewTypeBranch {
157+ NewTypeBranch b ;
158+
159+ DefinedNewTypeBranch ( ) { this = TNewTypeBranch ( b ) }
160+
161+ override NewTypeBranch getDeclaration ( ) { result = b }
162+
163+ override string getName ( ) { result = b .getName ( ) }
164+
165+ override NewTypeBranchType getReturnType ( ) { result .getDeclaration ( ) = b }
166+
167+ override Type getParameterType ( int i ) { result = b .getField ( i ) .getType ( ) }
168+
169+ // Can be removed when all types can be resolved
170+ override int getArity ( ) { result = count ( b .getField ( _) ) }
171+
172+ override Type getDeclaringType ( ) { none ( ) }
173+
174+ override predicate isPrivate ( ) { b .getNewType ( ) .isPrivate ( ) }
175+ }
176+
143177private class TBuiltin = TBuiltinClassless or TBuiltinMember ;
144178
145179class BuiltinPredicate extends PredicateOrBuiltin , TBuiltin { }
@@ -183,6 +217,7 @@ module PredConsistency {
183217
184218 query predicate noResolveCall ( Call c ) {
185219 not resolveCall ( c , _) and
220+ not c instanceof NoneCall and
186221 not c .getLocation ( ) .getFile ( ) .getAbsolutePath ( ) .regexpMatch ( ".*/(test|examples)/.*" )
187222 }
188223
0 commit comments