@@ -195,15 +195,15 @@ TypeRefBuilder::ReflectionTypeDescriptorFinder::lookupTypeWitness(
195195}
196196
197197const TypeRef *TypeRefBuilder::lookupSuperclass (const TypeRef *TR) {
198- const auto &FD = getFieldTypeInfo (TR);
198+ const auto &FD = getFieldDescriptor (TR);
199199 if (FD == nullptr )
200200 return nullptr ;
201201
202- if (!FD->hasSuperclass () )
202+ if (!FD->HasSuperClass )
203203 return nullptr ;
204204
205205 ScopedNodeFactoryCheckpoint checkpoint (this );
206- auto Demangled = demangleTypeRef ( readTypeRef (FD, FD-> Superclass ) );
206+ auto Demangled = FD-> demangleSuperclass ( );
207207 auto Unsubstituted = decodeMangledType (Demangled);
208208 if (!Unsubstituted)
209209 return nullptr ;
@@ -375,34 +375,97 @@ TypeRefBuilder::ReflectionTypeDescriptorFinder::getFieldTypeInfo(
375375 return nullptr ;
376376}
377377
378+ namespace {
379+ // A field record implementation that wraps a reflection field record.
380+ class FieldRecordImpl : public FieldRecordBase {
381+ RemoteRef<const FieldRecord> Field;
382+ TypeRefBuilder &Builder;
383+
384+ public:
385+ FieldRecordImpl (RemoteRef<const FieldRecord> FR, TypeRefBuilder &Builder)
386+ : FieldRecordBase(FR->isIndirectCase (), FR->isVar(),
387+ FR->hasMangledTypeName()),
388+ Field(FR), Builder(Builder) {}
389+
390+ ~FieldRecordImpl () override {}
391+
392+ StringRef getFieldName () override {
393+ return Builder.getTypeRefString (
394+ Builder.readTypeRef (Field, Field->FieldName ));
395+ }
396+
397+ NodePointer getDemangledTypeName () override {
398+ return Builder.demangleTypeRef (
399+ Builder.readTypeRef (Field, Field->MangledTypeName ));
400+ }
401+ };
402+
403+ // / A field descriptor implementation that wraps a reflection field
404+ // / descriptor.
405+ class FieldDescriptorImpl : public FieldDescriptorBase {
406+ RemoteRef<FieldDescriptor> FD;
407+ TypeRefBuilder &Builder;
408+
409+ public:
410+ FieldDescriptorImpl (RemoteRef<FieldDescriptor> FD, TypeRefBuilder &Builder)
411+ : FieldDescriptorBase(FD->Kind, FD->hasSuperclass ()), FD(FD),
412+ Builder(Builder) {}
413+
414+ ~FieldDescriptorImpl () override {}
415+
416+ NodePointer demangleSuperclass () override {
417+ return Builder.demangleTypeRef (Builder.readTypeRef (FD, FD->Superclass ));
418+ }
419+
420+ std::vector<std::unique_ptr<FieldRecordBase>> getFieldRecords () override {
421+ std::vector<std::unique_ptr<FieldRecordBase>> FieldRecords;
422+ for (auto &FieldRef : *FD.getLocalBuffer ()) {
423+ FieldRecords.emplace_back (
424+ std::make_unique<FieldRecordImpl>(FD.getField (FieldRef), Builder));
425+ }
426+ return FieldRecords;
427+ }
428+ };
429+ } // namespace
430+
431+ std::unique_ptr<FieldDescriptorBase>
432+ TypeRefBuilder::ReflectionTypeDescriptorFinder::getFieldDescriptor (
433+ const TypeRef *TR) {
434+ if (auto FDI = getFieldTypeInfo (TR))
435+ return std::make_unique<FieldDescriptorImpl>(FDI, Builder);
436+ return nullptr ;
437+ }
438+
439+ std::unique_ptr<FieldDescriptorBase>
440+ TypeRefBuilder::getFieldDescriptor (const TypeRef *TR) {
441+ for (auto DF : getDescriptorFinders ())
442+ if (auto descriptor = DF->getFieldDescriptor (TR))
443+ return descriptor;
444+ return nullptr ;
445+ }
446+
378447bool TypeRefBuilder::getFieldTypeRefs (
379- const TypeRef *TR, RemoteRef<FieldDescriptor> FD,
448+ const TypeRef *TR, FieldDescriptorBase & FD,
380449 remote::TypeInfoProvider *ExternalTypeInfo,
381450 std::vector<FieldTypeInfo> &Fields) {
382- if (FD == nullptr )
383- return false ;
384-
385451 auto Subs = TR->getSubstMap ();
386452 if (!Subs)
387453 return false ;
388454
389455 int FieldValue = -1 ;
390- for (auto &FieldRef : *FD.getLocalBuffer ()) {
391- auto Field = FD.getField (FieldRef);
392-
393- auto FieldName = getTypeRefString (readTypeRef (Field, Field->FieldName ));
456+ for (auto &Field : FD.getFieldRecords ()) {
457+ auto FieldName = Field->getFieldName ();
394458 FieldValue += 1 ;
395459
396460 // Empty cases of enums do not have a type
397- if (FD-> isEnum () && !Field->hasMangledTypeName () ) {
461+ if (FD. isEnum () && !Field->HasMangledTypeName ) {
398462 Fields.push_back (
399463 FieldTypeInfo::forEmptyCase (FieldName.str (), FieldValue));
400464 continue ;
401465 }
402466
403467 ScopedNodeFactoryCheckpoint checkpoint (this );
404- auto Demangled =
405- demangleTypeRef (readTypeRef (Field, Field->MangledTypeName ));
468+ auto Demangled = Field->getDemangledTypeName ();
406469 auto Unsubstituted = decodeMangledType (Demangled);
407470 if (!Unsubstituted)
408471 return false ;
@@ -412,7 +475,7 @@ bool TypeRefBuilder::getFieldTypeRefs(
412475 // `case a([T?])` is generic, but `case a([Int?])` is not.
413476 bool IsGeneric = false ;
414477 auto Substituted = Unsubstituted->subst (*this , *Subs, IsGeneric);
415- bool IsIndirect = FD-> isEnum () && Field->isIndirectCase () ;
478+ bool IsIndirect = FD. isEnum () && Field->IsIndirectCase ;
416479
417480 auto FieldTI = FieldTypeInfo (FieldName.str (), FieldValue, Substituted,
418481 IsIndirect, IsGeneric);
@@ -471,6 +534,7 @@ TypeRefBuilder::ReflectionTypeDescriptorFinder::getBuiltinTypeInfo(
471534 return nullptr ;
472535}
473536
537+ namespace {
474538// / A builtin type descriptor implementation that wraps a reflection builtin
475539// / type descriptor.
476540class BuiltinTypeDescriptorImpl : public BuiltinTypeDescriptorBase {
@@ -491,6 +555,7 @@ class BuiltinTypeDescriptorImpl : public BuiltinTypeDescriptorBase {
491555 return Builder.getTypeRefString (Builder.readTypeRef (BTD, BTD->TypeName ));
492556 };
493557};
558+ } // namespace
494559
495560std::unique_ptr<BuiltinTypeDescriptorBase>
496561TypeRefBuilder::ReflectionTypeDescriptorFinder::getBuiltinTypeDescriptor (
0 commit comments