Skip to content

Commit 82fa362

Browse files
authored
Merge pull request #11867 from jrose-apple/ClangImporter-episode-V
[ClangImporter] Support Swift 5 API notes
2 parents ef7c951 + a0117b0 commit 82fa362

File tree

13 files changed

+724
-239
lines changed

13 files changed

+724
-239
lines changed

include/swift/Basic/STLExtras.h

Lines changed: 18 additions & 0 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 15 additions & 14 deletions
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() {}
@@ -2508,32 +2508,34 @@ ClangModuleUnit::lookupNestedType(Identifier name,
25082508

25092509
bool anyMatching = false;
25102510
TypeDecl *originalDecl = nullptr;
2511-
owner.forEachDistinctName(clangTypeDecl, [&](ImportedName newName,
2512-
ImportNameVersion nameVersion){
2511+
owner.forEachDistinctName(clangTypeDecl,
2512+
[&](ImportedName newName,
2513+
ImportNameVersion nameVersion) -> bool {
25132514
if (anyMatching)
2514-
return;
2515+
return true;
25152516
if (!newName.getDeclName().isSimpleName(name))
2516-
return;
2517+
return true;
25172518

25182519
auto decl = dyn_cast_or_null<TypeDecl>(
25192520
owner.importDeclReal(clangTypeDecl, nameVersion));
25202521
if (!decl)
2521-
return;
2522+
return false;
25222523

25232524
if (!originalDecl)
25242525
originalDecl = decl;
25252526
else if (originalDecl == decl)
2526-
return;
2527+
return true;
25272528

25282529
auto *importedContext = decl->getDeclContext()->
25292530
getAsNominalTypeOrNominalTypeExtensionContext();
25302531
if (importedContext != baseType)
2531-
return;
2532+
return true;
25322533

25332534
assert(decl->getFullName().matchesRef(name) &&
25342535
"importFullName behaved differently from importDecl");
25352536
results.push_back(decl);
25362537
anyMatching = true;
2538+
return true;
25372539
});
25382540
}
25392541

@@ -3150,10 +3152,8 @@ void ClangImporter::Implementation::lookupValue(
31503152
const clang::NamedDecl *recentClangDecl =
31513153
clangDecl->getMostRecentDecl();
31523154

3153-
forEachImportNameVersionFromCurrent(CurrentVersion,
3154-
[&](ImportNameVersion nameVersion) {
3155-
if (nameVersion == CurrentVersion)
3156-
return;
3155+
CurrentVersion.forEachOtherImportNameVersion(
3156+
[&](ImportNameVersion nameVersion) {
31573157
if (anyMatching)
31583158
return;
31593159

@@ -3211,12 +3211,12 @@ void ClangImporter::Implementation::lookupObjCMembers(
32113211

32123212
forEachDistinctName(clangDecl,
32133213
[&](ImportedName importedName,
3214-
ImportNameVersion nameVersion) {
3214+
ImportNameVersion nameVersion) -> bool {
32153215
// Import the declaration.
32163216
auto decl =
32173217
cast_or_null<ValueDecl>(importDeclReal(clangDecl, nameVersion));
32183218
if (!decl)
3219-
return;
3219+
return false;
32203220

32213221
// If the name we found matches, report the declaration.
32223222
// FIXME: If we didn't need to check alternate decls here, we could avoid
@@ -3232,6 +3232,7 @@ void ClangImporter::Implementation::lookupObjCMembers(
32323232
consumer.foundDecl(alternate, DeclVisibilityKind::DynamicLookup);
32333233
}
32343234
}
3235+
return true;
32353236
});
32363237
}
32373238
}

0 commit comments

Comments
 (0)