@@ -432,30 +432,76 @@ void TypeRefBuilder::dumpTypeRef(RemoteRef<char> MangledName,
432432 stream << " \n " ;
433433}
434434
435- void TypeRefBuilder::dumpFieldSection (std::ostream &stream) {
435+ FieldTypeCollectionResult TypeRefBuilder::collectFieldTypes (
436+ llvm::Optional<std::string> forMangledTypeName) {
437+ FieldTypeCollectionResult result;
436438 for (const auto §ions : ReflectionInfos) {
437439 for (auto descriptor : sections.Field ) {
438- auto TypeDemangling =
439- demangleTypeRef (readTypeRef (descriptor, descriptor-> MangledTypeName ));
440- auto TypeName = nodeToString (TypeDemangling );
440+ auto typeRef = readTypeRef (descriptor, descriptor-> MangledTypeName );
441+ auto typeName = nodeToString ( demangleTypeRef (typeRef ));
442+ auto optionalMangledTypeName = normalizeReflectionName (typeRef );
441443 clearNodeFactory ();
442- stream << TypeName.c_str () << " \n " ;
443- for (size_t i = 0 ; i < TypeName.size (); ++i)
444- stream << " -" ;
445- stream << " \n " ;
446- for (auto &fieldRef : *descriptor.getLocalBuffer ()) {
447- auto field = descriptor.getField (fieldRef);
448- auto fieldName = getTypeRefString (readTypeRef (field, field->FieldName ));
449- stream.write (fieldName.data (), fieldName.size ());
450- if (field->hasMangledTypeName ()) {
451- stream << " : " ;
452- dumpTypeRef (readTypeRef (field, field->MangledTypeName ), stream);
453- } else {
454- stream << " \n\n " ;
444+ if (optionalMangledTypeName.hasValue ()) {
445+ auto mangledTypeName =
446+ optionalMangledTypeName.getValue ().insert (0 , " $s" );
447+ if (forMangledTypeName.hasValue ()) {
448+ if (mangledTypeName != forMangledTypeName.getValue ())
449+ continue ;
455450 }
451+
452+ std::vector<PropertyTypeInfo> properties;
453+ std::vector<EnumCaseInfo> enumCases;
454+ for (auto &fieldRef : *descriptor.getLocalBuffer ()) {
455+ auto field = descriptor.getField (fieldRef);
456+ auto fieldName = getTypeRefString (readTypeRef (field, field->FieldName ));
457+ if (field->hasMangledTypeName ()) {
458+ std::string mangledFieldTypeName =
459+ std::string (field->MangledTypeName );
460+ auto fieldTypeRef = readTypeRef (field, field->MangledTypeName );
461+ auto optionalMangledfieldTypeName =
462+ normalizeReflectionName (fieldTypeRef);
463+ if (optionalMangledfieldTypeName.hasValue ()) {
464+ mangledFieldTypeName =
465+ " $s" + optionalMangledfieldTypeName.getValue ();
466+ }
467+ auto fieldTypeDemangleTree = demangleTypeRef (fieldTypeRef);
468+ auto fieldTypeName = nodeToString (fieldTypeDemangleTree);
469+ std::stringstream OS;
470+ dumpTypeRef (fieldTypeRef, OS);
471+ properties.emplace_back (PropertyTypeInfo{fieldName.str (),
472+ mangledFieldTypeName,
473+ fieldTypeName, OS.str ()});
474+ } else {
475+ enumCases.emplace_back (EnumCaseInfo{fieldName.str ()});
476+ }
477+ }
478+ result.FieldInfos .emplace_back (FieldMetadata{
479+ mangledTypeName, typeName, properties, enumCases});
456480 }
457481 }
458482 }
483+
484+ return result;
485+ }
486+
487+ void TypeRefBuilder::dumpFieldSection (std::ostream &stream) {
488+ auto fieldInfoCollectionResult =
489+ collectFieldTypes (llvm::Optional<std::string>());
490+ for (const auto &info : fieldInfoCollectionResult.FieldInfos ) {
491+ stream << info.FullyQualifiedName << " \n " ;
492+ for (size_t i = 0 ; i < info.FullyQualifiedName .size (); ++i)
493+ stream << " -" ;
494+ stream << " \n " ;
495+ for (const auto &field : info.Properties ) {
496+ stream << field.Label ;
497+ stream << " : " ;
498+ stream << field.TypeDiagnosticPrintName ;
499+ }
500+ for (const auto &field : info.EnumCases ) {
501+ stream << field.Label ;
502+ stream << " \n\n " ;
503+ }
504+ }
459505}
460506
461507AssociatedTypeCollectionResult TypeRefBuilder::collectAssociatedTypes (
0 commit comments