@@ -311,14 +311,15 @@ class FunctionalComponent extends ReactComponent, Function {
311
311
/**
312
312
* A React/Preact component implemented as a class.
313
313
*/
314
- abstract private class SharedReactPreactClassComponent extends ReactComponent , ClassDefinition {
314
+ abstract private class SharedReactPreactClassComponent extends ReactComponent instanceof ClassDefinition
315
+ {
315
316
override Function getInstanceMethod ( string name ) {
316
317
result = ClassDefinition .super .getInstanceMethod ( name )
317
318
}
318
319
319
320
override Function getStaticMethod ( string name ) {
320
321
exists ( MethodDeclaration decl |
321
- decl = this .getMethod ( name ) and
322
+ decl = ClassDefinition . super .getMethod ( name ) and
322
323
decl .isStatic ( ) and
323
324
result = decl .getBody ( )
324
325
)
@@ -327,7 +328,8 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C
327
328
override DataFlow:: SourceNode getADirectPropsAccess ( ) {
328
329
result = this .getAnInstanceReference ( ) .getAPropertyRead ( "props" )
329
330
or
330
- result = DataFlow:: parameterNode ( this .getConstructor ( ) .getBody ( ) .getParameter ( 0 ) )
331
+ result =
332
+ DataFlow:: parameterNode ( ClassDefinition .super .getConstructor ( ) .getBody ( ) .getParameter ( 0 ) )
331
333
}
332
334
333
335
override AbstractValue getAbstractComponent ( ) { result = AbstractInstance:: of ( this ) }
@@ -340,7 +342,7 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C
340
342
341
343
override DataFlow:: SourceNode getACandidateStateSource ( ) {
342
344
result = ReactComponent .super .getACandidateStateSource ( ) or
343
- result .flowsToExpr ( this .getField ( "state" ) .getInit ( ) )
345
+ result .flowsToExpr ( ClassDefinition . super .getField ( "state" ) .getInit ( ) )
344
346
}
345
347
346
348
override DataFlow:: SourceNode getADefaultPropsSource ( ) {
@@ -349,6 +351,17 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C
349
351
DataFlow:: valueNode ( this ) .( DataFlow:: SourceNode ) .hasPropertyWrite ( "defaultProps" , props )
350
352
)
351
353
}
354
+
355
+ /** Gets the expression denoting the super class of the defined class, if any. */
356
+ Expr getSuperClass ( ) { result = ClassDefinition .super .getSuperClass ( ) }
357
+
358
+ /**
359
+ * Gets the constructor of this class.
360
+ *
361
+ * Note that every class has a constructor: if no explicit constructor
362
+ * is declared, it has a synthetic default constructor.
363
+ */
364
+ ConstructorDeclaration getConstructor ( ) { result = ClassDefinition .super .getAMethod ( ) }
352
365
}
353
366
354
367
/**
@@ -362,7 +375,7 @@ abstract class ES2015Component extends SharedReactPreactClassComponent { }
362
375
*/
363
376
private class DefiniteES2015Component extends ES2015Component {
364
377
DefiniteES2015Component ( ) {
365
- exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .getSuperClass ( ) ) |
378
+ exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .( ClassDefinition ) . getSuperClass ( ) ) |
366
379
exists ( PropAccess access , string globalReactName |
367
380
( globalReactName = "react" or globalReactName = "React" ) and
368
381
access = sup .asExpr ( )
@@ -400,7 +413,7 @@ abstract class PreactComponent extends SharedReactPreactClassComponent {
400
413
*/
401
414
private class DefinitePreactComponent extends PreactComponent {
402
415
DefinitePreactComponent ( ) {
403
- exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .getSuperClass ( ) ) |
416
+ exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .( ClassDefinition ) . getSuperClass ( ) ) |
404
417
exists ( PropAccess access , string globalPreactName |
405
418
( globalPreactName = "preact" or globalPreactName = "Preact" ) and
406
419
access = sup .asExpr ( )
@@ -419,12 +432,11 @@ private class DefinitePreactComponent extends PreactComponent {
419
432
* - extends class called `Component`
420
433
* - has a `render` method that returns JSX or React elements.
421
434
*/
422
- private class HeuristicReactPreactComponent extends ClassDefinition , PreactComponent ,
423
- ES2015Component
424
- {
435
+ private class HeuristicReactPreactComponent extends PreactComponent , ES2015Component {
425
436
HeuristicReactPreactComponent ( ) {
426
- any ( DataFlow:: GlobalVarRefNode c | c .getName ( ) = "Component" ) .flowsToExpr ( this .getSuperClass ( ) ) and
427
- alwaysReturnsJsxOrReactElements ( ClassDefinition .super .getInstanceMethod ( "render" ) )
437
+ any ( DataFlow:: GlobalVarRefNode c | c .getName ( ) = "Component" )
438
+ .flowsToExpr ( this .( ClassDefinition ) .getSuperClass ( ) ) and
439
+ alwaysReturnsJsxOrReactElements ( this .( ClassDefinition ) .getInstanceMethod ( "render" ) )
428
440
}
429
441
}
430
442
0 commit comments