@@ -346,16 +346,30 @@ module API {
346346 exists ( SSA:: implicitInit ( [ nm .getModuleVariable ( ) , nm .getExportsVariable ( ) ] ) )
347347 )
348348 )
349+ or
350+ m = any ( CanonicalName n | isDefined ( n ) ) .getExternalModuleName ( )
351+ } or
352+ MkModuleImport ( string m ) {
353+ imports ( _, m )
354+ or
355+ m = any ( CanonicalName n | isUsed ( n ) ) .getExternalModuleName ( )
349356 } or
350- MkModuleImport ( string m ) { imports ( _, m ) } or
351357 MkClassInstance ( DataFlow:: ClassNode cls ) { cls = trackDefNode ( _) and hasSemantics ( cls ) } or
352358 MkAsyncFuncResult ( DataFlow:: FunctionNode f ) {
353359 f = trackDefNode ( _) and f .getFunction ( ) .isAsync ( ) and hasSemantics ( f )
354360 } or
355361 MkDef ( DataFlow:: Node nd ) { rhs ( _, _, nd ) } or
356362 MkUse ( DataFlow:: Node nd ) { use ( _, _, nd ) } or
357- MkCanonicalNameDef ( CanonicalName n ) { isDefined ( n ) } or
358- MkCanonicalNameUse ( CanonicalName n ) { isUsed ( n ) }
363+ MkCanonicalNameDef ( CanonicalName n ) {
364+ // module roots are represented by `MkModuleExport` nodes
365+ not n .isRoot ( ) and
366+ isDefined ( n )
367+ } or
368+ MkCanonicalNameUse ( CanonicalName n ) {
369+ // module roots are represented by `MkModuleImport` nodes
370+ not n .isRoot ( ) and
371+ isUsed ( n )
372+ }
359373
360374 class TDef = MkModuleDef or TNonModuleDef ;
361375
@@ -399,6 +413,18 @@ module API {
399413 )
400414 }
401415
416+ private TApiNode mkCanonicalNameDef ( CanonicalName cn ) {
417+ if cn .isModuleRoot ( )
418+ then result = MkModuleExport ( cn .getExternalModuleName ( ) )
419+ else result = MkCanonicalNameDef ( cn )
420+ }
421+
422+ private TApiNode mkCanonicalNameUse ( CanonicalName cn ) {
423+ if cn .isModuleRoot ( )
424+ then result = MkModuleImport ( cn .getExternalModuleName ( ) )
425+ else result = MkCanonicalNameUse ( cn )
426+ }
427+
402428 /**
403429 * Holds if `rhs` is the right-hand side of a definition of a node that should have an
404430 * incoming edge from `base` labeled `lbl` in the API graph.
@@ -698,20 +724,11 @@ module API {
698724 succ = MkClassInstance ( trackDefNode ( def ) )
699725 )
700726 or
701- exists ( CanonicalName cn |
702- pred = MkRoot ( ) and
703- lbl = Label:: mod ( cn .getExternalModuleName ( ) )
704- |
705- succ = MkCanonicalNameUse ( cn ) or
706- succ = MkCanonicalNameDef ( cn )
707- )
708- or
709- exists ( CanonicalName cn1 , CanonicalName cn2 |
710- cn2 = cn1 .getAChild ( ) and
711- lbl = Label:: member ( cn2 .getName ( ) )
712- |
713- ( pred = MkCanonicalNameDef ( cn1 ) or pred = MkCanonicalNameUse ( cn1 ) ) and
714- ( succ = MkCanonicalNameDef ( cn2 ) or succ = MkCanonicalNameUse ( cn2 ) )
727+ exists ( CanonicalName cn1 , string n , CanonicalName cn2 |
728+ pred in [ mkCanonicalNameDef ( cn1 ) , mkCanonicalNameUse ( cn1 ) ] and
729+ cn2 = cn1 .getChild ( n ) and
730+ lbl = Label:: member ( n ) and
731+ succ in [ mkCanonicalNameDef ( cn2 ) , mkCanonicalNameUse ( cn2 ) ]
715732 )
716733 or
717734 exists ( DataFlow:: Node nd , DataFlow:: FunctionNode f |
0 commit comments