Skip to content

Commit d94633a

Browse files
authored
Merge pull request #9542 from github/alexdenisov/extract-extensions
Swift: extract extension declarations
2 parents b4a1ef1 + e677b78 commit d94633a

File tree

10 files changed

+52
-3
lines changed

10 files changed

+52
-3
lines changed

swift/codegen/schema.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ IterableDeclContext:
3636
members: Decl*
3737

3838
ExtensionDecl:
39+
extended_type_decl: NominalTypeDecl
3940
_extends:
4041
- GenericContext
4142
- IterableDeclContext

swift/extractor/visitors/DeclVisitor.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,14 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
193193
emitAbstractStorageDecl(decl, label);
194194
}
195195

196+
void visitExtensionDecl(swift::ExtensionDecl* decl) {
197+
auto label = dispatcher_.assignNewLabel(decl);
198+
auto typeLabel = dispatcher_.fetchLabel(decl->getExtendedNominal());
199+
dispatcher_.emit(ExtensionDeclsTrap{label, typeLabel});
200+
emitGenericContext(decl, label);
201+
emitIterableDeclContext(decl, label);
202+
}
203+
196204
private:
197205
void emitConstructorDecl(swift::ConstructorDecl* decl, TrapLabel<ConstructorDeclTag> label) {
198206
emitAbstractFunctionDecl(decl, label);

swift/ql/lib/codeql/swift/generated/decl/ExtensionDecl.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@
22
import codeql.swift.elements.decl.Decl
33
import codeql.swift.elements.decl.GenericContext
44
import codeql.swift.elements.decl.IterableDeclContext
5+
import codeql.swift.elements.decl.NominalTypeDecl
56

67
class ExtensionDeclBase extends @extension_decl, Decl, GenericContext, IterableDeclContext {
78
override string getAPrimaryQlClass() { result = "ExtensionDecl" }
9+
10+
NominalTypeDecl getExtendedTypeDecl() {
11+
exists(NominalTypeDecl x |
12+
extension_decls(this, x) and
13+
result = x.resolve()
14+
)
15+
}
816
}

swift/ql/lib/swift.dbscheme

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ iterable_decl_context_members(
9898
);
9999

100100
extension_decls(
101-
unique int id: @extension_decl
101+
unique int id: @extension_decl,
102+
int extended_type_decl: @nominal_type_decl ref
102103
);
103104

104105
@nominal_type_decl =

swift/ql/test/extractor-tests/declarations/all.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,7 @@
205205
| declarations.swift:132:5:132:5 | newValue |
206206
| declarations.swift:132:5:132:15 | willSet |
207207
| declarations.swift:134:5:134:14 | didSet |
208+
| declarations.swift:138:1:142:1 | extension |
209+
| declarations.swift:139:3:141:3 | id |
210+
| declarations.swift:139:8:139:8 | self |
211+
| declarations.swift:144:1:144:7 | { ... } |

swift/ql/test/extractor-tests/declarations/declarations.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,13 @@ struct HasPropertyAndObserver {
133133

134134
didSet { }
135135
}
136-
}
136+
}
137+
138+
extension Int {
139+
func id() -> Int {
140+
return self
141+
}
142+
}
143+
144+
42.id()
145+

swift/ql/test/extractor-tests/declarations/func.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,4 @@
5555
| declarations.swift:131:7:131:7 | set | (unnamed function decl) |
5656
| declarations.swift:132:5:132:15 | willSet | (unnamed function decl) |
5757
| declarations.swift:134:5:134:14 | didSet | (unnamed function decl) |
58+
| declarations.swift:139:3:141:3 | id | id |

swift/ql/test/extractor-tests/declarations/func_body.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,4 @@
5050
| declarations.swift:131:7:131:7 | set | declarations.swift:131:7:131:7 | { ... } |
5151
| declarations.swift:132:5:132:15 | willSet | declarations.swift:132:13:132:15 | { ... } |
5252
| declarations.swift:134:5:134:14 | didSet | declarations.swift:134:12:134:14 | { ... } |
53+
| declarations.swift:139:3:141:3 | id | declarations.swift:139:20:141:3 | { ... } |

swift/ql/test/library-tests/parent/declarations.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,13 @@ struct HasPropertyAndObserver {
133133

134134
didSet { }
135135
}
136-
}
136+
}
137+
138+
extension Int {
139+
func id() -> Int {
140+
return self
141+
}
142+
}
143+
144+
42.id()
145+

swift/ql/test/library-tests/parent/parent.expected

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,13 @@
326326
| declarations.swift:132:5:132:15 | willSet | AccessorDecl | declarations.swift:132:5:132:5 | newValue | ParamDecl |
327327
| declarations.swift:132:5:132:15 | willSet | AccessorDecl | declarations.swift:132:13:132:15 | { ... } | BraceStmt |
328328
| declarations.swift:134:5:134:14 | didSet | AccessorDecl | declarations.swift:134:12:134:14 | { ... } | BraceStmt |
329+
| declarations.swift:139:3:141:3 | id | ConcreteFuncDecl | declarations.swift:139:20:141:3 | { ... } | BraceStmt |
330+
| declarations.swift:139:20:141:3 | { ... } | BraceStmt | declarations.swift:140:5:140:12 | return ... | ReturnStmt |
331+
| declarations.swift:140:5:140:12 | return ... | ReturnStmt | declarations.swift:140:12:140:12 | self | DeclRefExpr |
332+
| declarations.swift:144:1:144:4 | call to id | DotSyntaxCallExpr | declarations.swift:144:4:144:4 | id | DeclRefExpr |
333+
| declarations.swift:144:1:144:7 | call to ... | CallExpr | declarations.swift:144:1:144:4 | call to id | DotSyntaxCallExpr |
334+
| declarations.swift:144:1:144:7 | { ... } | BraceStmt | declarations.swift:144:1:144:7 | call to ... | CallExpr |
335+
| declarations.swift:144:1:144:7 | { ... } | TopLevelCodeDecl | declarations.swift:144:1:144:7 | { ... } | BraceStmt |
329336
| expressions.swift:1:1:1:9 | var ... = ... | PatternBindingDecl | expressions.swift:1:5:1:5 | a | NamedPattern |
330337
| expressions.swift:1:1:1:9 | var ... = ... | PatternBindingDecl | expressions.swift:1:9:1:9 | 15 | IntegerLiteralExpr |
331338
| expressions.swift:1:1:1:9 | { ... } | BraceStmt | expressions.swift:1:1:1:9 | var ... = ... | PatternBindingDecl |

0 commit comments

Comments
 (0)