Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 53935db

Browse files
committed
JS: Add support for " of " syntax to help during transition
1 parent 3025468 commit 53935db

4 files changed

Lines changed: 39 additions & 15 deletions

File tree

javascript/ql/lib/semmle/javascript/frameworks/data/internal/AccessPathSyntax.qll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,23 @@ class AccessPath extends string instanceof AccessPath::Range {
4949
}
5050
}
5151

52+
/**
53+
* An access path that uses `A of B` syntax, which should now be written as `B.A`.
54+
*
55+
* This is a compatibility layer to help test at checkpoints during transition to the new syntax.
56+
*/
57+
private class LegacyAccessPath extends AccessPath {
58+
LegacyAccessPath() { this.matches("% of %") }
59+
60+
private string getRawSplit(int n) { result = this.splitAt(" of ", n) }
61+
62+
private int getNumRawSplits() { result = strictcount(int n | exists(getRawSplit(n))) }
63+
64+
override string getRawToken(int n) { result = getRawSplit(getNumRawSplits() - n - 1) }
65+
66+
override predicate hasSyntaxError() { none() }
67+
}
68+
5269
/**
5370
* An access part token such as `Argument[1]` or `ReturnValue`, appearing in one or more access paths.
5471
*/

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ taintFlow
2828
| test.js:76:31:76:38 | source() | test.js:76:31:76:38 | source() |
2929
| test.js:77:34:77:41 | source() | test.js:77:34:77:41 | source() |
3030
| test.js:81:28:81:35 | source() | test.js:81:28:81:35 | source() |
31+
| test.js:87:40:87:47 | source() | test.js:87:40:87:47 | source() |
3132
isSink
3233
| test.js:46:18:46:25 | source() | test-sink |
3334
| test.js:47:22:47:29 | source() | test-sink |
@@ -71,6 +72,7 @@ isSink
7172
| test.js:78:34:78:34 | 3 | test-sink |
7273
| test.js:81:28:81:35 | source() | test-sink |
7374
| test.js:82:28:82:28 | 1 | test-sink |
75+
| test.js:87:40:87:47 | source() | test-sink |
7476
syntaxErrors
7577
| Member[foo |
7678
| Member[foo] .Member[bar] |

javascript/ql/test/library-tests/frameworks/data/test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,6 @@ function testSinks() {
8383
testlib.mySinkIfArityTwo(source(), 2, 3); // OK
8484
testlib.mySinkIfArityTwo(1, source(), 3); // OK
8585
testlib.mySinkIfArityTwo(1, 2, source()); // OK
86+
87+
testlib.one.two.three().legacySyntax(source()); // NOT OK
8688
}

javascript/ql/test/library-tests/frameworks/data/test.ql

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ class Sinks extends ModelInput::SinkModelCsv {
3434
}
3535
}
3636

37+
class LegacySyntaxTest extends ModelInput::SinkModelCsv {
38+
override predicate row(string row) {
39+
row =
40+
"testlib;;Argument[0] of Member[legacySyntax] of ReturnValue of Member[three] of Member[two] of Member[one];test-sink"
41+
}
42+
}
43+
3744
class BasicTaintTracking extends TaintTracking::Configuration {
3845
BasicTaintTracking() { this = "BasicTaintTracking" }
3946

@@ -58,21 +65,17 @@ query predicate isSink(DataFlow::Node node, string kind) {
5865

5966
class SyntaxErrorTest extends ModelInput::SinkModelCsv {
6067
override predicate row(string row) {
61-
row = [
62-
"testlib;;Member[foo],Member[bar];test-sink",
63-
"testlib;;Member[foo] Member[bar];test-sink",
64-
"testlib;;Member[foo]. Member[bar];test-sink",
65-
"testlib;;Member[foo], Member[bar];test-sink",
66-
"testlib;;Member[foo]..Member[bar];test-sink",
67-
"testlib;;Member[foo] .Member[bar];test-sink",
68-
"testlib;;Member[foo]Member[bar];test-sink",
69-
"testlib;;Member[foo;test-sink",
70-
"testlib;;Member[foo]];test-sink",
71-
"testlib;;Member[foo]].Member[bar];test-sink"
72-
]
68+
row =
69+
[
70+
"testlib;;Member[foo],Member[bar];test-sink", "testlib;;Member[foo] Member[bar];test-sink",
71+
"testlib;;Member[foo]. Member[bar];test-sink",
72+
"testlib;;Member[foo], Member[bar];test-sink",
73+
"testlib;;Member[foo]..Member[bar];test-sink",
74+
"testlib;;Member[foo] .Member[bar];test-sink", "testlib;;Member[foo]Member[bar];test-sink",
75+
"testlib;;Member[foo;test-sink", "testlib;;Member[foo]];test-sink",
76+
"testlib;;Member[foo]].Member[bar];test-sink"
77+
]
7378
}
7479
}
7580

76-
query predicate syntaxErrors(AccessPathSyntax::AccessPath path) {
77-
path.hasSyntaxError()
78-
}
81+
query predicate syntaxErrors(AccessPathSyntax::AccessPath path) { path.hasSyntaxError() }

0 commit comments

Comments
 (0)