@@ -139,6 +139,11 @@ module Vue {
139
139
endcolumn = 0
140
140
}
141
141
142
+ /**
143
+ * Gets an API node referring to the component itself, such as the return value of `new Vue()`.
144
+ */
145
+ API:: Node getComponentRef ( ) { none ( ) } // overridden in subclass
146
+
142
147
/**
143
148
* Gets an API node referring to the options passed to the Vue object,
144
149
* such as the object literal `{...}` in `new Vue{{...})` or the default export of a single-file component.
@@ -374,6 +379,8 @@ module Vue {
374
379
def .hasLocationInfo ( filepath , startline , startcolumn , endline , endcolumn )
375
380
}
376
381
382
+ override API:: Node getComponentRef ( ) { result = def .getReturn ( ) }
383
+
377
384
override API:: Node getOwnOptions ( ) { result = def .getParameter ( 0 ) }
378
385
379
386
override DataFlow:: Node getOwnOptionsObject ( ) { result = def .getArgument ( 0 ) }
@@ -397,6 +404,8 @@ module Vue {
397
404
extend .hasLocationInfo ( filepath , startline , startcolumn , endline , endcolumn )
398
405
}
399
406
407
+ override API:: Node getComponentRef ( ) { result = extend .getReturn ( ) }
408
+
400
409
override API:: Node getOwnOptions ( ) { result = extend .getParameter ( 0 ) }
401
410
402
411
override DataFlow:: Node getOwnOptionsObject ( ) { result = extend .getArgument ( 0 ) }
@@ -421,6 +430,8 @@ module Vue {
421
430
sub .hasLocationInfo ( filepath , startline , startcolumn , endline , endcolumn )
422
431
}
423
432
433
+ override API:: Node getComponentRef ( ) { result = sub .getReturn ( ) }
434
+
424
435
override API:: Node getOwnOptions ( ) { result = sub .getParameter ( 0 ) }
425
436
426
437
override DataFlow:: Node getOwnOptionsObject ( ) { result = sub .getArgument ( 0 ) }
@@ -450,13 +461,40 @@ module Vue {
450
461
def .hasLocationInfo ( filepath , startline , startcolumn , endline , endcolumn )
451
462
}
452
463
464
+ override API:: Node getComponentRef ( ) {
465
+ // The component can be obtained via 1-argument calls to `Vue.component()` with the
466
+ // same name, but we don't model this at the moment.
467
+ none ( )
468
+ }
469
+
453
470
override API:: Node getOwnOptions ( ) { result = def .getParameter ( 1 ) }
454
471
455
472
override DataFlow:: Node getOwnOptionsObject ( ) { result = def .getArgument ( 1 ) }
456
473
457
474
override Template:: Element getTemplateElement ( ) { none ( ) }
458
475
}
459
476
477
+ /**
478
+ * An import referring to a `.vue` file, seen as an API entry point.
479
+ *
480
+ * Concretely, such an import receives the Vue component generated from the .vue file,
481
+ * not the actual exports of the script tag in the file.
482
+ */
483
+ private class VueFileImportEntryPoint extends API:: EntryPoint {
484
+ VueFileImportEntryPoint ( ) { this = "VueFileImportEntryPoint" }
485
+
486
+ override DataFlow:: SourceNode getAUse ( ) {
487
+ exists ( Import imprt |
488
+ imprt .getImportedPath ( ) .resolve ( ) instanceof VueFile and
489
+ result = imprt .getImportedModuleNode ( )
490
+ )
491
+ }
492
+
493
+ override DataFlow:: Node getARhs ( ) {
494
+ none ( )
495
+ }
496
+ }
497
+
460
498
/**
461
499
* A single file Vue component in a `.vue` file.
462
500
*/
@@ -490,6 +528,15 @@ module Vue {
490
528
)
491
529
}
492
530
531
+ override API:: Node getComponentRef ( ) {
532
+ // There is no explicit `new Vue()` call in .vue files, so instead get all the imports
533
+ // of the .vue file.
534
+ exists ( Import imprt |
535
+ imprt .getImportedPath ( ) .resolve ( ) = file and
536
+ result .getAnImmediateUse ( ) = imprt .getImportedModuleNode ( )
537
+ )
538
+ }
539
+
493
540
override API:: Node getOwnOptions ( ) {
494
541
exists ( ExportDefaultDeclaration decl |
495
542
decl .getTopLevel ( ) = getModule ( ) and
0 commit comments