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

Commit e878577

Browse files
authored
Merge pull request #22 from apple/ns-error-domain-3.0
[API Notes] Add support for the ns_error_domain attribute.
2 parents 69b7a5e + 2b34dcd commit e878577

File tree

6 files changed

+49
-2
lines changed

6 files changed

+49
-2
lines changed

include/clang/APINotes/Types.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,24 +129,33 @@ class CommonTypeInfo : public CommonEntityInfo {
129129
/// Reflects the swift_bridge attribute.
130130
std::string SwiftBridge;
131131

132+
/// The NS error domain for this type.
133+
std::string NSErrorDomain;
134+
132135
public:
133136
CommonTypeInfo() : CommonEntityInfo() { }
134137

135138
const std::string &getSwiftBridge() const { return SwiftBridge; }
136139
void setSwiftBridge(const std::string &swiftType) { SwiftBridge = swiftType; }
137140

141+
const std::string &getNSErrorDomain() const { return NSErrorDomain; }
142+
void setNSErrorDomain(const std::string &domain) { NSErrorDomain = domain; }
143+
138144
friend CommonTypeInfo &operator|=(CommonTypeInfo &lhs,
139145
const CommonTypeInfo &rhs) {
140146
static_cast<CommonEntityInfo &>(lhs) |= rhs;
141147
if (lhs.SwiftBridge.empty() && !rhs.SwiftBridge.empty())
142148
lhs.SwiftBridge = rhs.SwiftBridge;
149+
if (lhs.NSErrorDomain.empty() && !rhs.NSErrorDomain.empty())
150+
lhs.NSErrorDomain = rhs.NSErrorDomain;
143151
return lhs;
144152
}
145153

146154
friend bool operator==(const CommonTypeInfo &lhs,
147155
const CommonTypeInfo &rhs) {
148156
return static_cast<const CommonEntityInfo &>(lhs) == rhs &&
149-
lhs.SwiftBridge == rhs.SwiftBridge;
157+
lhs.SwiftBridge == rhs.SwiftBridge &&
158+
lhs.NSErrorDomain == rhs.NSErrorDomain;
150159
}
151160

152161
friend bool operator!=(const CommonTypeInfo &lhs,

lib/APINotes/APINotesReader.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ namespace {
5858
info.setSwiftBridge(
5959
StringRef(reinterpret_cast<const char *>(data), swiftBridgeLength));
6060
data += swiftBridgeLength;
61+
62+
unsigned errorDomainLength =
63+
endian::readNext<uint16_t, little, unaligned>(data);
64+
info.setNSErrorDomain(
65+
StringRef(reinterpret_cast<const char *>(data), errorDomainLength));
66+
data += errorDomainLength;
6167
}
6268

6369
/// Used to deserialize the on-disk identifier table.

lib/APINotes/APINotesWriter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,9 @@ namespace {
309309
// Retrieve the serialized size of the given CommonTypeInfo, for use
310310
// in on-disk hash tables.
311311
static unsigned getCommonTypeInfoSize(const CommonTypeInfo &info) {
312-
return 2 + info.getSwiftBridge().size() + getCommonEntityInfoSize(info);
312+
return 2 + info.getSwiftBridge().size() +
313+
2 + info.getNSErrorDomain().size() +
314+
getCommonEntityInfoSize(info);
313315
}
314316

315317
/// Emit a serialized representation of the common type information.
@@ -318,6 +320,8 @@ namespace {
318320
endian::Writer<little> writer(out);
319321
writer.write<uint16_t>(info.getSwiftBridge().size());
320322
out.write(info.getSwiftBridge().c_str(), info.getSwiftBridge().size());
323+
writer.write<uint16_t>(info.getNSErrorDomain().size());
324+
out.write(info.getNSErrorDomain().c_str(), info.getNSErrorDomain().size());
321325
}
322326

323327
/// Used to serialize the on-disk Objective-C context table.

lib/APINotes/APINotesYAMLCompiler.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ namespace {
197197
bool SwiftPrivate = false;
198198
StringRef SwiftName;
199199
StringRef SwiftBridge;
200+
StringRef NSErrorDomain;
200201
MethodsSeq Methods;
201202
PropertiesSeq Properties;
202203
};
@@ -235,6 +236,7 @@ namespace {
235236
StringRef SwiftName;
236237
bool SwiftPrivate = false;
237238
StringRef SwiftBridge;
239+
StringRef NSErrorDomain;
238240
};
239241
typedef std::vector<Tag> TagsSeq;
240242

@@ -244,6 +246,7 @@ namespace {
244246
StringRef SwiftName;
245247
bool SwiftPrivate = false;
246248
StringRef SwiftBridge;
249+
StringRef NSErrorDomain;
247250
};
248251
typedef std::vector<Typedef> TypedefsSeq;
249252

@@ -361,6 +364,7 @@ namespace llvm {
361364
io.mapOptional("SwiftPrivate", c.SwiftPrivate);
362365
io.mapOptional("SwiftName", c.SwiftName);
363366
io.mapOptional("SwiftBridge", c.SwiftBridge);
367+
io.mapOptional("NSErrorDomain", c.NSErrorDomain);
364368
io.mapOptional("Methods", c.Methods);
365369
io.mapOptional("Properties", c.Properties);
366370
}
@@ -413,6 +417,7 @@ namespace llvm {
413417
io.mapOptional("SwiftPrivate", t.SwiftPrivate);
414418
io.mapOptional("SwiftName", t.SwiftName);
415419
io.mapOptional("SwiftBridge", t.SwiftBridge);
420+
io.mapOptional("NSErrorDomain", t.NSErrorDomain);
416421
}
417422
};
418423

@@ -425,6 +430,7 @@ namespace llvm {
425430
io.mapOptional("SwiftPrivate", t.SwiftPrivate);
426431
io.mapOptional("SwiftName", t.SwiftName);
427432
io.mapOptional("SwiftBridge", t.SwiftBridge);
433+
io.mapOptional("NSErrorDomain", t.NSErrorDomain);
428434
}
429435
};
430436

@@ -570,6 +576,7 @@ namespace {
570576
return true;
571577

572578
info.setSwiftBridge(common.SwiftBridge);
579+
info.setNSErrorDomain(common.NSErrorDomain);
573580
return false;
574581
}
575582

@@ -888,6 +895,7 @@ namespace {
888895
void handleCommonType(T &record, const CommonTypeInfo &info) {
889896
handleCommon(record, info);
890897
record.SwiftBridge = copyString(info.getSwiftBridge());
898+
record.NSErrorDomain = copyString(info.getNSErrorDomain());
891899
}
892900

893901
/// Map Objective-C context info.

lib/Sema/SemaAPINotes.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,15 @@ static void ProcessAPINotes(Sema &S, Decl *D,
151151
Info.getSwiftBridge())));
152152
}
153153

