@@ -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,9 @@ 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 ( ) }
352
357
}
353
358
354
359
/**
@@ -419,12 +424,11 @@ private class DefinitePreactComponent extends PreactComponent {
419
424
* - extends class called `Component`
420
425
* - has a `render` method that returns JSX or React elements.
421
426
*/
422
- private class HeuristicReactPreactComponent extends ClassDefinition , PreactComponent ,
423
- ES2015Component
424
- {
427
+ private class HeuristicReactPreactComponent extends PreactComponent , ES2015Component {
425
428
HeuristicReactPreactComponent ( ) {
426
- any ( DataFlow:: GlobalVarRefNode c | c .getName ( ) = "Component" ) .flowsToExpr ( this .getSuperClass ( ) ) and
427
- alwaysReturnsJsxOrReactElements ( ClassDefinition .super .getInstanceMethod ( "render" ) )
429
+ any ( DataFlow:: GlobalVarRefNode c | c .getName ( ) = "Component" )
430
+ .flowsToExpr ( this .( ClassDefinition ) .getSuperClass ( ) ) and
431
+ alwaysReturnsJsxOrReactElements ( this .( ClassDefinition ) .getInstanceMethod ( "render" ) )
428
432
}
429
433
}
430
434
0 commit comments