Skip to content

Commit 417dac7

Browse files
author
Esben Sparre Andreasen
committed
JS: support React getDerivedStateFromProps
1 parent 9ff3d2e commit 417dac7

File tree

4 files changed

+12
-2
lines changed

4 files changed

+12
-2
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ abstract class ReactComponent extends ASTNode {
180180
// setState with object: `this.setState({foo: 42})`
181181
result = arg0
182182
)
183+
or
184+
result.flowsToExpr(getStaticMethod("getDerivedStateFromProps").getAReturnedExpr())
183185
}
184186

185187
/**
@@ -198,6 +200,10 @@ abstract class ReactComponent extends ASTNode {
198200
// componentDidUpdate: (prevProps, prevState)
199201
callback = getInstanceMethod("componentDidUpdate").flow() and
200202
stateParameterIndex = 1
203+
or
204+
// getDerivedStateFromProps: (props, state)
205+
callback = getStaticMethod("getDerivedStateFromProps").flow() and
206+
stateParameterIndex = 1
201207
)
202208
}
203209

@@ -242,6 +248,10 @@ abstract class ReactComponent extends ASTNode {
242248
// componentDidUpdate: (prevProps, prevState)
243249
callback = getInstanceMethod("componentDidUpdate").flow() and
244250
propsParameterIndex = 0
251+
or
252+
// getDerivedStateFromProps: (props, state)
253+
callback = getStaticMethod("getDerivedStateFromProps").flow() and
254+
propsParameterIndex = 0
245255
)
246256
}
247257

javascript/ql/test/library-tests/frameworks/ReactJS/ReactComponent_getACandidateStateSource.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
| es6.js:14:1:20:1 | class H ... }\\n} | es6.js:18:22:18:31 | { baz: 42} |
2+
| rare-lifecycle-methods.js:1:1:11:1 | class C ... }\\n} | rare-lifecycle-methods.js:3:16:3:17 | {} |
23
| statePropertyReads.js:1:1:13:1 | class R ... }\\n} | statePropertyReads.js:7:45:7:56 | prevState.p3 |
34
| statePropertyWrites.js:1:1:34:1 | class W ... };\\n} | statePropertyWrites.js:8:18:8:19 | {} |
45
| statePropertyWrites.js:1:1:34:1 | class W ... };\\n} | statePropertyWrites.js:12:18:12:19 | {} |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
| rare-lifecycle-methods.js:1:1:11:1 | class C ... }\\n} | rare-lifecycle-methods.js:2:44:2:48 | state |
12
| statePropertyReads.js:1:1:13:1 | class R ... }\\n} | statePropertyReads.js:7:24:7:32 | prevState |
23
| statePropertyReads.js:1:1:13:1 | class R ... }\\n} | statePropertyReads.js:10:35:10:43 | prevState |

javascript/ql/test/query-tests/React/UnusedOrUndefinedStateProperty/UnusedOrUndefinedStateProperty.expected

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,5 @@
22
| undefined.js:1:1:1:34 | class C ... }\\n} | Component state property 'notWrittenButReadInChain' is $@, but it is never written. | undefined.js:9:9:9:43 | this.st ... InChain | read |
33
| undefined.js:32:1:32:34 | class C ... }\\n} | Component state property 'notWrittenThrougExternalPropertyAccess' is $@, but it is never written. | undefined.js:35:9:35:57 | this.st ... yAccess | read |
44
| undefined.js:61:19:61:19 | {\\n r ... ;\\n }\\n} | Component state property 'notWrittenInKnownInitializerObject' is $@, but it is never written. | undefined.js:64:9:64:53 | this.st ... rObject | read |
5-
| undefined.js:159:1:159:35 | class C ... }\\n} | Component state property 'writeIn_getDerivedStateFromProps' is $@, but it is never written. | undefined.js:166:9:166:51 | this.st ... omProps | read |
65
| unused.js:1:1:1:34 | class C ... }\\n} | Component state property 'notRead' is $@, but it is never read. | unused.js:6:9:6:26 | this.state.notRead | written |
76
| unused.js:27:1:27:34 | class C ... }\\n} | Component state property 'notReadThrougExternaPropertyAccess' is $@, but it is never read. | unused.js:30:9:30:53 | this.st ... yAccess | written |
8-
| unused.js:64:1:64:34 | class C ... }\\n\\n} | Component state property 'readIn_getDerivedStateFromProps' is $@, but it is never read. | unused.js:71:9:71:50 | this.st ... omProps | written |

0 commit comments

Comments
 (0)