@@ -311,14 +311,15 @@ class FunctionalComponent extends ReactComponent, Function {
311311/**
312312 * A React/Preact component implemented as a class.
313313 */
314- abstract private class SharedReactPreactClassComponent extends ReactComponent , ClassDefinition {
314+ abstract private class SharedReactPreactClassComponent extends ReactComponent instanceof ClassDefinition
315+ {
315316 override Function getInstanceMethod ( string name ) {
316317 result = ClassDefinition .super .getInstanceMethod ( name )
317318 }
318319
319320 override Function getStaticMethod ( string name ) {
320321 exists ( MethodDeclaration decl |
321- decl = this .getMethod ( name ) and
322+ decl = ClassDefinition . super .getMethod ( name ) and
322323 decl .isStatic ( ) and
323324 result = decl .getBody ( )
324325 )
@@ -327,7 +328,8 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C
327328 override DataFlow:: SourceNode getADirectPropsAccess ( ) {
328329 result = this .getAnInstanceReference ( ) .getAPropertyRead ( "props" )
329330 or
330- result = DataFlow:: parameterNode ( this .getConstructor ( ) .getBody ( ) .getParameter ( 0 ) )
331+ result =
332+ DataFlow:: parameterNode ( ClassDefinition .super .getConstructor ( ) .getBody ( ) .getParameter ( 0 ) )
331333 }
332334
333335 override AbstractValue getAbstractComponent ( ) { result = AbstractInstance:: of ( this ) }
@@ -340,7 +342,7 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C
340342
341343 override DataFlow:: SourceNode getACandidateStateSource ( ) {
342344 result = ReactComponent .super .getACandidateStateSource ( ) or
343- result .flowsToExpr ( this .getField ( "state" ) .getInit ( ) )
345+ result .flowsToExpr ( ClassDefinition . super .getField ( "state" ) .getInit ( ) )
344346 }
345347
346348 override DataFlow:: SourceNode getADefaultPropsSource ( ) {
@@ -349,6 +351,9 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C
349351 DataFlow:: valueNode ( this ) .( DataFlow:: SourceNode ) .hasPropertyWrite ( "defaultProps" , props )
350352 )
351353 }
354+
355+ /** Gets the expression denoting the super class of the defined class, if any. */
356+ Expr getSuperClass ( ) { result = ClassDefinition .super .getSuperClass ( ) }
352357}
353358
354359/**
@@ -362,7 +367,7 @@ abstract class ES2015Component extends SharedReactPreactClassComponent { }
362367 */
363368private class DefiniteES2015Component extends ES2015Component {
364369 DefiniteES2015Component ( ) {
365- exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .getSuperClass ( ) ) |
370+ exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .( ClassDefinition ) . getSuperClass ( ) ) |
366371 exists ( PropAccess access , string globalReactName |
367372 ( globalReactName = "react" or globalReactName = "React" ) and
368373 access = sup .asExpr ( )
@@ -400,7 +405,7 @@ abstract class PreactComponent extends SharedReactPreactClassComponent {
400405 */
401406private class DefinitePreactComponent extends PreactComponent {
402407 DefinitePreactComponent ( ) {
403- exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .getSuperClass ( ) ) |
408+ exists ( DataFlow:: SourceNode sup | sup .flowsToExpr ( this .( ClassDefinition ) . getSuperClass ( ) ) |
404409 exists ( PropAccess access , string globalPreactName |
405410 ( globalPreactName = "preact" or globalPreactName = "Preact" ) and
406411 access = sup .asExpr ( )
@@ -419,12 +424,11 @@ private class DefinitePreactComponent extends PreactComponent {
419424 * - extends class called `Component`
420425 * - has a `render` method that returns JSX or React elements.
421426 */
422- private class HeuristicReactPreactComponent extends ClassDefinition , PreactComponent ,
423- ES2015Component
424- {
427+ private class HeuristicReactPreactComponent extends PreactComponent , ES2015Component {
425428 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" ) )
428432 }
429433}
430434
0 commit comments