Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

[API Notes] Add support for the ns_error_domain attribute. #22

Merged
merged 1 commit into from
Jul 6, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion include/clang/APINotes/Types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<CommonEntityInfo &>(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<const CommonEntityInfo &>(lhs) == rhs &&
lhs.SwiftBridge == rhs.SwiftBridge;
lhs.SwiftBridge == rhs.SwiftBridge &&
lhs.NSErrorDomain == rhs.NSErrorDomain;
}

friend bool operator!=(const CommonTypeInfo &lhs,
Expand Down
6 changes: 6 additions & 0 deletions lib/APINotes/APINotesReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ namespace {
info.setSwiftBridge(
StringRef(reinterpret_cast<const char *>(data), swiftBridgeLength));
data += swiftBridgeLength;

unsigned errorDomainLength =
endian::readNext<uint16_t, little, unaligned>(data);
info.setNSErrorDomain(
StringRef(reinterpret_cast<const char *>(data), errorDomainLength));
data += errorDomainLength;
}

/// Used to deserialize the on-disk identifier table.
Expand Down
6 changes: 5 additions & 1 deletion lib/APINotes/APINotesWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -318,6 +320,8 @@ namespace {
endian::Writer<little> writer(out);
writer.write<uint16_t>(info.getSwiftBridge().size());
out.write(info.getSwiftBridge().c_str(), info.getSwiftBridge().size());
writer.write<uint16_t>(info.getNSErrorDomain().size());
out.write(info.getNSErrorDomain().c_str(), info.getNSErrorDomain().size());
}

/// Used to serialize the on-disk Objective-C context table.
Expand Down
8 changes: 8 additions & 0 deletions lib/APINotes/APINotesYAMLCompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ namespace {
bool SwiftPrivate = false;
StringRef SwiftName;
StringRef SwiftBridge;
StringRef NSErrorDomain;
MethodsSeq Methods;
PropertiesSeq Properties;
};
Expand Down Expand Up @@ -235,6 +236,7 @@ namespace {
StringRef SwiftName;
bool SwiftPrivate = false;
StringRef SwiftBridge;
StringRef NSErrorDomain;
};
typedef std::vector<Tag> TagsSeq;

Expand All @@ -244,6 +246,7 @@ namespace {
StringRef SwiftName;
bool SwiftPrivate = false;
StringRef SwiftBridge;
StringRef NSErrorDomain;
};
typedef std::vector<Typedef> TypedefsSeq;

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
};

Expand All @@ -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);
}
};

Expand Down Expand Up @@ -570,6 +576,7 @@ namespace {
return true;

info.setSwiftBridge(common.SwiftBridge);
info.setNSErrorDomain(common.NSErrorDomain);
return false;
}

Expand Down Expand Up @@ -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.
Expand Down
9 changes: 9 additions & 0 deletions lib/Sema/SemaAPINotes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,15 @@ static void ProcessAPINotes(Sema &S, Decl *D,
Info.getSwiftBridge())));
}

// ns_error_domain
if (!Info.getNSErrorDomain().empty() &&
!D->getAttr<NSErrorDomainAttr>()) {
D->addAttr(
NSErrorDomainAttr::CreateImplicit(
S.Context,
&S.Context.Idents.get(Info.getNSErrorDomain())));
}

ProcessAPINotes(S, D, static_cast<const api_notes::CommonEntityInfo &>(Info));
}

Expand Down
11 changes: 11 additions & 0 deletions test/APINotes/Inputs/roundtrip.apinotes
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Classes:
SwiftPrivate: false
SwiftName: ''
SwiftBridge: ''
NSErrorDomain: ''
Methods:
- Selector: init
MethodKind: Instance
Expand Down Expand Up @@ -54,6 +55,7 @@ Classes:
SwiftPrivate: false
SwiftName: ''
SwiftBridge: View
NSErrorDomain: ''
Methods:
- Selector: 'addSubview:'
MethodKind: Instance
Expand Down Expand Up @@ -113,16 +115,25 @@ 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
AvailabilityMsg: ''
SwiftPrivate: false
SwiftName: Typedef
SwiftBridge: ''
NSErrorDomain: ''