@@ -23,18 +23,18 @@ private class ContainerOrModule extends TContainerOrModule {
2323 or
2424 this = TFolder ( _) and result = "folder"
2525 }
26+
27+ /** Gets the module for this imported module. */
28+ Module asModule ( ) { this = TModule ( result ) }
29+
30+ /** Gets the file for this file. */
31+ File asFile ( ) { this = TFile ( result ) }
2632}
2733
2834private class TFileOrModule = TFile or TModule ;
2935
3036/** A file or a module. */
3137class FileOrModule extends TFileOrModule , ContainerOrModule {
32- /** Gets the module for this imported module. */
33- Module asModule ( ) { this = TModule ( result ) }
34-
35- /** Gets the file for this file. */
36- File asFile ( ) { this = TFile ( result ) }
37-
3838 /** Gets the file that contains this module/file. */
3939 File getFile ( ) {
4040 result = this .asFile ( )
@@ -114,6 +114,8 @@ class Module_ extends FileOrModule, TModule {
114114 }
115115}
116116
117+ // class ModuleRef = AstNodes::TModuleExpr or AstNodes::TType;
118+
117119private predicate resolveQualifiedName ( Import imp , ContainerOrModule m , int i ) {
118120 not m = TFile ( any ( File f | f .getExtension ( ) = "ql" ) ) and
119121 exists ( string q | q = imp .getQualifiedName ( i ) |
@@ -207,21 +209,21 @@ private module Cached {
207209
208210 /** Holds if module expression `me` resolves to `m`. */
209211 cached
210- predicate resolveModuleExpr ( ModuleExpr me , FileOrModule m ) {
212+ predicate resolveModuleRef ( ModuleRef me , FileOrModule m ) { // TODO: name.
211213 not m = TFile ( any ( File f | f .getExtension ( ) = "ql" ) ) and
212- not exists ( me .getQualifier ( ) ) and
213- exists ( ContainerOrModule enclosing , string name | resolveModuleExprHelper ( me , enclosing , name ) |
214+ not exists ( me .( ModuleExpr ) . getQualifier ( ) ) and
215+ exists ( ContainerOrModule enclosing , string name | resolveModuleRefHelper ( me , enclosing , name ) |
214216 definesModule ( enclosing , name , m , _)
215217 )
216218 or
217219 exists ( FileOrModule mid |
218- resolveModuleExpr ( me .getQualifier ( ) , mid ) and
219- definesModule ( mid , me .getName ( ) , m , true )
220+ resolveModuleRef ( me . ( ModuleExpr ) .getQualifier ( ) , mid ) and
221+ definesModule ( mid , me .( ModuleExpr ) . getName ( ) , m , true )
220222 )
221223 }
222224
223225 pragma [ noinline]
224- private predicate resolveModuleExprHelper ( ModuleExpr me , ContainerOrModule enclosing , string name ) {
226+ private predicate resolveModuleRefHelper ( ModuleRef me , ContainerOrModule enclosing , string name ) {
225227 enclosing = getEnclosingModule ( me ) .getEnclosing * ( ) and
226228 name = me .getName ( )
227229 }
@@ -231,7 +233,10 @@ import Cached
231233private import NewType
232234
233235boolean getPublicBool ( AstNode n ) {
234- if n .( ModuleMember ) .isPrivate ( ) or n .( NewTypeBranch ) .getNewType ( ) .isPrivate ( )
236+ if
237+ n .( ModuleMember ) .isPrivate ( ) or
238+ n .( NewTypeBranch ) .getNewType ( ) .isPrivate ( ) or
239+ n .( Module ) .isPrivate ( )
235240 then result = false
236241 else result = true
237242}
@@ -251,6 +256,20 @@ private predicate definesModule(
251256 public = true
252257 or
253258 m = TModule ( any ( Module mod | public = getPublicBool ( mod ) ) )
259+ )
260+ or
261+ // signature module in a paramertized module
262+ exists ( Module mod , SignatureExpr sig , ModuleParameterRef ty , int i |
263+ mod = container .asModule ( ) and
264+ mod .hasParameter ( i , name , sig ) and
265+ public = false and
266+ ty = sig .asModuleRef ( )
267+ |
268+ m = ty .getResolvedModule ( )
269+ or
270+ exists ( ModuleExpr inst | inst .getResolvedModule ( ) .asModule ( ) = mod |
271+ m = inst .getArgument ( i ) .asModuleRef ( ) .getResolvedModule ( )
272+ )
254273 )
255274 or
256275 // import X
@@ -274,7 +293,7 @@ private predicate definesModule(
274293 exists ( Module alias |
275294 container = getEnclosingModule ( alias ) and
276295 name = alias .getName ( ) and
277- resolveModuleExpr ( alias .getAlias ( ) , m ) and
296+ resolveModuleRef ( alias .getAlias ( ) , m ) and
278297 public = getPublicBool ( alias )
279298 )
280299}
@@ -288,8 +307,8 @@ module ModConsistency {
288307 .regexpMatch ( ".*/(test|examples|ql-training|recorded-call-graph-metrics)/.*" )
289308 }
290309
291- query predicate noResolveModuleExpr ( ModuleExpr me ) {
292- not resolveModuleExpr ( me , _ ) and
310+ query predicate noResolveModuleRef ( ModuleRef me ) { // TODO: name?
311+ not exists ( me . getResolvedModule ( ) ) and
293312 not me .getLocation ( )
294313 .getFile ( )
295314 .getAbsolutePath ( )
@@ -306,10 +325,10 @@ module ModConsistency {
306325 .regexpMatch ( ".*/(test|examples|ql-training|recorded-call-graph-metrics)/.*" )
307326 }
308327
309- query predicate multipleResolveModuleExpr ( ModuleExpr me , int c , ContainerOrModule m ) {
310- c = strictcount ( ContainerOrModule m0 | resolveModuleExpr ( me , m0 ) ) and
328+ query predicate multipleResolveModuleRef ( ModuleExpr me , int c , ContainerOrModule m ) {
329+ c = strictcount ( ContainerOrModule m0 | resolveModuleRef ( me , m0 ) ) and
311330 c > 1 and
312- resolveModuleExpr ( me , m )
331+ resolveModuleRef ( me , m )
313332 }
314333
315334 query predicate noName ( Module mod ) { not exists ( mod .getName ( ) ) }
0 commit comments