Skip to content

Commit f122c30

Browse files
committed
Unified: Add constructors to both static and instance namespaces
1 parent c481ad1 commit f122c30

3 files changed

Lines changed: 17 additions & 12 deletions

File tree

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,27 @@ class NameBindingPlugin extends Unit {
5656

5757
/** Holds if `member` is an instance member. */
5858
predicate isInstanceMember(Member member) {
59-
(member instanceof VariableDeclaration or member instanceof FunctionDeclaration) and
59+
(
60+
member instanceof VariableDeclaration or
61+
member instanceof FunctionDeclaration or
62+
member instanceof ConstructorDeclaration
63+
) and
6064
exists(ClassLikeDeclaration cls | cls.getAMember() = member |
6165
any(NameBindingPlugin p).isInstanceMember(cls, member)
6266
)
6367
}
6468

6569
/**
6670
* Holds if `member` is a non-instance member declared in the context of a class or top-level.
71+
*
72+
* Instance constructors are also considered static members, in order to be able to look them
73+
* up as both instance members (`self.init()`) and static members (`C1.init()`).
6774
*/
6875
predicate isStaticMember(Member member) {
6976
exists(ClassLikeDeclaration cls | cls.getAMember() = member |
7077
not any(NameBindingPlugin p).isInstanceMember(cls, member)
78+
or
79+
member instanceof ConstructorDeclaration
7180
)
7281
or
7382
member = any(TopLevel t).getBody().getAStmt()

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,13 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) {
191191
not isPrivateToLocalScope(nameDecl) and
192192
nameDecl.getDeclaration() = member and
193193
node1.isIdentifier(nameDecl) and
194-
name = nameDecl.getName() and
195-
if isInstanceMember(member)
196-
then node2.isInstanceMemberNamespace(cls)
197-
else node2.isStaticMemberNamespace(cls)
194+
name = nameDecl.getName()
195+
|
196+
isInstanceMember(member) and
197+
node2.isInstanceMemberNamespace(cls)
198+
or
199+
isStaticMember(member) and
200+
node2.isStaticMemberNamespace(cls)
198201
)
199202
or
200203
exists(TopLevel top, Stmt stmt, NameBinding nameDecl |

‎unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -300,13 +300,6 @@ private module Input3 implements InputSig3 {
300300
override AstNode getBody() { result = ConstructorDeclaration.super.getBody() }
301301

302302
override Identifier getNameNode() { result = ConstructorDeclaration.super.getNameNode() }
303-
304-
override predicate isMemberOf(ClassLikeDeclaration cls, Identifier i, string name) {
305-
// todo: constructors can be inherited
306-
this = cls.getAMember() and
307-
i = this.getNameNode() and
308-
name = i.getValue()
309-
}
310303
}
311304

312305
private class EnumConstructorCallable extends ConstructorDeclarationCallable instanceof EnumConstructor

0 commit comments

Comments
 (0)