Skip to content

Commit 4d4443c

Browse files
committed
JS: Use API graphs in getOption(s)
1 parent f450476 commit 4d4443c

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

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

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,23 @@ module Vue {
161161
*/
162162
API::Node getOwnOptions() { none() } // overridden in subclass
163163

164+
/** Gets a component which is extended by this one. */
165+
Component getABaseComponent() {
166+
result.getComponentRef().getAUse() = getOwnOptions().getMember(["extends", "mixins"]).getARhs()
167+
}
168+
169+
/**
170+
* Gets an API node referring to the options passed to the Vue object or one
171+
* of its base component.
172+
*/
173+
API::Node getOptions() {
174+
result = getOwnOptions()
175+
or
176+
result = getOwnOptions().getMember(["extends", "mixins"]).getAMember()
177+
or
178+
result = getABaseComponent().getOptions()
179+
}
180+
164181
/**
165182
* Gets the options passed to the Vue object, such as the object literal `{...}` in `new Vue{{...})`
166183
* or the default export of a single-file component.
@@ -188,23 +205,9 @@ module Vue {
188205
* extended objects and mixins.
189206
*/
190207
DataFlow::Node getOption(string name) {
191-
result = getOwnOption(name)
192-
or
193-
exists(DataFlow::SourceNode extendsVal | extendsVal.flowsTo(getOwnOption("extends")) |
194-
result = extendsVal.(DataFlow::ObjectLiteralNode).getAPropertyWrite(name).getRhs()
195-
or
196-
exists(ExtendedVue extend |
197-
MkExtendedVue(extendsVal) = extend and
198-
result = extend.getOption(name)
199-
)
200-
)
201-
or
202-
exists(DataFlow::ArrayCreationNode mixins, DataFlow::ObjectLiteralNode mixin |
203-
mixins.flowsTo(getOwnOption("mixins")) and
204-
mixin.flowsTo(mixins.getAnElement()) and
205-
result = mixin.getAPropertyWrite(name).getRhs()
206-
)
208+
result = getOptions().getMember(name).getARhs()
207209
or
210+
// not ported to API graphs yet
208211
result = getAsClassComponent().getDecoratorOption(name)
209212
}
210213

javascript/ql/test/library-tests/frameworks/Vue/tests.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ component_getAPropertyValue
1919
| tst.js:48:1:50:2 | new Ext ... 42 }\\n}) | fromSuper | tst.js:44:18:44:19 | 42 |
2020
| tst.js:51:17:57:2 | Vue.ext ... \\n }\\n}) | fromSuper | tst.js:54:18:54:19 | 42 |
2121
| tst.js:58:1:61:2 | new Vue ... 42 }\\n}) | fromSub | tst.js:60:19:60:20 | 42 |
22+
| tst.js:58:1:61:2 | new Vue ... 42 }\\n}) | fromSuper | tst.js:54:18:54:19 | 42 |
2223
| tst.js:63:1:66:2 | new Vue ... 42 }\\n}) | fromMixin1 | tst.js:64:32:64:33 | 42 |
2324
| tst.js:63:1:66:2 | new Vue ... 42 }\\n}) | fromMixin2 | tst.js:64:61:64:62 | 42 |
2425
| tst.js:63:1:66:2 | new Vue ... 42 }\\n}) | fromSub | tst.js:65:19:65:20 | 42 |
@@ -44,6 +45,7 @@ component_getOption
4445
| tst.js:48:1:50:2 | new Ext ... 42 }\\n}) | data | tst.js:42:9:46:3 | functio ... };\\n } |
4546
| tst.js:48:1:50:2 | new Ext ... 42 }\\n}) | data | tst.js:49:8:49:22 | { fromSub: 42 } |
4647
| tst.js:51:17:57:2 | Vue.ext ... \\n }\\n}) | data | tst.js:52:9:56:3 | functio ... };\\n } |
48+
| tst.js:58:1:61:2 | new Vue ... 42 }\\n}) | data | tst.js:52:9:56:3 | functio ... };\\n } |
4749
| tst.js:58:1:61:2 | new Vue ... 42 }\\n}) | data | tst.js:60:8:60:22 | { fromSub: 42 } |
4850
| tst.js:58:1:61:2 | new Vue ... 42 }\\n}) | mixins | tst.js:59:10:59:18 | Extended2 |
4951
| tst.js:63:1:66:2 | new Vue ... 42 }\\n}) | data | tst.js:64:18:64:35 | { fromMixin1: 42 } |

0 commit comments

Comments
 (0)