Skip to content

Commit 9a04bee

Browse files
committed
[ClangImporter] Turn ImportNameVersion into a struct.
...so that we don't have to keep coming back to update it every major release. And also so we can actually put methods on it instead of using free functions. No intended behavior change (yet).
1 parent 90f728a commit 9a04bee

File tree

8 files changed

+142
-146
lines changed

8 files changed

+142
-146
lines changed

include/swift/Basic/STLExtras.h

+18
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,24 @@ inline OutputIterator transform(const Container &C, OutputIterator result,
786786
return std::transform(C.begin(), C.end(), result, op);
787787
}
788788

789+
/// Provides default implementations of !=, <=, >, and >= based on == and <.
790+
template <typename T>
791+
class RelationalOperationsBase {
792+
public:
793+
friend bool operator>(const T &left, const T &right) {
794+
return right < left;
795+
}
796+
friend bool operator>=(const T &left, const T &right) {
797+
return !(left < right);
798+
}
799+
friend bool operator<=(const T &left, const T &right) {
800+
return !(right < left);
801+
}
802+
friend bool operator!=(const T &left, const T &right) {
803+
return !(left == right);
804+
}
805+
};
806+
789807
} // end namespace swift
790808

791809
#endif // SWIFT_BASIC_INTERLEAVE_H

