Skip to content

Commit 2f4b18b

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

File tree

1 file changed

+13
-9
lines changed
  • javascript/ql/lib/semmle/javascript/frameworks

1 file changed

+13
-9
lines changed

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

Lines changed: 13 additions & 9 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
/**
@@ -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)