Skip to content

Commit 9f58ba1

Browse files
authored
Merge pull request #9707 from github/redsun82/swift-extraction
Swift: extract more types
2 parents 3a44584 + 41fb55a commit 9f58ba1

File tree

58 files changed

+498
-84
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+498
-84
lines changed

swift/codegen/schema.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,14 @@ DependentMemberType:
9393

9494
DynamicSelfType:
9595
_extends: Type
96+
static_self_type: Type
9697

9798
ErrorType:
9899
_extends: Type
99100

100101
InOutType:
101102
_extends: Type
103+
object_type: Type
102104

103105
LValueType:
104106
_extends: Type
@@ -115,9 +117,11 @@ ProtocolCompositionType:
115117

116118
ExistentialType:
117119
_extends: Type
120+
constraint: Type
118121

119122
ReferenceStorageType:
120123
_extends: Type
124+
referent_type: Type
121125

122126
SilBlockStorageType:
123127
_extends: Type
@@ -239,6 +243,10 @@ WeakStorageType:
239243

240244
ArchetypeType:
241245
_extends: SubstitutableType
246+
name: string
247+
interface_type: Type
248+
superclass: Type?
249+
protocols: ProtocolDecl*
242250

243251
GenericTypeParamType:
244252
_extends: SubstitutableType
@@ -694,6 +702,8 @@ BuiltinIntegerType:
694702

695703
NestedArchetypeType:
696704
_extends: ArchetypeType
705+
parent: ArchetypeType
706+
associated_type_declaration: AssociatedTypeDecl
697707

698708
SequenceArchetypeType:
699709
_extends: ArchetypeType
@@ -706,7 +716,6 @@ OpenedArchetypeType:
706716

707717
PrimaryArchetypeType:
708718
_extends: ArchetypeType
709-
interface_type: GenericTypeParamType
710719

711720
DictionaryType:
712721
_extends: SyntaxSugarType

swift/extractor/visitors/TypeVisitor.cpp

Lines changed: 94 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -121,21 +121,16 @@ void TypeVisitor::visitParenType(swift::ParenType* type) {
121121
dispatcher_.emit(ParenTypesTrap{label, typeLabel});
122122
}
123123