lib/ClangImporter/ClangAdapter.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ clang::SwiftNewtypeAttr *
437437
importer::getSwiftNewtypeAttr(const clang::TypedefNameDecl *decl,
438438
ImportNameVersion version) {
439439
// Newtype was introduced in Swift 3
440-
if (version < ImportNameVersion::Swift3 )
440+
if (version <= ImportNameVersion::swift2())
441441
return nullptr;
442442
return retrieveNewTypeAttr(decl);
443443
}
@@ -448,7 +448,7 @@ clang::TypedefNameDecl *importer::findSwiftNewtype(const clang::NamedDecl *decl,
448448
clang::Sema &clangSema,
449449
ImportNameVersion version) {
450450
// Newtype was introduced in Swift 3
451-
if (version < ImportNameVersion::Swift3 )
451+
if (version <= ImportNameVersion::swift2())
452452
return nullptr;
453453

454454
auto varDecl = dyn_cast<clang::VarDecl>(decl);

lib/ClangImporter/ClangImporter.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -1650,7 +1650,7 @@ ClangImporter::Implementation::Implementation(ASTContext &ctx,
16501650
BridgingHeaderExplicitlyRequested(!opts.BridgingHeader.empty()),
16511651
DisableAdapterModules(opts.DisableAdapterModules),
16521652
IsReadingBridgingPCH(false),
1653-
CurrentVersion(nameVersionFromOptions(ctx.LangOpts)),
1653+
CurrentVersion(ImportNameVersion::fromOptions(ctx.LangOpts)),
16541654
BridgingHeaderLookupTable(new SwiftLookupTable(nullptr)),
16551655
platformAvailability(ctx.LangOpts),
16561656
nameImporter() {}
@@ -3152,10 +3152,8 @@ void ClangImporter::Implementation::lookupValue(
31523152
const clang::NamedDecl *recentClangDecl =
31533153
clangDecl->getMostRecentDecl();
31543154

3155-
forEachImportNameVersionFromCurrent(CurrentVersion,
3156-
[&](ImportNameVersion nameVersion) {
3157-
if (nameVersion == CurrentVersion)
3158-
return;
3155+
CurrentVersion.forEachOtherImportNameVersion(
3156+
[&](ImportNameVersion nameVersion) {
31593157
if (anyMatching)
31603158
return;
31613159

lib/ClangImporter/ImportDecl.cpp

+31-23
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,14 @@ void ClangImporter::Implementation::forEachDistinctName(
351351
llvm::function_ref<bool(ImportedName, ImportNameVersion)> action) {
352352
using ImportNameKey = std::pair<DeclName, EffectiveClangContext>;
353353
SmallVector<ImportNameKey, 8> seenNames;
354-
forEachImportNameVersionFromCurrent(CurrentVersion,
355-
[&](ImportNameVersion nameVersion) {
354+
355+
ImportedName newName = importFullName(decl, CurrentVersion);
356+
ImportNameKey key(newName, newName.getEffectiveContext());
357+
if (action(newName, CurrentVersion))
358+
seenNames.push_back(key);
359+
360+
CurrentVersion.forEachOtherImportNameVersion(
361+
[&](ImportNameVersion nameVersion) {
356362
// Check to see if the name is different.
357363
ImportedName newName = importFullName(decl, nameVersion);
358364
ImportNameKey key(newName, newName.getEffectiveContext());
@@ -1947,7 +1953,7 @@ namespace {
19471953
Optional<ImportedName> &correctSwiftName) {
19481954
ImportNameVersion canonicalVersion = getActiveSwiftVersion();
19491955
if (isa<clang::TypeDecl>(D) || isa<clang::ObjCContainerDecl>(D)) {
1950-
canonicalVersion = ImportNameVersion::ForTypes;
1956+
canonicalVersion = ImportNameVersion::forTypes();
19511957
}
19521958
correctSwiftName = None;
19531959

@@ -2133,36 +2139,38 @@ namespace {
21332139
// If we're importing a global as a member, we need to provide the
21342140
// effective context.
21352141
Impl.printSwiftName(
2136-
correctSwiftName,
2142+
correctSwiftName, getActiveSwiftVersion(),
21372143
/*fullyQualified=*/correctSwiftName.importAsMember(), os);
21382144
}
21392145

2140-
unsigned majorVersion = majorVersionNumberForNameVersion(getVersion());
21412146
DeclAttribute *attr;
2142-
if (isActiveSwiftVersion() || getVersion() == ImportNameVersion::Raw) {
2147+
if (isActiveSwiftVersion() || getVersion() == ImportNameVersion::raw()) {
21432148
// "Raw" is the Objective-C name, which was never available in Swift.
21442149
// Variants within the active version are usually declarations that
21452150
// have been superseded, like the accessors of a property.
21462151
attr = AvailableAttr::createPlatformAgnostic(
21472152
ctx, /*Message*/StringRef(), ctx.AllocateCopy(renamed.str()),
21482153
PlatformAgnosticAvailabilityKind::UnavailableInSwift);
2149-
} else if (getVersion() < getActiveSwiftVersion()) {
2150-
// A Swift 2 name, for example, was obsoleted in Swift 3.
2151-
attr = AvailableAttr::createPlatformAgnostic(
2152-
ctx, /*Message*/StringRef(), ctx.AllocateCopy(renamed.str()),
2153-
PlatformAgnosticAvailabilityKind::SwiftVersionSpecific,
2154-
clang::VersionTuple(majorVersion + 1));
21552154
} else {
2156-
// Future names are introduced in their future version.
2157-
assert(getVersion() > getActiveSwiftVersion());
2158-
attr = new (ctx) AvailableAttr(
2159-
SourceLoc(), SourceRange(), PlatformKind::none,
2160-
/*Message*/StringRef(), ctx.AllocateCopy(renamed.str()),
2161-
/*Introduced*/clang::VersionTuple(majorVersion), SourceRange(),
2162-
/*Deprecated*/clang::VersionTuple(), SourceRange(),
2163-
/*Obsoleted*/clang::VersionTuple(), SourceRange(),
2164-
PlatformAgnosticAvailabilityKind::SwiftVersionSpecific,
2165-
/*Implicit*/false);
2155+
unsigned majorVersion = getVersion().majorVersionNumber();
2156+
if (getVersion() < getActiveSwiftVersion()) {
2157+
// A Swift 2 name, for example, was obsoleted in Swift 3.
2158+
attr = AvailableAttr::createPlatformAgnostic(
2159+
ctx, /*Message*/StringRef(), ctx.AllocateCopy(renamed.str()),
2160+
PlatformAgnosticAvailabilityKind::SwiftVersionSpecific,
2161+
clang::VersionTuple(majorVersion + 1));
2162+
} else {
2163+
// Future names are introduced in their future version.
2164+
assert(getVersion() > getActiveSwiftVersion());
2165+
attr = new (ctx) AvailableAttr(
2166+
SourceLoc(), SourceRange(), PlatformKind::none,
2167+
/*Message*/StringRef(), ctx.AllocateCopy(renamed.str()),
2168+
/*Introduced*/clang::VersionTuple(majorVersion), SourceRange(),
2169+
/*Deprecated*/clang::VersionTuple(), SourceRange(),
2170+
/*Obsoleted*/clang::VersionTuple(), SourceRange(),
2171+
PlatformAgnosticAvailabilityKind::SwiftVersionSpecific,
2172+
/*Implicit*/false);
2173+
}
21662174
}
21672175

21682176
decl->getAttrs().add(attr);
@@ -4854,7 +4862,7 @@ Decl *SwiftDeclConverter::importCompatibilityTypeAlias(
48544862
// we don't care.
48554863
Decl *importedDecl = nullptr;
48564864
if (getVersion() >= getActiveSwiftVersion())
4857-
importedDecl = Impl.importDecl(decl, ImportNameVersion::ForTypes);
4865+
importedDecl = Impl.importDecl(decl, ImportNameVersion::forTypes());
48584866
if (!importedDecl && getVersion() != getActiveSwiftVersion())
48594867
importedDecl = Impl.importDecl(decl, getActiveSwiftVersion());
48604868
auto typeDecl = dyn_cast_or_null<TypeDecl>(importedDecl);

lib/ClangImporter/ImportName.cpp

+12-45
Original file line numberDiff line numberDiff line change
@@ -54,39 +54,6 @@ using namespace importer;
5454
using clang::CompilerInstance;
5555
using clang::CompilerInvocation;
5656

57-
ImportNameVersion
58-
importer::nameVersionFromOptions(const LangOptions &langOpts) {
59-
auto languageVersion = langOpts.EffectiveLanguageVersion;
60-
switch (languageVersion[0]) {
61-
default:
62-
llvm_unreachable("unknown swift language version");
63-
case 1:
64-
case 2:
65-
return ImportNameVersion::Swift2;
66-
case 3:
67-
return ImportNameVersion::Swift3;
68-
// Fixme: Figure out the importing story for 5 instead of falling back to 4.
69-
case 4:
70-
case 5:
71-
return ImportNameVersion::Swift4;
72-
}
73-
}
74-
75-
unsigned importer::majorVersionNumberForNameVersion(ImportNameVersion version) {
76-
switch (version) {
77-
case ImportNameVersion::Raw:
78-
return 0;
79-
case ImportNameVersion::Swift2:
80-
return 2;
81-
case ImportNameVersion::Swift3:
82-
return 3;
83-
case ImportNameVersion::Swift4:
84-
return 4;
85-
}
86-
87-
llvm_unreachable("Unhandled ImportNameVersion in switch.");
88-
}
89-
9057

9158
/// Determine whether the given Clang selector matches the given
9259
/// selector pieces.
@@ -582,25 +549,25 @@ template <typename A>
582549
static bool matchesVersion(A *versionedAttr, ImportNameVersion version) {
583550
clang::VersionTuple attrVersion = versionedAttr->getVersion();
584551
if (attrVersion.empty())
585-
return version == ImportNameVersion::LAST_VERSION;
586-
return attrVersion.getMajor() == majorVersionNumberForNameVersion(version);
552+
return version == ImportNameVersion::maxVersion();
553+
return attrVersion.getMajor() == version.majorVersionNumber();
587554
}
588555

589-
const clang::SwiftNameAttr *
590-
importer::findSwiftNameAttr(const clang::Decl *decl,
591-
ImportNameVersion version) {
556+
557+
static const clang::SwiftNameAttr *
558+
findSwiftNameAttr(const clang::Decl *decl, ImportNameVersion version) {
592559
#ifndef NDEBUG
593560
if (Optional<const clang::Decl *> def = getDefinitionForClangTypeDecl(decl)) {
594561
assert((*def == nullptr || *def == decl) &&
595562
"swift_name should only appear on the definition");
596563
}
597564
#endif
598565

599-
if (version == ImportNameVersion::Raw)
566+
if (version == ImportNameVersion::raw())
600567
return nullptr;
601568

602569
// Handle versioned API notes for Swift 3 and later. This is the common case.
603-
if (version != ImportNameVersion::Swift2) {
570+
if (version != ImportNameVersion::swift2()) {
604571
for (auto *attr : decl->attrs()) {
605572
if (auto *versionedAttr = dyn_cast<clang::SwiftVersionedAttr>(attr)) {
606573
if (!matchesVersion(versionedAttr, version))
@@ -843,7 +810,7 @@ NameImporter::determineEffectiveContext(const clang::NamedDecl *decl,
843810
case EnumKind::Enum:
844811
case EnumKind::Options:
845812
// Enums are mapped to Swift enums, Options to Swift option sets.
846-
if (version != ImportNameVersion::Raw) {
813+
if (version != ImportNameVersion::raw()) {
847814
res = cast<clang::DeclContext>(enumDecl);
848815
break;
849816
}
@@ -960,7 +927,7 @@ static bool shouldBeSwiftPrivate(NameImporter &nameImporter,
960927
switch (nameImporter.getEnumKind(ED)) {
961928
case EnumKind::Enum:
962929
case EnumKind::Options:
963-
if (version != ImportNameVersion::Raw)
930+
if (version != ImportNameVersion::raw())
964931
break;
965932
LLVM_FALLTHROUGH;
966933
case EnumKind::Constants:
@@ -1125,7 +1092,7 @@ bool NameImporter::hasErrorMethodNameCollision(
11251092
static bool suppressFactoryMethodAsInit(const clang::ObjCMethodDecl *method,
11261093
ImportNameVersion version,
11271094
CtorInitializerKind initKind) {
1128-
return (version == ImportNameVersion::Raw || method->isPropertyAccessor()) &&
1095+
return (version == ImportNameVersion::raw() || method->isPropertyAccessor()) &&
11291096
(initKind == CtorInitializerKind::Factory ||
11301097
initKind == CtorInitializerKind::ConvenienceFactory);
11311098
}
@@ -1136,7 +1103,7 @@ ImportedName NameImporter::importNameImpl(const clang::NamedDecl *D,
11361103
ImportedName result;
11371104

11381105
/// Whether we want a Swift 3 or later name
1139-
bool swift3OrLaterName = version >= ImportNameVersion::Swift3;
1106+
bool swift3OrLaterName = version > ImportNameVersion::swift2();
11401107

11411108
// Objective-C categories and extensions don't have names, despite
11421109
// being "named" declarations.
@@ -1516,7 +1483,7 @@ ImportedName NameImporter::importNameImpl(const clang::NamedDecl *D,
15161483

15171484
// Enumeration constants may have common prefixes stripped.
15181485
bool strippedPrefix = false;
1519-
if (version != ImportNameVersion::Raw && isa<clang::EnumConstantDecl>(D)) {
1486+
if (version != ImportNameVersion::raw() && isa<clang::EnumConstantDecl>(D)) {
15201487
auto enumDecl = cast<clang::EnumDecl>(D->getDeclContext());
15211488
auto enumInfo = getEnumInfo(enumDecl);
15221489

0 commit comments

Comments
 (0)