diff --git a/include/clang/APINotes/Types.h b/include/clang/APINotes/Types.h index 11a1e7acf54..5d5a3473363 100644 --- a/include/clang/APINotes/Types.h +++ b/include/clang/APINotes/Types.h @@ -129,24 +129,33 @@ class CommonTypeInfo : public CommonEntityInfo { /// Reflects the swift_bridge attribute. std::string SwiftBridge; + /// The NS error domain for this type. + std::string NSErrorDomain; + public: CommonTypeInfo() : CommonEntityInfo() { } const std::string &getSwiftBridge() const { return SwiftBridge; } void setSwiftBridge(const std::string &swiftType) { SwiftBridge = swiftType; } + const std::string &getNSErrorDomain() const { return NSErrorDomain; } + void setNSErrorDomain(const std::string &domain) { NSErrorDomain = domain; } + friend CommonTypeInfo &operator|=(CommonTypeInfo &lhs, const CommonTypeInfo &rhs) { static_cast(lhs) |= rhs; if (lhs.SwiftBridge.empty() && !rhs.SwiftBridge.empty()) lhs.SwiftBridge = rhs.SwiftBridge; + if (lhs.NSErrorDomain.empty() && !rhs.NSErrorDomain.empty()) + lhs.NSErrorDomain = rhs.NSErrorDomain; return lhs; } friend bool operator==(const CommonTypeInfo &lhs, const CommonTypeInfo &rhs) { return static_cast(lhs) == rhs && - lhs.SwiftBridge == rhs.SwiftBridge; + lhs.SwiftBridge == rhs.SwiftBridge && + lhs.NSErrorDomain == rhs.NSErrorDomain; } friend bool operator!=(const CommonTypeInfo &lhs, diff --git a/lib/APINotes/APINotesReader.cpp b/lib/APINotes/APINotesReader.cpp index 44c628b8f28..297004e4ddc 100644 --- a/lib/APINotes/APINotesReader.cpp +++ b/lib/APINotes/APINotesReader.cpp @@ -58,6 +58,12 @@ namespace { info.setSwiftBridge( StringRef(reinterpret_cast(data), swiftBridgeLength)); data += swiftBridgeLength; + + unsigned errorDomainLength = + endian::readNext(data); + info.setNSErrorDomain( + StringRef(reinterpret_cast(data), errorDomainLength)); + data += errorDomainLength; } /// Used to deserialize the on-disk identifier table. diff --git a/lib/APINotes/APINotesWriter.cpp b/lib/APINotes/APINotesWriter.cpp index 758f6605e15..511efd3dcaa 100644 --- a/lib/APINotes/APINotesWriter.cpp +++ b/lib/APINotes/APINotesWriter.cpp @@ -309,7 +309,9 @@ namespace { // Retrieve the serialized size of the given CommonTypeInfo, for use // in on-disk hash tables. static unsigned getCommonTypeInfoSize(const CommonTypeInfo &info) { - return 2 + info.getSwiftBridge().size() + getCommonEntityInfoSize(info); + return 2 + info.getSwiftBridge().size() + + 2 + info.getNSErrorDomain().size() + + getCommonEntityInfoSize(info); } /// Emit a serialized representation of the common type information. @@ -318,6 +320,8 @@ namespace { endian::Writer writer(out); writer.write(info.getSwiftBridge().size()); out.write(info.getSwiftBridge().c_str(), info.getSwiftBridge().size()); + writer.write(info.getNSErrorDomain().size()); + out.write(info.getNSErrorDomain().c_str(), info.getNSErrorDomain().size()); } /// Used to serialize the on-disk Objective-C context table. diff --git a/lib/APINotes/APINotesYAMLCompiler.cpp b/lib/APINotes/APINotesYAMLCompiler.cpp index 310aed81518..3e645ba1840 100644 --- a/lib/APINotes/APINotesYAMLCompiler.cpp +++ b/lib/APINotes/APINotesYAMLCompiler.cpp @@ -197,6 +197,7 @@ namespace { bool SwiftPrivate = false; StringRef SwiftName; StringRef SwiftBridge; + StringRef NSErrorDomain; MethodsSeq Methods; PropertiesSeq Properties; }; @@ -235,6 +236,7 @@ namespace { StringRef SwiftName; bool SwiftPrivate = false; StringRef SwiftBridge; + StringRef NSErrorDomain; }; typedef std::vector TagsSeq; @@ -244,6 +246,7 @@ namespace { StringRef SwiftName; bool SwiftPrivate = false; StringRef SwiftBridge; + StringRef NSErrorDomain; }; typedef std::vector TypedefsSeq; @@ -361,6 +364,7 @@ namespace llvm { io.mapOptional("SwiftPrivate", c.SwiftPrivate); io.mapOptional("SwiftName", c.SwiftName); io.mapOptional("SwiftBridge", c.SwiftBridge); + io.mapOptional("NSErrorDomain", c.NSErrorDomain); io.mapOptional("Methods", c.Methods); io.mapOptional("Properties", c.Properties); } @@ -413,6 +417,7 @@ namespace llvm { io.mapOptional("SwiftPrivate", t.SwiftPrivate); io.mapOptional("SwiftName", t.SwiftName); io.mapOptional("SwiftBridge", t.SwiftBridge); + io.mapOptional("NSErrorDomain", t.NSErrorDomain); } }; @@ -425,6 +430,7 @@ namespace llvm { io.mapOptional("SwiftPrivate", t.SwiftPrivate); io.mapOptional("SwiftName", t.SwiftName); io.mapOptional("SwiftBridge", t.SwiftBridge); + io.mapOptional("NSErrorDomain", t.NSErrorDomain); } }; @@ -570,6 +576,7 @@ namespace { return true; info.setSwiftBridge(common.SwiftBridge); + info.setNSErrorDomain(common.NSErrorDomain); return false; } @@ -888,6 +895,7 @@ namespace { void handleCommonType(T &record, const CommonTypeInfo &info) { handleCommon(record, info); record.SwiftBridge = copyString(info.getSwiftBridge()); + record.NSErrorDomain = copyString(info.getNSErrorDomain()); } /// Map Objective-C context info. diff --git a/lib/Sema/SemaAPINotes.cpp b/lib/Sema/SemaAPINotes.cpp index 4468d22f30a..0515be234e4 100644 --- a/lib/Sema/SemaAPINotes.cpp +++ b/lib/Sema/SemaAPINotes.cpp @@ -151,6 +151,15 @@ static void ProcessAPINotes(Sema &S, Decl *D, Info.getSwiftBridge()))); } + // ns_error_domain + if (!Info.getNSErrorDomain().empty() && + !D->getAttr()) { + D->addAttr( + NSErrorDomainAttr::CreateImplicit( + S.Context, + &S.Context.Idents.get(Info.getNSErrorDomain()))); + } + ProcessAPINotes(S, D, static_cast(Info)); } diff --git a/test/APINotes/Inputs/roundtrip.apinotes b/test/APINotes/Inputs/roundtrip.apinotes index f02aa003dc0..66f5ea7f8f2 100644 --- a/test/APINotes/Inputs/roundtrip.apinotes +++ b/test/APINotes/Inputs/roundtrip.apinotes @@ -10,6 +10,7 @@ Classes: SwiftPrivate: false SwiftName: '' SwiftBridge: '' + NSErrorDomain: '' Methods: - Selector: init MethodKind: Instance @@ -54,6 +55,7 @@ Classes: SwiftPrivate: false SwiftName: '' SwiftBridge: View + NSErrorDomain: '' Methods: - Selector: 'addSubview:' MethodKind: Instance @@ -113,12 +115,20 @@ Enumerators: SwiftPrivate: false SwiftName: Red Tags: + - Name: NSSomeEnum + Availability: available + AvailabilityMsg: '' + SwiftPrivate: false + SwiftName: SomeEnum + SwiftBridge: '' + NSErrorDomain: some_error_domain - Name: NSSomeStruct Availability: available AvailabilityMsg: '' SwiftPrivate: false SwiftName: SomeStruct SwiftBridge: '' + NSErrorDomain: '' Typedefs: - Name: NSTypedef Availability: available @@ -126,3 +136,4 @@ Typedefs: SwiftPrivate: false SwiftName: Typedef SwiftBridge: '' + NSErrorDomain: ''