154+
// ns_error_domain
155+
if (!Info.getNSErrorDomain().empty() &&
156+
!D->getAttr<NSErrorDomainAttr>()) {
157+
D->addAttr(
158+
NSErrorDomainAttr::CreateImplicit(
159+
S.Context,
160+
&S.Context.Idents.get(Info.getNSErrorDomain())));
161+
}
162+
154163
ProcessAPINotes(S, D, static_cast<const api_notes::CommonEntityInfo &>(Info));
155164
}
156165

test/APINotes/Inputs/roundtrip.apinotes

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Classes:
1010
SwiftPrivate: false
1111
SwiftName: ''
1212
SwiftBridge: ''
13+
NSErrorDomain: ''
1314
Methods:
1415
- Selector: init
1516
MethodKind: Instance
@@ -54,6 +55,7 @@ Classes:
5455
SwiftPrivate: false
5556
SwiftName: ''
5657
SwiftBridge: View
58+
NSErrorDomain: ''
5759
Methods:
5860
- Selector: 'addSubview:'
5961
MethodKind: Instance
@@ -113,16 +115,25 @@ Enumerators:
113115
SwiftPrivate: false
114116
SwiftName: Red
115117
Tags:
118+
- Name: NSSomeEnum
119+
Availability: available
120+
AvailabilityMsg: ''
121+
SwiftPrivate: false
122+
SwiftName: SomeEnum
123+
SwiftBridge: ''
124+
NSErrorDomain: some_error_domain
116125
- Name: NSSomeStruct
117126
Availability: available
118127
AvailabilityMsg: ''
119128
SwiftPrivate: false
120129
SwiftName: SomeStruct
121130
SwiftBridge: ''
131+
NSErrorDomain: ''
122132
Typedefs:
123133
- Name: NSTypedef
124134
Availability: available
125135
AvailabilityMsg: ''
126136
SwiftPrivate: false
127137
SwiftName: Typedef
128138
SwiftBridge: ''
139+
NSErrorDomain: ''

0 commit comments

Comments
 (0)