Skip to content

Commit ed3283b

Browse files
committed
JS: Do not override AST methods in React model
1 parent b4d6cb6 commit ed3283b

File tree

1 file changed

+15
-11
lines changed
  • javascript/ql/lib/semmle/javascript/frameworks

1 file changed

+15
-11
lines changed

javascript/ql/lib/semmle/javascript/frameworks/React.qll

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
363368
private 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
*/
401406
private 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

Comments
 (0)