Skip to content

Commit e865c3c

Browse files
committed
Swift: extract parameter packs
1 parent b611e7c commit e865c3c

File tree

79 files changed

+1550
-40
lines changed

Some content is hidden

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

79 files changed

+1550
-40
lines changed

swift/extractor/infra/SwiftTagTraits.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ MAP(swift::Expr, ExprTag)
126126
MAP(swift::AutoClosureExpr, AutoClosureExprTag)
127127
MAP(swift::InOutExpr, InOutExprTag)
128128
MAP(swift::VarargExpansionExpr, VarargExpansionExprTag)
129-
MAP(swift::PackExpansionExpr, void) // TODO (introduced in 5.8)
130-
MAP(swift::PackElementExpr, void) // TODO (introduced in 5.8)
129+
MAP(swift::PackExpansionExpr, PackExpansionExprTag)
130+
MAP(swift::PackElementExpr, PackElementExprTag)
131131
MAP(swift::DynamicTypeExpr, DynamicTypeExprTag)
132132
MAP(swift::RebindSelfInConstructorExpr, RebindSelfInInitializerExprTag)
133133
MAP(swift::OpaqueValueExpr, OpaqueValueExprTag)
@@ -319,10 +319,10 @@ MAP(swift::TypeBase, TypeTag)
319319
MAP(swift::ArchetypeType, ArchetypeTypeTag)
320320
MAP(swift::PrimaryArchetypeType, PrimaryArchetypeTypeTag)
321321
MAP(swift::OpaqueTypeArchetypeType, OpaqueTypeArchetypeTypeTag)
322-
MAP(swift::LocalArchetypeType, OpenedArchetypeTypeTag) // TODO (introduced in 5.8)
322+
MAP(swift::LocalArchetypeType, LocalArchetypeTypeTag)
323323
MAP(swift::OpenedArchetypeType, OpenedArchetypeTypeTag)
324-
MAP(swift::ElementArchetypeType, void) // TODO (introduced in 5.8)
325-
MAP(swift::PackArchetypeType, void) // TODO (introduced in 5.8)
324+
MAP(swift::ElementArchetypeType, ElementArchetypeTypeTag)
325+
MAP(swift::PackArchetypeType, PackArchetypeTypeTag)
326326
MAP(swift::GenericTypeParamType, GenericTypeParamTypeTag)
327327
MAP(swift::DependentMemberType, DependentMemberTypeTag)
328328
MAP(swift::AnyFunctionType, AnyFunctionTypeTag)
@@ -341,11 +341,9 @@ MAP(swift::TypeBase, TypeTag)
341341
MAP(swift::ExistentialType, ExistentialTypeTag)
342342
MAP(swift::LValueType, LValueTypeTag)
343343
MAP(swift::InOutType, InOutTypeTag)
344-
MAP(swift::PackType, void) // experimental variadic generics
345-
MAP(swift::PackExpansionType, void) // experimental variadic generics
346-
#if CODEQL_SWIFT_VERSION_GE(5, 9)
347-
MAP(swift::PackElementType, void) // TODO: (introduced in 5.9)
348-
#endif
344+
MAP(swift::PackType, PackTypeTag)
345+
MAP(swift::PackExpansionType, PackExpansionTypeTag)
346+
MAP(swift::PackElementType, PackElementTypeTag)
349347
MAP(swift::TypeVariableType, void) // created during type checking and only used for constraint checking
350348
MAP(swift::SugarType, SugarTypeTag)
351349
MAP(swift::ParenType, ParenTypeTag)

swift/extractor/mangler/SwiftMangler.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,12 @@ void SwiftMangler::indexExtensions(llvm::ArrayRef<swift::Decl*> siblings) {
138138
}
139139

140140
SwiftMangledName SwiftMangler::visitGenericTypeParamDecl(const swift::GenericTypeParamDecl* decl) {
141-
return visitValueDecl(decl, /*force=*/true) << '_' << decl->getDepth() << '_' << decl->getIndex();
141+
auto ret = visitValueDecl(decl, /*force=*/true);
142+
if (decl->isParameterPack()) {
143+
ret << "each_";
144+
}
145+
ret << '_' << decl->getDepth() << '_' << decl->getIndex();
146+
return ret;
142147
}
143148

