Skip to content

Commit 606b9e6

Browse files
committed
Revert "Swift: rollback removal of std::variant"
This reverts commit 50d9a2e.
1 parent d9c0780 commit 606b9e6

File tree

2 files changed

+83
-103
lines changed

2 files changed

+83
-103
lines changed

swift/extractor/visitors/DeclVisitor.cpp

Lines changed: 71 additions & 72 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::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)) {
25+
std::optional<codeql::ConcreteFuncDecl> DeclVisitor::translateFuncDecl(
26+
const swift::FuncDecl& decl) {
27+
if (auto entry = createNamedEntry(decl)) {
2928
fillAbstractFunctionDecl(decl, *entry);
29+
return entry;
3030
}
31-
return ret;
31+
return std::nullopt;
3232
}
3333

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)) {
34+
std::optional<codeql::ConstructorDecl> DeclVisitor::translateConstructorDecl(
35+
const swift::ConstructorDecl& decl) {
36+
if (auto entry = createNamedEntry(decl)) {
3837
fillAbstractFunctionDecl(decl, *entry);
38+
return entry;
3939
}
40-
return ret;
40+
return std::nullopt;
4141
}
4242

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)) {
43+
std::optional<codeql::DestructorDecl> DeclVisitor::translateDestructorDecl(
44+
const swift::DestructorDecl& decl) {
45+
if (auto entry = createNamedEntry(decl)) {
4746
fillAbstractFunctionDecl(decl, *entry);
47+
return entry;
4848
}
49-
return ret;
49+
return std::nullopt;
5050
}
5151

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

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)) {
127+
std::optional<codeql::StructDecl> DeclVisitor::translateStructDecl(const swift::StructDecl& decl) {
128+
if (auto entry = createNamedEntry(decl)) {
131129
fillNominalTypeDecl(decl, *entry);
130+
return entry;
132131
}
133-
return ret;
132+
return std::nullopt;
134133
}
135134

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)) {
135+
std::optional<codeql::ClassDecl> DeclVisitor::translateClassDecl(const swift::ClassDecl& decl) {
136+
if (auto entry = createNamedEntry(decl)) {
140137
fillNominalTypeDecl(decl, *entry);
138+
return entry;
141139
}
142-
return ret;
140+
return std::nullopt;
143141
}
144142

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)) {
143+
std::optional<codeql::EnumDecl> DeclVisitor::translateEnumDecl(const swift::EnumDecl& decl) {
144+
if (auto entry = createNamedEntry(decl)) {
149145
fillNominalTypeDecl(decl, *entry);
146+
return entry;
150147
}
151-
return ret;
148+
return std::nullopt;
152149
}
153150

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

163160
codeql::EnumCaseDecl DeclVisitor::translateEnumCaseDecl(const swift::EnumCaseDecl& decl) {
@@ -166,17 +163,18 @@ codeql::EnumCaseDecl DeclVisitor::translateEnumCaseDecl(const swift::EnumCaseDec
166163
return entry;
167164
}
168165

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);
166+
std::optional<codeql::EnumElementDecl> DeclVisitor::translateEnumElementDecl(
167+
const swift::EnumElementDecl& decl) {
168+
auto entry = createNamedEntry(decl);
169+
if (!entry) {
170+
return std::nullopt;
178171
}
179-
return ret;
172+
entry->name = decl.getNameStr().str();
173+
if (decl.hasParameterList()) {
174+
entry->params = dispatcher_.fetchRepeatedLabels(*decl.getParameterList());
175+
}
176+
fillValueDecl(decl, *entry);
177+
return entry;
180178
}
181179

182180
codeql::GenericTypeParamDecl DeclVisitor::translateGenericTypeParamDecl(
@@ -187,45 +185,46 @@ codeql::GenericTypeParamDecl DeclVisitor::translateGenericTypeParamDecl(
187185
return entry;
188186
}
189187

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)) {
188+
std::optional<codeql::AssociatedTypeDecl> DeclVisitor::translateAssociatedTypeDecl(
189+
const swift::AssociatedTypeDecl& decl) {
190+
if (auto entry = createNamedEntry(decl)) {
194191
fillTypeDecl(decl, *entry);
192+
return entry;
195193
}
196-
return ret;
194+
return std::nullopt;
197195
}
198196

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

208-
std::variant<codeql::AccessorDecl, codeql::AccessorDeclsTrap> DeclVisitor::translateAccessorDecl(
206+
std::optional<codeql::AccessorDecl> DeclVisitor::translateAccessorDecl(
209207
const swift::AccessorDecl& decl) {
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);
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;
227225
}
228-
return ret;
226+
fillAbstractFunctionDecl(decl, *entry);
227+
return entry;
229228
}
230229

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

swift/extractor/visitors/DeclVisitor.h

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

23-
std::variant<codeql::ConcreteFuncDecl, codeql::ConcreteFuncDeclsTrap> translateFuncDecl(
24-
const swift::FuncDecl& decl);
25-
std::variant<codeql::ConstructorDecl, codeql::ConstructorDeclsTrap> translateConstructorDecl(
23+
std::optional<codeql::ConcreteFuncDecl> translateFuncDecl(const swift::FuncDecl& decl);
24+
std::optional<codeql::ConstructorDecl> translateConstructorDecl(
2625
const swift::ConstructorDecl& decl);
27-
std::variant<codeql::DestructorDecl, codeql::DestructorDeclsTrap> translateDestructorDecl(
28-
const swift::DestructorDecl& decl);
26+
std::optional<codeql::DestructorDecl> translateDestructorDecl(const swift::DestructorDecl& decl);
2927
codeql::PrefixOperatorDecl translatePrefixOperatorDecl(const swift::PrefixOperatorDecl& decl);
3028
codeql::PostfixOperatorDecl translatePostfixOperatorDecl(const swift::PostfixOperatorDecl& decl);
3129
codeql::InfixOperatorDecl translateInfixOperatorDecl(const swift::InfixOperatorDecl& decl);
@@ -34,25 +32,19 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
3432
codeql::TopLevelCodeDecl translateTopLevelCodeDecl(const swift::TopLevelCodeDecl& decl);
3533
codeql::PatternBindingDecl translatePatternBindingDecl(const swift::PatternBindingDecl& decl);
3634
std::optional<codeql::ConcreteVarDecl> translateVarDecl(const swift::VarDecl& 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);
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);
4539
codeql::EnumCaseDecl translateEnumCaseDecl(const swift::EnumCaseDecl& decl);
46-
std::variant<codeql::EnumElementDecl, codeql::EnumElementDeclsTrap> translateEnumElementDecl(
40+
std::optional<codeql::EnumElementDecl> translateEnumElementDecl(
4741
const swift::EnumElementDecl& decl);
4842
codeql::GenericTypeParamDecl translateGenericTypeParamDecl(
4943
const swift::GenericTypeParamDecl& 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);
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);
5648
std::optional<codeql::SubscriptDecl> translateSubscriptDecl(const swift::SubscriptDecl& decl);
5749
codeql::ExtensionDecl translateExtensionDecl(const swift::ExtensionDecl& decl);
5850
codeql::ImportDecl translateImportDecl(const swift::ImportDecl& decl);
@@ -86,17 +78,6 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
8678
return entry;
8779
}
8880

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-
10081
template <typename D>
10182
TrapClassOf<D> createEntry(const D& decl) {
10283
TrapClassOf<D> entry{dispatcher_.template assignNewLabel(decl)};

0 commit comments

Comments
 (0)