Skip to content

Commit 50d9a2e

Browse files
committed
Swift: rollback removal of std::variant
It turns out we are still missing some extractions. This will be fixed with future work.
1 parent 2fc88d5 commit 50d9a2e

File tree

2 files changed

+103
-83
lines changed

2 files changed

+103
-83
lines changed

swift/extractor/visitors/DeclVisitor.cpp

Lines changed: 72 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -22,31 +22,31 @@ std::string constructName(const swift::DeclName& declName) {
2222
}
2323
} // namespace
2424

25-
std::optional<codeql::ConcreteFuncDecl> DeclVisitor::translateFuncDecl(
26-
const swift::FuncDecl& decl) {
27-
if (auto entry = createNamedEntry(decl)) {
25+
std::variant<codeql::ConcreteFuncDecl, codeql::ConcreteFuncDeclsTrap>
26+
DeclVisitor::translateFuncDecl(const swift::FuncDecl& decl) {
27+
auto ret = createNamedEntryOr<ConcreteFuncDeclsTrap>(decl);
28+
if (auto entry = get_if<ConcreteFuncDecl>(&ret)) {
2829
fillAbstractFunctionDecl(decl, *entry);
29-
return entry;
3030
}
31-
return std::nullopt;
31+
return ret;
3232
}
3333

34-
std::optional<codeql::ConstructorDecl> DeclVisitor::translateConstructorDecl(
35-
const swift::ConstructorDecl& decl) {
36-
if (auto entry = createNamedEntry(decl)) {
34+
std::variant<codeql::ConstructorDecl, codeql::ConstructorDeclsTrap>
35+
DeclVisitor::translateConstructorDecl(const swift::ConstructorDecl& decl) {
36+
auto ret = createNamedEntryOr<ConstructorDeclsTrap>(decl);
37+
if (auto entry = get_if<ConstructorDecl>(&ret)) {
3738
fillAbstractFunctionDecl(decl, *entry);
38-
return entry;
3939
}
40-
return std::nullopt;
40+
return ret;
4141
}
4242

43-
std::optional<codeql::DestructorDecl> DeclVisitor::translateDestructorDecl(
44-
const swift::DestructorDecl& decl) {
45-
if (auto entry = createNamedEntry(decl)) {
43+
std::variant<codeql::DestructorDecl, codeql::DestructorDeclsTrap>
44+
DeclVisitor::translateDestructorDecl(const swift::DestructorDecl& decl) {
45+
auto ret = createNamedEntryOr<DestructorDeclsTrap>(decl);
46+
if (auto entry = get_if<DestructorDecl>(&ret)) {
4647
fillAbstractFunctionDecl(decl, *entry);
47-
return entry;
4848
}
49-
return std::nullopt;
49+
return ret;
5050
}
5151

5252
codeql::PrefixOperatorDecl DeclVisitor::translatePrefixOperatorDecl(
@@ -124,37 +124,40 @@ std::optional<codeql::ConcreteVarDecl> DeclVisitor::translateVarDecl(const swift
124124
return entry;
125125
}
126126

127-
std::optional<codeql::StructDecl> DeclVisitor::translateStructDecl(const swift::StructDecl& decl) {
128-
if (auto entry = createNamedEntry(decl)) {
127+
std::variant<codeql::StructDecl, codeql::StructDeclsTrap> DeclVisitor::translateStructDecl(
128+
const swift::StructDecl& decl) {
129+
auto ret = createNamedEntryOr<StructDeclsTrap>(decl);
130+
if (auto entry = get_if<StructDecl>(&ret)) {
129131
fillNominalTypeDecl(decl, *entry);
130-
return entry;
131132
}
132-
return std::nullopt;
133+
return ret;
133134
}
134135

135-
std::optional<codeql::ClassDecl> DeclVisitor::translateClassDecl(const swift::ClassDecl& decl) {
136-
if (auto entry = createNamedEntry(decl)) {
136+
std::variant<codeql::ClassDecl, codeql::ClassDeclsTrap> DeclVisitor::translateClassDecl(
137+
const swift::ClassDecl& decl) {
138+
auto ret = createNamedEntryOr<ClassDeclsTrap>(decl);
139+
if (auto entry = get_if<ClassDecl>(&ret)) {
137140
fillNominalTypeDecl(decl, *entry);
138-
return entry;
139141
}
140-
return std::nullopt;
142+
return ret;
141143
}
142144

143-
std::optional<codeql::EnumDecl> DeclVisitor::translateEnumDecl(const swift::EnumDecl& decl) {
144-
if (auto entry = createNamedEntry(decl)) {
145+
std::variant<codeql::EnumDecl, codeql::EnumDeclsTrap> DeclVisitor::translateEnumDecl(
146+
const swift::EnumDecl& decl) {
147+
auto ret = createNamedEntryOr<EnumDeclsTrap>(decl);
148+
if (auto entry = get_if<EnumDecl>(&ret)) {
145149
fillNominalTypeDecl(decl, *entry);
146-
return entry;
147150
}
148-
return std::nullopt;
151+
return ret;
149152
}
150153

151-
std::optional<codeql::ProtocolDecl> DeclVisitor::translateProtocolDecl(
154+
std::variant<codeql::ProtocolDecl, codeql::ProtocolDeclsTrap> DeclVisitor::translateProtocolDecl(
152155
const swift::ProtocolDecl& decl) {
153-
if (auto entry = createNamedEntry(decl)) {
156+
auto ret = createNamedEntryOr<ProtocolDeclsTrap>(decl);
157+
if (auto entry = get_if<ProtocolDecl>(&ret)) {
154158
fillNominalTypeDecl(decl, *entry);
155-
return entry;
156159
}
157-
return std::nullopt;
160+
return ret;
158161
}
159162

160163
codeql::EnumCaseDecl DeclVisitor::translateEnumCaseDecl(const swift::EnumCaseDecl& decl) {
@@ -163,18 +166,17 @@ codeql::EnumCaseDecl DeclVisitor::translateEnumCaseDecl(const swift::EnumCaseDec
163166
return entry;
164167
}
165168

166-
std::optional<codeql::EnumElementDecl> DeclVisitor::translateEnumElementDecl(
167-
const swift::EnumElementDecl& decl) {
168-
auto entry = createNamedEntry(decl);
169-
if (!entry) {
170-
return std::nullopt;
171-
}
172-
entry->name = decl.getNameStr().str();
173-
if (decl.hasParameterList()) {
174-
entry->params = dispatcher_.fetchRepeatedLabels(*decl.getParameterList());
169+
std::variant<codeql::EnumElementDecl, codeql::EnumElementDeclsTrap>
170+
DeclVisitor::translateEnumElementDecl(const swift::EnumElementDecl& decl) {
171+
auto ret = createNamedEntryOr<EnumElementDeclsTrap>(decl);
172+
std::visit([&](auto& entry) { entry.name = decl.getNameStr().str(); }, ret);
173+
if (auto entry = get_if<EnumElementDecl>(&ret)) {
174+
if (decl.hasParameterList()) {
175+
entry->params = dispatcher_.fetchRepeatedLabels(*decl.getParameterList());
176+
}
177+
fillValueDecl(decl, *entry);
175178
}
176-
fillValueDecl(decl, *entry);
177-
return entry;
179+
return ret;
178180
}
179181

180182
codeql::GenericTypeParamDecl DeclVisitor::translateGenericTypeParamDecl(
@@ -185,46 +187,45 @@ codeql::GenericTypeParamDecl DeclVisitor::translateGenericTypeParamDecl(
185187
return entry;
186188
}
187189

188-
std::optional<codeql::AssociatedTypeDecl> DeclVisitor::translateAssociatedTypeDecl(
189-
const swift::AssociatedTypeDecl& decl) {
190-
if (auto entry = createNamedEntry(decl)) {
190+
std::variant<codeql::AssociatedTypeDecl, codeql::AssociatedTypeDeclsTrap>
191+
DeclVisitor::translateAssociatedTypeDecl(const swift::AssociatedTypeDecl& decl) {
192+
auto ret = createNamedEntryOr<AssociatedTypeDeclsTrap>(decl);
193+
if (auto entry = get_if<AssociatedTypeDecl>(&ret)) {
191194
fillTypeDecl(decl, *entry);
192-
return entry;
193195
}
194-
return std::nullopt;
196+
return ret;
195197
}
196198

197-
std::optional<codeql::TypeAliasDecl> DeclVisitor::translateTypeAliasDecl(
199+
std::variant<codeql::TypeAliasDecl, codeql::TypeAliasDeclsTrap> DeclVisitor::translateTypeAliasDecl(
198200
const swift::TypeAliasDecl& decl) {
199-
if (auto entry = createNamedEntry(decl)) {
201+
auto ret = createNamedEntryOr<TypeAliasDeclsTrap>(decl);
202+
if (auto entry = get_if<TypeAliasDecl>(&ret)) {
200203
fillTypeDecl(decl, *entry);
201-
return entry;
202204
}
203-
return std::nullopt;
205+
return ret;
204206
}
205207

206-
std::optional<codeql::AccessorDecl> DeclVisitor::translateAccessorDecl(
208+
std::variant<codeql::AccessorDecl, codeql::AccessorDeclsTrap> DeclVisitor::translateAccessorDecl(
207209
const swift::AccessorDecl& decl) {
208-
auto entry = createNamedEntry(decl);
209-
if (!entry) {
210-
return std::nullopt;
211-
}
212-
switch (decl.getAccessorKind()) {
213-
case swift::AccessorKind::Get:
214-
entry->is_getter = true;
215-
break;
216-
case swift::AccessorKind::Set:
217-
entry->is_setter = true;
218-
break;
219-
case swift::AccessorKind::WillSet:
220-
entry->is_will_set = true;
221-
break;
222-
case swift::AccessorKind::DidSet:
223-
entry->is_did_set = true;
224-
break;
210+
auto ret = createNamedEntryOr<AccessorDeclsTrap>(decl);
211+
if (auto entry = get_if<AccessorDecl>(&ret)) {
212+
switch (decl.getAccessorKind()) {
213+
case swift::AccessorKind::Get:
214+
entry->is_getter = true;
215+
break;
216+
case swift::AccessorKind::Set:
217+
entry->is_setter = true;
218+
break;
219+
case swift::AccessorKind::WillSet:
220+
entry->is_will_set = true;
221+
break;
222+
case swift::AccessorKind::DidSet:
223+
entry->is_did_set = true;
224+
break;
225+
}
226+
fillAbstractFunctionDecl(decl, *entry);
225227
}
226-
fillAbstractFunctionDecl(decl, *entry);
227-
return entry;
228+
return ret;
228229
}
229230

230231
std::optional<codeql::SubscriptDecl> DeclVisitor::translateSubscriptDecl(

swift/extractor/visitors/DeclVisitor.h

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
2020
dispatcher_.emit(translateIfConfigClause(*clause));
2121
}
2222

23-
std::optional<codeql::ConcreteFuncDecl> translateFuncDecl(const swift::FuncDecl& decl);
24-
std::optional<codeql::ConstructorDecl> translateConstructorDecl(
23+
std::variant<codeql::ConcreteFuncDecl, codeql::ConcreteFuncDeclsTrap> translateFuncDecl(
24+
const swift::FuncDecl& decl);
25+
std::variant<codeql::ConstructorDecl, codeql::ConstructorDeclsTrap> translateConstructorDecl(
2526
const swift::ConstructorDecl& decl);
26-
std::optional<codeql::DestructorDecl> translateDestructorDecl(const swift::DestructorDecl& decl);
27+
std::variant<codeql::DestructorDecl, codeql::DestructorDeclsTrap> translateDestructorDecl(
28+
const swift::DestructorDecl& decl);
2729
codeql::PrefixOperatorDecl translatePrefixOperatorDecl(const swift::PrefixOperatorDecl& decl);
2830
codeql::PostfixOperatorDecl translatePostfixOperatorDecl(const swift::PostfixOperatorDecl& decl);
2931
codeql::InfixOperatorDecl translateInfixOperatorDecl(const swift::InfixOperatorDecl& decl);
@@ -32,19 +34,25 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
3234
codeql::TopLevelCodeDecl translateTopLevelCodeDecl(const swift::TopLevelCodeDecl& decl);
3335
codeql::PatternBindingDecl translatePatternBindingDecl(const swift::PatternBindingDecl& decl);
3436
std::optional<codeql::ConcreteVarDecl> translateVarDecl(const swift::VarDecl& decl);
35-
std::optional<codeql::StructDecl> translateStructDecl(const swift::StructDecl& decl);
36-
std::optional<codeql::ClassDecl> translateClassDecl(const swift::ClassDecl& decl);
37-
std::optional<codeql::EnumDecl> translateEnumDecl(const swift::EnumDecl& decl);
38-
std::optional<codeql::ProtocolDecl> translateProtocolDecl(const swift::ProtocolDecl& decl);
37+
std::variant<codeql::StructDecl, codeql::StructDeclsTrap> translateStructDecl(
38+
const swift::StructDecl& decl);
39+
std::variant<codeql::ClassDecl, codeql::ClassDeclsTrap> translateClassDecl(
40+
const swift::ClassDecl& decl);
41+
std::variant<codeql::EnumDecl, codeql::EnumDeclsTrap> translateEnumDecl(
42+
const swift::EnumDecl& decl);
43+
std::variant<codeql::ProtocolDecl, codeql::ProtocolDeclsTrap> translateProtocolDecl(
44+
const swift::ProtocolDecl& decl);
3945
codeql::EnumCaseDecl translateEnumCaseDecl(const swift::EnumCaseDecl& decl);
40-
std::optional<codeql::EnumElementDecl> translateEnumElementDecl(
46+
std::variant<codeql::EnumElementDecl, codeql::EnumElementDeclsTrap> translateEnumElementDecl(
4147
const swift::EnumElementDecl& decl);
4248
codeql::GenericTypeParamDecl translateGenericTypeParamDecl(
4349
const swift::GenericTypeParamDecl& decl);
44-
std::optional<codeql::AssociatedTypeDecl> translateAssociatedTypeDecl(
45-
const swift::AssociatedTypeDecl& decl);
46-
std::optional<codeql::TypeAliasDecl> translateTypeAliasDecl(const swift::TypeAliasDecl& decl);
47-
std::optional<codeql::AccessorDecl> translateAccessorDecl(const swift::AccessorDecl& decl);
50+
std::variant<codeql::AssociatedTypeDecl, codeql::AssociatedTypeDeclsTrap>
51+
translateAssociatedTypeDecl(const swift::AssociatedTypeDecl& decl);
52+
std::variant<codeql::TypeAliasDecl, codeql::TypeAliasDeclsTrap> translateTypeAliasDecl(
53+
const swift::TypeAliasDecl& decl);
54+
std::variant<codeql::AccessorDecl, codeql::AccessorDeclsTrap> translateAccessorDecl(
55+
const swift::AccessorDecl& decl);
4856
std::optional<codeql::SubscriptDecl> translateSubscriptDecl(const swift::SubscriptDecl& decl);
4957
codeql::ExtensionDecl translateExtensionDecl(const swift::ExtensionDecl& decl);
5058
codeql::ImportDecl translateImportDecl(const swift::ImportDecl& decl);
@@ -78,6 +86,17 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
7886
return entry;
7987
}
8088

89+
template <typename T, typename D, typename... Args>
90+
std::variant<TrapClassOf<D>, T> createNamedEntryOr(const D& decl) {
91+
auto id = dispatcher_.assignNewLabel(decl, mangledName(decl));
92+
if (dispatcher_.shouldEmitDeclBody(decl)) {
93+
TrapClassOf<D> entry{id};
94+
fillDecl(decl, entry);
95+
return entry;
96+
}
97+
return T{id};
98+
}
99+
81100
template <typename D>
82101
TrapClassOf<D> createEntry(const D& decl) {
83102
TrapClassOf<D> entry{dispatcher_.template assignNewLabel(decl)};

0 commit comments

Comments
 (0)