144149
SwiftMangledName SwiftMangler::visitAssociatedTypeDecl(const swift::AssociatedTypeDecl* decl) {
@@ -259,6 +264,9 @@ SwiftMangledName SwiftMangler::visitGenericFunctionType(const swift::GenericFunc
259264

260265
SwiftMangledName SwiftMangler::visitGenericTypeParamType(const swift::GenericTypeParamType* type) {
261266
auto ret = initMangled(type);
267+
if (type->isParameterPack()) {
268+
ret << "each_";
269+
}
262270
if (auto decl = type->getDecl()) {
263271
ret << fetch(decl);
264272
} else {
@@ -376,6 +384,33 @@ SwiftMangledName SwiftMangler::visitParametrizedProtocolType(
376384
return ret;
377385
}
378386

387+
SwiftMangledName SwiftMangler::visitPackArchetypeType(const swift::PackArchetypeType* type) {
388+
return visitArchetypeType(type) << "...";
389+
}
390+
391+
SwiftMangledName SwiftMangler::visitPackType(const swift::PackType* type) {
392+
auto ret = initMangled(type);
393+
for (auto element : type->getElementTypes()) {
394+
ret << fetch(element);
395+
}
396+
return ret;
397+
}
398+
399+
SwiftMangledName SwiftMangler::visitPackElementType(const swift::PackElementType* type) {
400+
auto ret = initMangled(type);
401+
ret << fetch(type->getPackType());
402+
ret << '_' << type->getLevel();
403+
return ret;
404+
}
405+
406+
SwiftMangledName SwiftMangler::visitPackExpansionType(const swift::PackExpansionType* type) {
407+
auto ret = initMangled(type);
408+
ret << fetch(type->getPatternType());
409+
ret << '_';
410+
ret << fetch(type->getCountType());
411+
return ret;
412+
}
413+
379414
namespace {
380415
template <typename E>
381416
UntypedTrapLabel fetchLabel(SwiftDispatcher& dispatcher, const E* e) {

swift/extractor/mangler/SwiftMangler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ class SwiftMangler : private swift::TypeVisitor<SwiftMangler, SwiftMangledName>,
100100
SwiftMangledName visitUnboundGenericType(const swift::UnboundGenericType* type);
101101
SwiftMangledName visitReferenceStorageType(const swift::ReferenceStorageType* type);
102102
SwiftMangledName visitParametrizedProtocolType(const swift::ParameterizedProtocolType* type);
103+
SwiftMangledName visitPackArchetypeType(const swift::PackArchetypeType* type);
104+
SwiftMangledName visitPackType(const swift::PackType* type);
105+
SwiftMangledName visitPackElementType(const swift::PackElementType* type);
106+
SwiftMangledName visitPackExpansionType(const swift::PackExpansionType* type);
103107

104108
private:
105109
std::unordered_map<const swift::Decl*, unsigned> preloadedExtensionIndexes;

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,4 +643,18 @@ codeql::SingleValueStmtExpr ExprTranslator::translateSingleValueStmtExpr(
643643
return entry;
644644
}
645645

646+
codeql::PackExpansionExpr ExprTranslator::translatePackExpansionExpr(
647+
const swift::PackExpansionExpr& expr) {
648+
auto entry = createExprEntry(expr);
649+
entry.pattern_expr = dispatcher.fetchLabel(expr.getPatternExpr());
650+
return entry;
651+
}
652+
653+
codeql::PackElementExpr ExprTranslator::translatePackElementExpr(
654+
const swift::PackElementExpr& expr) {
655+
auto entry = createExprEntry(expr);
656+
entry.sub_expr = dispatcher.fetchLabel(expr.getPackRefExpr());
657+
return entry;
658+
}
659+
646660
} // namespace codeql

swift/extractor/translators/ExprTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
120120
const swift::AppliedPropertyWrapperExpr& expr);
121121
codeql::RegexLiteralExpr translateRegexLiteralExpr(const swift::RegexLiteralExpr& expr);
122122
codeql::SingleValueStmtExpr translateSingleValueStmtExpr(const swift::SingleValueStmtExpr& expr);
123+
codeql::PackExpansionExpr translatePackExpansionExpr(const swift::PackExpansionExpr& expr);
124+
codeql::PackElementExpr translatePackElementExpr(const swift::PackElementExpr& expr);
123125

124126
private:
125127
void fillClosureExpr(const swift::AbstractClosureExpr& expr, codeql::ClosureExpr& entry);

swift/extractor/translators/TypeTranslator.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,40 @@ codeql::ParameterizedProtocolType TypeTranslator::translateParameterizedProtocol
267267
entry.args = dispatcher.fetchRepeatedLabels(type.getArgs());
268268
return entry;
269269
}
270+
271+
codeql::PackArchetypeType TypeTranslator::translatePackArchetypeType(
272+
const swift::PackArchetypeType& type) {
273+
auto entry = createTypeEntry(type);
274+
fillArchetypeType(type, entry);
275+
return entry;
276+
}
277+
278+
codeql::ElementArchetypeType TypeTranslator::translateElementArchetypeType(
279+
const swift::ElementArchetypeType& type) {
280+
auto entry = createTypeEntry(type);
281+
fillArchetypeType(type, entry);
282+
return entry;
283+
}
284+
285+
codeql::PackType TypeTranslator::translatePackType(const swift::PackType& type) {
286+
auto entry = createTypeEntry(type);
287+
entry.elements = dispatcher.fetchRepeatedLabels(type.getElementTypes());
288+
return entry;
289+
}
290+
291+
codeql::PackElementType TypeTranslator::translatePackElementType(
292+
const swift::PackElementType& type) {
293+
auto entry = createTypeEntry(type);
294+
entry.pack_type = dispatcher.fetchLabel(type.getPackType());
295+
return entry;
296+
}
297+
298+
codeql::PackExpansionType TypeTranslator::translatePackExpansionType(
299+
const swift::PackExpansionType& type) {
300+
auto entry = createTypeEntry(type);
301+
entry.pattern_type = dispatcher.fetchLabel(type.getPatternType());
302+
entry.count_type = dispatcher.fetchLabel(type.getCountType());
303+
return entry;
304+
}
305+
270306
} // namespace codeql

swift/extractor/translators/TypeTranslator.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ class TypeTranslator : public TypeTranslatorBase<TypeTranslator> {
7777
codeql::UnresolvedType translateUnresolvedType(const swift::UnresolvedType& type);
7878
codeql::ParameterizedProtocolType translateParameterizedProtocolType(
7979
const swift::ParameterizedProtocolType& type);
80+
codeql::PackArchetypeType translatePackArchetypeType(const swift::PackArchetypeType& type);
81+
codeql::ElementArchetypeType translateElementArchetypeType(
82+
const swift::ElementArchetypeType& type);
83+
codeql::PackType translatePackType(const swift::PackType& type);
84+
codeql::PackElementType translatePackElementType(const swift::PackElementType& type);
85+
codeql::PackExpansionType translatePackExpansionType(const swift::PackExpansionType& type);
8086

8187
private:
8288
void fillType(const swift::TypeBase& type, codeql::Type& entry);

0 commit comments

Comments
 (0)