Skip to content

Commit f236383

Browse files
committed
Reflection: Fix metadata for empty cases
Also change std::endl to '\n' in the dumper, since std::endl flushes the output stream.
1 parent a09058f commit f236383

File tree

6 files changed

+52
-20
lines changed

6 files changed

+52
-20
lines changed

include/swift/Reflection/Records.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ class FieldRecord {
5252

5353
public:
5454
FieldRecord() = delete;
55+
56+
bool hasMangledTypeName() const {
57+
return MangledTypeName;
58+
}
59+
5560
std::string getMangledTypeName() const {
5661
return MangledTypeName.get();
5762
}

include/swift/Reflection/ReflectionContext.h

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -206,16 +206,16 @@ class ReflectionContext
206206
void dumpTypeRef(const std::string &MangledName,
207207
std::ostream &OS, bool printTypeName = false) {
208208
auto TypeName = Demangle::demangleTypeAsString(MangledName);
209-
OS << TypeName << std::endl;
209+
OS << TypeName << '\n';
210210

211211
auto DemangleTree = Demangle::demangleTypeAsNode(MangledName);
212212
auto TR = decodeMangledType(DemangleTree);
213213
if (!TR) {
214-
OS << "!!! Invalid typeref: " << MangledName << std::endl;
214+
OS << "!!! Invalid typeref: " << MangledName << '\n';
215215
return;
216216
}
217217
TR->dump(OS);
218-
OS << std::endl;
218+
OS << '\n';
219219
}
220220

221221
const AssociatedTypeDescriptor *
@@ -259,13 +259,18 @@ class ReflectionContext
259259
for (const auto &descriptor : sections.fieldmd) {
260260
auto TypeName
261261
= Demangle::demangleTypeAsString(descriptor.getMangledTypeName());
262-
OS << TypeName << std::endl;
262+
OS << TypeName << '\n';
263263
for (size_t i = 0; i < TypeName.size(); ++i)
264264
OS << '-';
265-
OS << std::endl;
265+
OS << '\n';
266266
for (auto &field : descriptor) {
267-
OS << field.getFieldName() << ": ";
268-
dumpTypeRef(field.getMangledTypeName(), OS);
267+
OS << field.getFieldName();
268+
if (field.hasMangledTypeName()) {
269+
OS << ": ";
270+
dumpTypeRef(field.getMangledTypeName(), OS);
271+
} else {
272+
OS << "\n\n";
273+
}
269274
}
270275
}
271276
}
@@ -280,7 +285,7 @@ class ReflectionContext
280285
descriptor.getMangledProtocolTypeName());
281286

282287
OS << conformingTypeName << " : " << protocolName;
283-
OS << std::endl;
288+
OS << '\n';
284289

285290
for (const auto &associatedType : descriptor) {
286291
OS << "typealias " << associatedType.getName() << " = ";
@@ -291,15 +296,15 @@ class ReflectionContext
291296
}
292297

293298
void dumpAllSections(std::ostream &OS) {
294-
OS << "FIELDS:" << std::endl;
299+
OS << "FIELDS:\n";
295300
for (size_t i = 0; i < 7; ++i) OS << '=';
296-
OS << std::endl;
301+
OS << '\n';
297302
dumpFieldSection(OS);
298-
OS << "\nASSOCIATED TYPES:" << std::endl;
303+
OS << "\nASSOCIATED TYPES:\n";
299304
for (size_t i = 0; i < 17; ++i) OS << '=';
300-
OS << std::endl;
305+
OS << '\n';
301306
dumpAssociatedTypeSection(OS);
302-
OS << std::endl;
307+
OS << '\n';
303308
}
304309

305310
TypeRef *
@@ -340,13 +345,21 @@ class ReflectionContext
340345
if (MangledName.compare(CandidateMangledName) != 0)
341346
continue;
342347
for (auto &Field : FieldDescriptor) {
348+
auto FieldName = Field.getFieldName();
349+
350+
// Empty cases of enums do not have a type
351+
if (!Field.hasMangledTypeName()) {
352+
Fields.push_back({FieldName, nullptr});
353+
continue;
354+
}
355+
343356
auto Demangled
344-
= Demangle::demangleTypeAsNode(Field.getMangledTypeName());
357+
= Demangle::demangleTypeAsNode(Field.getMangledTypeName());
345358
auto Unsubstituted = decodeMangledType(Demangled);
346359
if (!Unsubstituted)
347360
return {};
361+
348362
auto Substituted = Unsubstituted->subst(*this, Subs);
349-
auto FieldName = Field.getFieldName();
350363
if (FieldName.empty())
351364
FieldName = "<Redacted Field Name>";
352365
Fields.push_back({FieldName, Substituted});

lib/IRGen/GenReflection.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,11 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
132132

133133
addConstantInt32(Flags.getRawValue());
134134

135-
addTypeRef(value->getModuleContext(), type);
135+
if (!type) {
136+
addConstantInt32(0);
137+
} else {
138+
addTypeRef(value->getModuleContext(), type);
139+
}
136140

137141
if (IGM.Opts.StripReflectionNames) {
138142
addConstantInt32(0);
@@ -164,10 +168,15 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
164168
auto cases = enumDecl->getAllElements();
165169
addConstantInt32(std::distance(cases.begin(), cases.end()));
166170
addConstantInt32(fieldRecordSize);
167-
for (auto enumCase : cases)
168-
addFieldDecl(enumCase,
169-
enumCase->getArgumentInterfaceType()
170-
->getCanonicalType());
171+
for (auto enumCase : cases) {
172+
if (enumCase->hasArgumentType()) {
173+
addFieldDecl(enumCase,
174+
enumCase->getArgumentInterfaceType()
175+
->getCanonicalType());
176+
} else {
177+
addFieldDecl(enumCase, CanType());
178+
}
179+
}
171180
break;
172181
}
173182
default:

test/Reflection/Inputs/ConcreteTypes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public enum E {
5252
indirect case IndirectTuple(C, S, E, Int)
5353
case Metatype(E.Type)
5454
case NestedStruct(S.NestedS)
55+
case EmptyCase
5556
}
5657

5758
public struct References {

test/Reflection/typeref_decoding.result.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ NestedStruct: TypesToReflect.S.NestedS
127127
(struct TypesToReflect.S.NestedS
128128
(struct TypesToReflect.S))
129129

130+
EmptyCase
131+
130132
TypesToReflect.References
131133
-------------------------
132134
strongRef: TypesToReflect.C

test/Reflection/typeref_decoding_objc.result.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ NestedStruct: TypesToReflect.S.NestedS
127127
(struct TypesToReflect.S.NestedS
128128
(struct TypesToReflect.S))
129129

130+
EmptyCase
131+
130132
TypesToReflect.References
131133
-------------------------
132134
strongRef: TypesToReflect.C

0 commit comments

Comments
 (0)