124-
void TypeVisitor::visitUnarySyntaxSugarType(swift::UnarySyntaxSugarType* type) {
125-
auto label = dispatcher_.assignNewLabel(type);
126-
emitUnarySyntaxSugarType(type, label);
124+
codeql::OptionalType TypeVisitor::translateOptionalType(const swift::OptionalType& type) {
125+
codeql::OptionalType entry{dispatcher_.assignNewLabel(type)};
126+
fillUnarySyntaxSugarType(type, entry);
127+
return entry;
127128
}
128129

129-
void TypeVisitor::visitOptionalType(swift::OptionalType* type) {
130-
auto label = dispatcher_.assignNewLabel(type);
131-
dispatcher_.emit(OptionalTypesTrap{label});
132-
emitUnarySyntaxSugarType(type, label);
133-
}
134-
135-
void TypeVisitor::visitArraySliceType(swift::ArraySliceType* type) {
136-
auto label = dispatcher_.assignNewLabel(type);
137-
dispatcher_.emit(ArraySliceTypesTrap{label});
138-
emitUnarySyntaxSugarType(type, label);
130+
codeql::ArraySliceType TypeVisitor::translateArraySliceType(const swift::ArraySliceType& type) {
131+
codeql::ArraySliceType entry{dispatcher_.assignNewLabel(type)};
132+
fillUnarySyntaxSugarType(type, entry);
133+
return entry;
139134
}
140135

141136
void TypeVisitor::visitDictionaryType(swift::DictionaryType* type) {
@@ -166,11 +161,11 @@ void TypeVisitor::visitLValueType(swift::LValueType* type) {
166161
dispatcher_.emit(LValueTypesTrap{label, dispatcher_.fetchLabel(type->getObjectType())});
167162
}
168163

169-
void TypeVisitor::visitPrimaryArchetypeType(swift::PrimaryArchetypeType* type) {
170-
auto label = dispatcher_.assignNewLabel(type);
171-
assert(type->getInterfaceType() && "expect PrimaryArchetypeType to have InterfaceType");
172-
dispatcher_.emit(
173-
PrimaryArchetypeTypesTrap{label, dispatcher_.fetchLabel(type->getInterfaceType())});
164+
codeql::PrimaryArchetypeType TypeVisitor::translatePrimaryArchetypeType(
165+
const swift::PrimaryArchetypeType& type) {
166+
PrimaryArchetypeType entry{dispatcher_.assignNewLabel(type)};
167+
fillArchetypeType(type, entry);
168+
return entry;
174169
}
175170

176171
void TypeVisitor::visitUnboundGenericType(swift::UnboundGenericType* type) {
@@ -184,10 +179,11 @@ void TypeVisitor::visitBoundGenericType(swift::BoundGenericType* type) {
184179
emitBoundGenericType(type, label);
185180
}
186181

187-
void TypeVisitor::emitUnarySyntaxSugarType(const swift::UnarySyntaxSugarType* type,
188-
TrapLabel<UnarySyntaxSugarTypeTag> label) {
189-
assert(type->getBaseType() && "expect UnarySyntaxSugarType to have BaseType");
190-
dispatcher_.emit(UnarySyntaxSugarTypesTrap{label, dispatcher_.fetchLabel(type->getBaseType())});
182+
void TypeVisitor::fillUnarySyntaxSugarType(const swift::UnarySyntaxSugarType& type,
183+
codeql::UnarySyntaxSugarType& entry) {
184+
assert(type.getBaseType() && "expect UnarySyntaxSugarType to have BaseType");
185+
entry.base_type = dispatcher_.fetchLabel(type.getBaseType());
186+
fillType(type, entry);
191187
}
192188

193189
void TypeVisitor::emitAnyFunctionType(const swift::AnyFunctionType* type,
@@ -232,4 +228,80 @@ void TypeVisitor::emitAnyGenericType(swift::AnyGenericType* type,
232228
}
233229
}
234230

231+
codeql::NestedArchetypeType TypeVisitor::translateNestedArchetypeType(
232+
const swift::NestedArchetypeType& type) {
233+
codeql::NestedArchetypeType entry{dispatcher_.assignNewLabel(type)};
234+
entry.parent = dispatcher_.fetchLabel(type.getParent());
235+
entry.associated_type_declaration = dispatcher_.fetchLabel(type.getAssocType());
236+
fillArchetypeType(type, entry);
237+
return entry;
238+
}
239+
240+
void TypeVisitor::fillType(const swift::TypeBase& type, codeql::Type& entry) {
241+
entry.diagnostics_name = type.getString();
242+
entry.canonical_type = dispatcher_.fetchLabel(type.getCanonicalType());
243+
}
244+
245+
void TypeVisitor::fillArchetypeType(const swift::ArchetypeType& type, ArchetypeType& entry) {
246+
entry.interface_type = dispatcher_.fetchLabel(type.getInterfaceType());
247+
entry.name = type.getName().str().str();
248+
entry.protocols = dispatcher_.fetchRepeatedLabels(type.getConformsTo());
249+
entry.superclass = dispatcher_.fetchOptionalLabel(type.getSuperclass());
250+
fillType(type, entry);
251+
}
252+
253+
codeql::ExistentialType TypeVisitor::translateExistentialType(const swift::ExistentialType& type) {
254+
codeql::ExistentialType entry{dispatcher_.assignNewLabel(type)};
255+
entry.constraint = dispatcher_.fetchLabel(type.getConstraintType());
256+
fillType(type, entry);
257+
return entry;
258+
}
259+
260+
codeql::DynamicSelfType TypeVisitor::translateDynamicSelfType(const swift::DynamicSelfType& type) {
261+
codeql::DynamicSelfType entry{dispatcher_.assignNewLabel(type)};
262+
entry.static_self_type = dispatcher_.fetchLabel(type.getSelfType());
263+
fillType(type, entry);
264+
return entry;
265+
}
266+
267+
codeql::VariadicSequenceType TypeVisitor::translateVariadicSequenceType(
268+
const swift::VariadicSequenceType& type) {
269+
codeql::VariadicSequenceType entry{dispatcher_.assignNewLabel(type)};
270+
fillUnarySyntaxSugarType(type, entry);
271+
return entry;
272+
}
273+
274+
codeql::InOutType TypeVisitor::translateInOutType(const swift::InOutType& type) {
275+
codeql::InOutType entry{dispatcher_.assignNewLabel(type)};
276+
entry.object_type = dispatcher_.fetchLabel(type.getObjectType());
277+
fillType(type, entry);
278+
return entry;
279+
}
280+
281+
codeql::UnmanagedStorageType TypeVisitor::translateUnmanagedStorageType(
282+
const swift::UnmanagedStorageType& type) {
283+
codeql::UnmanagedStorageType entry{dispatcher_.assignNewLabel(type)};
284+
fillReferenceStorageType(type, entry);
285+
return entry;
286+
}
287+
288+
codeql::UnownedStorageType TypeVisitor::translateUnownedStorageType(
289+
const swift::UnownedStorageType& type) {
290+
codeql::UnownedStorageType entry{dispatcher_.assignNewLabel(type)};
291+
fillReferenceStorageType(type, entry);
292+
return entry;
293+
}
294+
295+
codeql::WeakStorageType TypeVisitor::translateWeakStorageType(const swift::WeakStorageType& type) {
296+
codeql::WeakStorageType entry{dispatcher_.assignNewLabel(type)};
297+
fillReferenceStorageType(type, entry);
298+
return entry;
299+
}
300+
301+
void TypeVisitor::fillReferenceStorageType(const swift::ReferenceStorageType& type,
302+
codeql::ReferenceStorageType& entry) {
303+
entry.referent_type = dispatcher_.fetchLabel(type.getReferentType());
304+
fillType(type, entry);
305+
}
306+
235307
} // namespace codeql

swift/extractor/visitors/TypeVisitor.h

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,34 @@ class TypeVisitor : public TypeVisitorBase<TypeVisitor> {
2727
void visitDependentMemberType(swift::DependentMemberType* type);
2828
void visitParenType(swift::ParenType* type);
2929
void visitUnarySyntaxSugarType(swift::UnarySyntaxSugarType* type);
30-
void visitOptionalType(swift::OptionalType* type);
31-
void visitArraySliceType(swift::ArraySliceType* type);
30+
codeql::OptionalType translateOptionalType(const swift::OptionalType& type);
31+
codeql::ArraySliceType translateArraySliceType(const swift::ArraySliceType& type);
3232
void visitDictionaryType(swift::DictionaryType* type);
3333
void visitGenericFunctionType(swift::GenericFunctionType* type);
3434
void visitGenericTypeParamType(swift::GenericTypeParamType* type);
3535
void visitLValueType(swift::LValueType* type);
36-
void visitPrimaryArchetypeType(swift::PrimaryArchetypeType* type);
3736
void visitUnboundGenericType(swift::UnboundGenericType* type);
3837
void visitBoundGenericType(swift::BoundGenericType* type);
38+
codeql::PrimaryArchetypeType translatePrimaryArchetypeType(
39+
const swift::PrimaryArchetypeType& type);
40+
codeql::NestedArchetypeType translateNestedArchetypeType(const swift::NestedArchetypeType& type);
41+
codeql::ExistentialType translateExistentialType(const swift::ExistentialType& type);
42+
codeql::DynamicSelfType translateDynamicSelfType(const swift::DynamicSelfType& type);
43+
codeql::VariadicSequenceType translateVariadicSequenceType(
44+
const swift::VariadicSequenceType& type);
45+
codeql::InOutType translateInOutType(const swift::InOutType& type);
46+
codeql::UnmanagedStorageType translateUnmanagedStorageType(
47+
const swift::UnmanagedStorageType& type);
48+
codeql::WeakStorageType translateWeakStorageType(const swift::WeakStorageType& type);
49+
codeql::UnownedStorageType translateUnownedStorageType(const swift::UnownedStorageType& type);
3950

4051
private:
41-
void emitUnarySyntaxSugarType(const swift::UnarySyntaxSugarType* type,
42-
TrapLabel<UnarySyntaxSugarTypeTag> label);
52+
void fillType(const swift::TypeBase& type, codeql::Type& entry);
53+
void fillArchetypeType(const swift::ArchetypeType& type, codeql::ArchetypeType& entry);
54+
void fillUnarySyntaxSugarType(const swift::UnarySyntaxSugarType& type,
55+
codeql::UnarySyntaxSugarType& entry);
56+
void fillReferenceStorageType(const swift::ReferenceStorageType& type,
57+
codeql::ReferenceStorageType& entry);
4358
void emitAnyFunctionType(const swift::AnyFunctionType* type, TrapLabel<AnyFunctionTypeTag> label);
4459
void emitBoundGenericType(swift::BoundGenericType* type, TrapLabel<BoundGenericTypeTag> label);
4560
void emitAnyGenericType(swift::AnyGenericType* type, TrapLabel<AnyGenericTypeTag> label);
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
21
private import codeql.swift.generated.type.ArchetypeType
2+
private import codeql.swift.elements.type.ClassType
33

4-
class ArchetypeType extends ArchetypeTypeBase { }
4+
class ArchetypeType extends ArchetypeTypeBase {
5+
override ClassType getSuperclass() { result = super.getSuperclass() }
6+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
21
private import codeql.swift.generated.type.ExistentialType
2+
private import codeql.swift.elements.type.ProtocolType
33

4-
class ExistentialType extends ExistentialTypeBase { }
4+
class ExistentialType extends ExistentialTypeBase {
5+
override ProtocolType getConstraint() { result = super.getConstraint() }
6+
}
Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,35 @@
11
// generated by codegen/codegen.py
2+
import codeql.swift.elements.decl.ProtocolDecl
23
import codeql.swift.elements.type.SubstitutableType
4+
import codeql.swift.elements.type.Type
35

4-
class ArchetypeTypeBase extends @archetype_type, SubstitutableType { }
6+
class ArchetypeTypeBase extends @archetype_type, SubstitutableType {
7+
string getName() { archetype_types(this, result, _) }
8+
9+
Type getInterfaceType() {
10+
exists(Type x |
11+
archetype_types(this, _, x) and
12+
result = x.resolve()
13+
)
14+
}
15+
16+
Type getSuperclass() {
17+
exists(Type x |
18+
archetype_type_superclasses(this, x) and
19+
result = x.resolve()
20+
)
21+
}
22+
23+
predicate hasSuperclass() { exists(getSuperclass()) }
24+
25+
ProtocolDecl getProtocol(int index) {
26+
exists(ProtocolDecl x |
27+
archetype_type_protocols(this, index, x) and
28+
result = x.resolve()
29+
)
30+
}
31+
32+
ProtocolDecl getAProtocol() { result = getProtocol(_) }
33+
34+
int getNumberOfProtocols() { result = count(getAProtocol()) }
35+
}

swift/ql/lib/codeql/swift/generated/type/DynamicSelfType.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,11 @@ import codeql.swift.elements.type.Type
33

44
class DynamicSelfTypeBase extends @dynamic_self_type, Type {
55
override string getAPrimaryQlClass() { result = "DynamicSelfType" }
6+
7+
Type getStaticSelfType() {
8+
exists(Type x |
9+
dynamic_self_types(this, x) and
10+
result = x.resolve()
11+
)
12+
}
613
}

swift/ql/lib/codeql/swift/generated/type/ExistentialType.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,11 @@ import codeql.swift.elements.type.Type
33

44
class ExistentialTypeBase extends @existential_type, Type {
55
override string getAPrimaryQlClass() { result = "ExistentialType" }
6+
7+
Type getConstraint() {
8+
exists(Type x |
9+
existential_types(this, x) and
10+
result = x.resolve()
11+
)
12+
}
613
}

swift/ql/lib/codeql/swift/generated/type/InOutType.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,11 @@ import codeql.swift.elements.type.Type
33

44
class InOutTypeBase extends @in_out_type, Type {
55
override string getAPrimaryQlClass() { result = "InOutType" }
6+
7+
Type getObjectType() {
8+
exists(Type x |
9+
in_out_types(this, x) and
10+
result = x.resolve()
11+
)
12+
}
613
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
// generated by codegen/codegen.py
22
import codeql.swift.elements.type.ArchetypeType
3+
import codeql.swift.elements.decl.AssociatedTypeDecl
34

45
class NestedArchetypeTypeBase extends @nested_archetype_type, ArchetypeType {
56
override string getAPrimaryQlClass() { result = "NestedArchetypeType" }
7+
8+
ArchetypeType getParent() {
9+
exists(ArchetypeType x |
10+
nested_archetype_types(this, x, _) and
11+
result = x.resolve()
12+
)
13+
}
14+
15+
AssociatedTypeDecl getAssociatedTypeDeclaration() {
16+
exists(AssociatedTypeDecl x |
17+
nested_archetype_types(this, _, x) and
18+
result = x.resolve()
19+
)
20+
}
621
}

0 commit comments

Comments
 (0)