Skip to content

Commit aafa942

Browse files
committed
Implement TypeSystemSwiftTypeRef::GetTypeInf() (NFC)
This should enable a lot of additional functionality. (cherry picked from commit 5873328)
1 parent 64c3adf commit aafa942

File tree

4 files changed

+406
-78
lines changed

4 files changed

+406
-78
lines changed

lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,10 @@ SwiftLanguage::GetHardcodedSynthetics() {
774774
CompilerType type(valobj.GetCompilerType());
775775
Flags type_flags(type.GetTypeInfo());
776776
if (type_flags.AllSet(eTypeIsSwift | eTypeIsEnumeration)) {
777+
// FIXME: The classification of clang-imported enums may
778+
// change based on whether a Swift module is present or not.
779+
if (!valobj.GetValueAsCString())
780+
return nullptr;
777781
if (!swift_enum_synth)
778782
swift_enum_synth = lldb::SyntheticChildrenSP(new CXXSyntheticChildren(
779783
SyntheticChildren::Flags()

lldb/source/Symbol/SwiftASTContext.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5508,19 +5508,22 @@ SwiftASTContext::GetTypeInfo(opaque_compiler_type_t type,
55085508
LLVM_FALLTHROUGH;
55095509
case swift::TypeKind::Enum: {
55105510
SwiftEnumDescriptor *cached_enum_info = GetCachedEnumInfo(type);
5511-
if (cached_enum_info) {
5512-
if (cached_enum_info->GetNumElementsWithPayload() == 0)
5513-
swift_flags |= eTypeHasValue | eTypeIsEnumeration;
5514-
else
5515-
swift_flags |= eTypeHasValue | eTypeIsEnumeration | eTypeHasChildren;
5516-
} else
5511+
if (cached_enum_info)
5512+
swift_flags |= eTypeHasValue | eTypeIsEnumeration | eTypeHasChildren;
5513+
else
55175514
swift_flags |= eTypeIsEnumeration;
55185515
} break;
55195516

55205517
case swift::TypeKind::BoundGenericStruct:
55215518
swift_flags |= eTypeIsGeneric | eTypeIsBound;
55225519
LLVM_FALLTHROUGH;
55235520
case swift::TypeKind::Struct:
5521+
if (auto *ndecl = swift_can_type.getAnyNominal())
5522+
if (llvm::dyn_cast_or_null<clang::EnumDecl>(ndecl->getClangDecl())) {
5523+
swift_flags |= eTypeHasChildren | eTypeIsEnumeration | eTypeHasValue;
5524+
break;
5525+
}
5526+
55245527
swift_flags |= eTypeHasChildren | eTypeIsStructUnion;
55255528
break;
55265529

0 commit comments

Comments
 (0)