Skip to content

Commit c0bc400

Browse files
committed
Address review comments
1 parent 7926c7d commit c0bc400

5 files changed

Lines changed: 18 additions & 10 deletions

File tree

unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,12 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig<Locatio
333333
name = any(NameBindingPlugin p).getImplicitReceiverParameterName(callable) and
334334
scope = callable
335335
)
336+
or
337+
exists(ClassLikeDeclaration cls |
338+
isLocalVariable = false and
339+
name = any(NameBindingPlugin p).getStaticSelfName(cls) and
340+
scope = cls
341+
)
336342
}
337343

338344
predicate implicitDeclInScope(string name, AstNode scope) { implicitDeclInScope(name, scope, _) }

unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,11 @@ class NameBindingPlugin extends Unit {
4444
string getImplicitReceiverParameterName(Callable callable) { none() }
4545

4646
/**
47-
* Gets the name through which static members of the enclosing class can be
47+
* Gets the name through which static members of the enclosing class `cls` can be
4848
* accessed, for example `Self` in Swift.
4949
*/
50-
string getStaticSelfName() { none() }
50+
bindingset[cls]
51+
string getStaticSelfName(ClassLikeDeclaration cls) { none() }
5152
}
5253

5354
/** Holds if `member` is an instance member. */

unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ class NameBindingPluginSwift extends NameBindingPlugin {
4545
result = "self"
4646
}
4747

48-
override string getStaticSelfName() { result = "Self" }
48+
bindingset[cls]
49+
override string getStaticSelfName(ClassLikeDeclaration cls) { exists(cls) and result = "Self" }
4950
}
5051

5152
/** Holds if `node` is in a context where a bare name node should be seen as a reference rather than a declaration. */

unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,6 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) {
210210
)
211211
or
212212
FolderHeuristic::storeStep(node1, name, node2)
213-
or
214-
exists(ClassLikeDeclaration cls |
215-
name = any(NameBindingPlugin p).getStaticSelfName() and
216-
node1.isIdentifier(cls.getNameNode()) and
217-
node2.isStaticMemberNamespace(cls)
218-
)
219213
}
220214

221215
predicate valueStep(NameBindingNode node1, NameBindingNode node2) {
@@ -269,6 +263,12 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) {
269263
)
270264
or
271265
FolderHeuristic::valueStep(node1, node2)
266+
or
267+
exists(ClassLikeDeclaration cls, LocalNameBindingOutput::ImplicitLocal self |
268+
node1.isIdentifier(cls.getNameNode()) and
269+
node2.isLocalName(self) and
270+
self.hasNameAndScope(any(NameBindingPlugin p).getStaticSelfName(cls), cls)
271+
)
272272
}
273273

274274
private predicate isImportPrefix(Expr e) {

unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,6 @@ private class C {
5050
static let x = 1
5151
class D {
5252
static let x = 2
53-
static let foo = Self.x // $ access=C.D access=C.D.x $ SPURIOUS: access=C.x
53+
static let foo = Self.x // $ access=C.D access=C.D.x
5454
}
5555
}

0 commit comments

Comments
 (0)