Skip to content

Commit d94d459

Browse files
committed
JS: Name instance methods using API nodes instead of special-casing
1 parent c4a0f36 commit d94d459

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

javascript/ql/lib/semmle/javascript/endpoints/EndpointNaming.qll

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ private predicate isPackageExport(API::Node node) { node = API::moduleExport(_)
4141
private predicate relevantEdge(API::Node pred, API::Node succ) {
4242
succ = pred.getMember(_) and
4343
not isPrivateLike(succ)
44+
or
45+
succ = pred.getInstance()
4446
}
4547

4648
/** Gets the shortest distance from a packaeg export to `nd` in the API graph. */
@@ -77,19 +79,25 @@ private predicate isPrivateLike(API::Node node) { isPrivateAssignment(node.asSin
7779
private API::Node getASuccessor(API::Node node, string name, int badness) {
7880
isExported(node) and
7981
isExported(result) and
80-
exists(string member |
81-
result = node.getMember(member) and
82-
if member = "default"
83-
then
84-
if defaultExportCanBeInterpretedAsNamespaceExport(node)
85-
then (
86-
badness = 5 and name = ""
87-
) else (
88-
badness = 10 and name = "default"
82+
(
83+
exists(string member |
84+
result = node.getMember(member) and
85+
if member = "default"
86+
then
87+
if defaultExportCanBeInterpretedAsNamespaceExport(node)
88+
then (
89+
badness = 5 and name = ""
90+
) else (
91+
badness = 10 and name = "default"
92+
)
93+
else (
94+
name = member and badness = 0
8995
)
90-
else (
91-
name = member and badness = 0
9296
)
97+
or
98+
result = node.getInstance() and
99+
name = "prototype" and
100+
badness = 0
93101
)
94102
}
95103

@@ -315,10 +323,6 @@ private predicate functionHasNameCandidate(
315323
classObjectHasPrimaryName(cls, package, name, badness)
316324
or
317325
exists(string baseName, string memberName |
318-
function = cls.getInstanceMethod(memberName) and
319-
classInstanceHasPrimaryName(cls, package, baseName, badness) and
320-
name = join(baseName, memberName)
321-
or
322326
function = cls.getStaticMethod(memberName) and
323327
classObjectHasPrimaryName(cls, package, baseName, badness) and
324328
name = join(baseName, memberName)

javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ testFailures
33
| pack11/index.ts:33:18:33:69 | // $ me ... ng.name | Missing result:method=(pack11).C3.publicField.really.long.name |
44
| pack11/index.ts:41:23:41:24 | | Unexpected result: alias=(pack11).C3.publicField.really.long.name==(pack11).C3.privateField |
55
ambiguousPreferredPredecessor
6+
| pack2/lib.js:1:1:3:1 | def moduleImport("pack2").getMember("exports").getMember("lib").getMember("LibClass").getInstance() |
67
| pack2/lib.js:8:22:8:34 | def moduleImport("pack2").getMember("exports").getMember("lib").getMember("LibClass").getMember("foo") |
8+
| pack2/main.js:1:1:3:1 | def moduleImport("pack2").getMember("exports").getMember("MainClass").getInstance() |
79
ambiguousSinkName
810
ambiguousClassObjectName
911
failures

0 commit comments

Comments
 (0)