@@ -313,7 +313,7 @@ module API {
313313 module Node {
314314 /** Gets a node whose type has the given qualified name. */
315315 Node ofType ( string moduleName , string exportedName ) {
316- result = Impl:: MkHasUnderlyingType ( moduleName , exportedName ) .( Node ) .getInstance ( )
316+ result = Impl:: MkTypeUse ( moduleName , exportedName ) .( Node ) .getInstance ( )
317317 }
318318 }
319319
@@ -374,28 +374,31 @@ module API {
374374 exists ( SSA:: implicitInit ( [ nm .getModuleVariable ( ) , nm .getExportsVariable ( ) ] ) )
375375 )
376376 )
377+ or
378+ any ( TypeDefinition td ) .getTypeName ( ) .hasQualifiedName ( m , _)
377379 } or
378380 MkModuleImport ( string m ) {
379381 imports ( _, m )
380382 or
381383 any ( TypeAnnotation n ) .hasQualifiedName ( m , _)
382384 or
383- any ( Type t ) .hasUnderlyingType ( m , _)
385+ any ( DataFlow :: Node n ) .hasUnderlyingType ( m , _)
384386 } or
385387 MkClassInstance ( DataFlow:: ClassNode cls ) { cls = trackDefNode ( _) and hasSemantics ( cls ) } or
386388 MkAsyncFuncResult ( DataFlow:: FunctionNode f ) {
387389 f = trackDefNode ( _) and f .getFunction ( ) .isAsync ( ) and hasSemantics ( f )
388390 } or
389391 MkDef ( DataFlow:: Node nd ) { rhs ( _, _, nd ) } or
390392 MkUse ( DataFlow:: Node nd ) { use ( _, _, nd ) } or
391- /**
392- * A TypeScript type, identified by name of the type-annotation.
393- * This API node is exclusively used by `API::Node::ofType`.
394- */
395- MkHasUnderlyingType ( string moduleName , string exportName ) {
393+ /** A definition of a TypeScript type. */
394+ MkTypeDef ( string moduleName , string exportName ) {
395+ exists ( TypeDefinition td | td .getTypeName ( ) .hasQualifiedName ( moduleName , exportName ) )
396+ } or
397+ /** A use of a TypeScript type. */
398+ MkTypeUse ( string moduleName , string exportName ) {
396399 any ( TypeAnnotation n ) .hasQualifiedName ( moduleName , exportName )
397400 or
398- any ( Type t ) .hasUnderlyingType ( moduleName , exportName )
401+ exists ( DataFlow :: Node nd | nd .hasUnderlyingType ( moduleName , exportName ) )
399402 } or
400403 MkSyntheticCallbackArg ( DataFlow:: Node src , int bound , DataFlow:: InvokeNode nd ) {
401404 trackUseNode ( src , true , bound ) .flowsTo ( nd .getCalleeNode ( ) )
@@ -404,9 +407,10 @@ module API {
404407 class TDef = MkModuleDef or TNonModuleDef ;
405408
406409 class TNonModuleDef =
407- MkModuleExport or MkClassInstance or MkAsyncFuncResult or MkDef or MkSyntheticCallbackArg ;
410+ MkModuleExport or MkClassInstance or MkAsyncFuncResult or MkDef or MkTypeDef or
411+ MkSyntheticCallbackArg ;
408412
409- class TUse = MkModuleUse or MkModuleImport or MkUse or MkHasUnderlyingType ;
413+ class TUse = MkModuleUse or MkModuleImport or MkUse or MkTypeUse ;
410414
411415 private predicate hasSemantics ( DataFlow:: Node nd ) { not nd .getTopLevel ( ) .isExterns ( ) }
412416
@@ -584,7 +588,7 @@ module API {
584588 )
585589 or
586590 exists ( string moduleName , string exportName |
587- base = MkHasUnderlyingType ( moduleName , exportName ) and
591+ base = MkTypeUse ( moduleName , exportName ) and
588592 lbl = Label:: instance ( ) and
589593 ref .( DataFlow:: SourceNode ) .hasUnderlyingType ( moduleName , exportName )
590594 )
@@ -821,9 +825,13 @@ module API {
821825 )
822826 or
823827 exists ( string moduleName , string exportName |
828+ pred = MkModuleExport ( moduleName ) and
829+ lbl = Label:: member ( exportName ) and
830+ succ = MkTypeDef ( moduleName , exportName )
831+ or
824832 pred = MkModuleImport ( moduleName ) and
825833 lbl = Label:: member ( exportName ) and
826- succ = MkHasUnderlyingType ( moduleName , exportName )
834+ succ = MkTypeUse ( moduleName , exportName )
827835 )
828836 or
829837 exists ( DataFlow:: Node nd , DataFlow:: FunctionNode f |
0 commit comments