Skip to content

Commit dc4eaa0

Browse files
slavapestovadrian-prantl
authored andcommitted
ASTMangler: Mangle sugared types for the debugger
Fixes <rdar://problem/48004306>. (cherry picked from commit d0c7b15)
1 parent b89b723 commit dc4eaa0

20 files changed

+334
-55
lines changed

include/swift/AST/ASTDemangler.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,14 @@ class ASTBuilder {
126126

127127
Type getOpaqueType();
128128

129+
Type createOptionalType(Type base);
130+
131+
Type createArrayType(Type base);
132+
133+
Type createDictionaryType(Type key, Type value);
134+
135+
Type createParenType(Type base);
136+
129137
private:
130138
bool validateParentType(TypeDecl *decl, Type parent);
131139
CanGenericSignature demangleGenericSignature(

include/swift/AST/ASTMangler.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,6 @@ class ASTMangler : public Mangler {
214214

215215
void bindGenericParameters(CanGenericSignature sig);
216216

217-
/// Mangles a sugared type iff we are mangling for the debugger.
218-
template <class T> void appendSugaredType(Type type) {
219-
assert(DWARFMangling &&
220-
"sugared types are only legal when mangling for the debugger");
221-
auto *BlandTy = cast<T>(type.getPointer())->getSinglyDesugaredType();
222-
appendType(BlandTy);
223-
}
224-
225217
void appendBoundGenericArgs(Type type, bool &isFirstArgList);
226218

227219
/// Append the bound generics arguments for the given declaration context

include/swift/Demangling/DemangleNodes.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,5 +252,9 @@ NODE(ModuleDescriptor)
252252
NODE(ExtensionDescriptor)
253253
NODE(AnonymousDescriptor)
254254
NODE(AssociatedTypeGenericParamRef)
255+
NODE(SugaredOptional)
256+
NODE(SugaredArray)
257+
NODE(SugaredDictionary)
258+
NODE(SugaredParen)
255259
#undef CONTEXT_NODE
256260
#undef NODE

include/swift/Demangling/TypeDecoder.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,50 @@ class TypeDecoder {
733733
// NativeObject type ref.
734734
return Builder.createBuiltinType("Builtin.NativeObject", "Bo");
735735
}
736+
case NodeKind::SugaredOptional: {
737+
if (Node->getNumChildren() < 1)
738+
return BuiltType();
739+
740+
auto base = decodeMangledType(Node->getChild(0));
741+
if (!base)
742+
return BuiltType();
743+
744+
return Builder.createOptionalType(base);
745+
}
746+
case NodeKind::SugaredArray: {
747+
if (Node->getNumChildren() < 1)
748+
return BuiltType();
749+
750+
auto base = decodeMangledType(Node->getChild(0));
751+
if (!base)
752+
return BuiltType();
753+
754+
return Builder.createArrayType(base);
755+
}
756+
case NodeKind::SugaredDictionary: {
757+
if (Node->getNumChildren() < 2)
758+
return BuiltType();
759+
760+
auto key = decodeMangledType(Node->getChild(0));
761+
if (!key)
762+
return BuiltType();
763+
764+
auto value = decodeMangledType(Node->getChild(1));
765+
if (!key)
766+
return BuiltType();
767+
768+
return Builder.createDictionaryType(key, value);
769+
}
770+
case NodeKind::SugaredParen: {
771+
if (Node->getNumChildren() < 1)
772+
return BuiltType();
773+
774+
auto base = decodeMangledType(Node->getChild(0));
775+
if (!base)
776+
return BuiltType();
777+
778+
return Builder.createParenType(base);
779+
}
736780
default:
737781
return BuiltType();
738782
}

include/swift/Reflection/TypeRefBuilder.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,26 @@ class TypeRefBuilder {
248248
return nullptr;
249249
}
250250

251+
const TypeRef *createOptionalType(const TypeRef *base) {
252+
// TypeRefs don't contain sugared types
253+
return nullptr;
254+
}
255+
256+
const TypeRef *createArrayType(const TypeRef *base) {
257+
// TypeRefs don't contain sugared types
258+
return nullptr;
259+
}
260+
261+
const TypeRef *createDictionaryType(const TypeRef *key, const TypeRef *value) {
262+
// TypeRefs don't contain sugared types
263+
return nullptr;
264+
}
265+
266+
const TypeRef *createParenType(const TypeRef *base) {
267+
// TypeRefs don't contain sugared types
268+
return nullptr;
269+
}
270+
251271
const BoundGenericTypeRef *
252272
createBoundGenericType(const Optional<std::string> &mangledName,
253273
const std::vector<const TypeRef *> &args) {

lib/AST/ASTDemangler.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,22 @@ Type ASTBuilder::getOpaqueType() {
577577
return Type();
578578
}
579579

580+
Type ASTBuilder::createOptionalType(Type base) {
581+
return OptionalType::get(base);
582+
}
583+
584+
Type ASTBuilder::createArrayType(Type base) {
585+
return ArraySliceType::get(base);
586+
}
587+
588+
Type ASTBuilder::createDictionaryType(Type key, Type value) {
589+
return DictionaryType::get(key, value);
590+
}
591+
592+
Type ASTBuilder::createParenType(Type base) {
593+
return ParenType::get(Ctx, base);
594+
}
595+
580596
bool ASTBuilder::validateParentType(TypeDecl *decl, Type parent) {
581597
auto parentDecl = decl->getDeclContext()->getSelfNominalTypeDecl();
582598

lib/AST/ASTMangler.cpp

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -811,11 +811,29 @@ void ASTMangler::appendType(Type type) {
811811
}
812812

813813
case TypeKind::Paren:
814-
return appendSugaredType<ParenType>(type);
815-
case TypeKind::ArraySlice: /* fallthrough */
814+
assert(DWARFMangling && "sugared types are only legal for the debugger");
815+
appendType(cast<ParenType>(tybase)->getUnderlyingType());
816+
appendOperator("XSp");
817+
return;
818+
819+
case TypeKind::ArraySlice:
820+
assert(DWARFMangling && "sugared types are only legal for the debugger");
821+
appendType(cast<ArraySliceType>(tybase)->getBaseType());
822+
appendOperator("XSa");
823+
return;
824+
816825
case TypeKind::Optional:
826+
assert(DWARFMangling && "sugared types are only legal for the debugger");
827+
appendType(cast<OptionalType>(tybase)->getBaseType());
828+
appendOperator("XSq");
829+
return;
830+
817831
case TypeKind::Dictionary:
818-
return appendSugaredType<SyntaxSugarType>(type);
832+
assert(DWARFMangling && "sugared types are only legal for the debugger");
833+
appendType(cast<DictionaryType>(tybase)->getKeyType());
834+
appendType(cast<DictionaryType>(tybase)->getValueType());
835+
appendOperator("XSD");
836+
return;
819837

820838
case TypeKind::ExistentialMetatype: {
821839
ExistentialMetatypeType *EMT = cast<ExistentialMetatypeType>(tybase);
@@ -1701,28 +1719,24 @@ void ASTMangler::appendAnyGenericType(const GenericTypeDecl *decl) {
17011719
if (tryAppendStandardSubstitution(decl))
17021720
return;
17031721

1722+
auto *nominal = dyn_cast<NominalTypeDecl>(decl);
1723+
17041724
// For generic types, this uses the unbound type.
1705-
Type key;
1706-
if (auto *alias = dyn_cast<TypeAliasDecl>(decl)) {
1707-
if (alias->isGeneric())
1708-
key = alias->getUnboundGenericType();
1709-
else
1710-
key = alias->getDeclaredInterfaceType();
1725+
if (nominal) {
1726+
if (tryMangleTypeSubstitution(nominal->getDeclaredType()))
1727+
return;
17111728
} else {
1712-
key = cast<NominalTypeDecl>(decl)->getDeclaredType();
1729+
if (tryMangleSubstitution(cast<TypeAliasDecl>(decl)))
1730+
return;
17131731
}
17141732

1715-
// Try to mangle the entire name as a substitution.
1716-
if (tryMangleTypeSubstitution(key))
1717-
return;
17181733

17191734
// Try to mangle a symbolic reference for a nominal type.
17201735
if (AllowSymbolicReferences) {
1721-
auto nominal = key->getAnyNominal();
17221736
if (nominal && (!CanSymbolicReference || CanSymbolicReference(nominal))) {
17231737
appendSymbolicReference(nominal);
17241738
// Substitutions can refer back to the symbolic reference.
1725-
addTypeSubstitution(key);
1739+
addTypeSubstitution(nominal->getDeclaredType());
17261740
return;
17271741
}
17281742
}
@@ -1785,7 +1799,10 @@ void ASTMangler::appendAnyGenericType(const GenericTypeDecl *decl) {
17851799
}
17861800
}
17871801

1788-
addTypeSubstitution(key);
1802+
if (nominal)
1803+
addTypeSubstitution(nominal->getDeclaredType());
1804+
else
1805+
addSubstitution(cast<TypeAliasDecl>(decl));
17891806
}
17901807

17911808
void ASTMangler::appendFunction(AnyFunctionType *fn, bool isFunctionMangling) {

lib/Demangling/Demangler.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2655,6 +2655,27 @@ NodePointer Demangler::demangleSpecialType() {
26552655
}
26562656
case 'e':
26572657
return createType(createNode(Node::Kind::ErrorType));
2658+
case 'S':
2659+
// Sugared type for debugger.
2660+
switch (nextChar()) {
2661+
case 'q':
2662+
return createType(createWithChild(Node::Kind::SugaredOptional,
2663+
popNode(Node::Kind::Type)));
2664+
case 'a':
2665+
return createType(createWithChild(Node::Kind::SugaredArray,
2666+
popNode(Node::Kind::Type)));
2667+
case 'D': {
2668+
NodePointer value = popNode(Node::Kind::Type);
2669+
NodePointer key = popNode(Node::Kind::Type);
2670+
return createType(createWithChildren(Node::Kind::SugaredDictionary,
2671+
key, value));
2672+
}
2673+
case 'p':
2674+
return createType(createWithChild(Node::Kind::SugaredParen,
2675+
popNode(Node::Kind::Type)));
2676+
default:
2677+
return nullptr;
2678+
}
26582679
default:
26592680
return nullptr;
26602681
}

lib/Demangling/NodePrinter.cpp

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@ class NodePrinter {
303303
case Node::Kind::TypeList:
304304
case Node::Kind::LabelList:
305305
case Node::Kind::TypeSymbolicReference:
306+
case Node::Kind::SugaredOptional:
307+
case Node::Kind::SugaredArray:
308+
case Node::Kind::SugaredDictionary:
309+
case Node::Kind::SugaredParen:
306310
return true;
307311

308312
case Node::Kind::ProtocolList:
@@ -508,6 +512,15 @@ class NodePrinter {
508512
printer_unreachable("bad node kind");
509513
}
510514

515+
void printWithParens(NodePointer type) {
516+
bool needs_parens = !isSimpleType(type);
517+
if (needs_parens)
518+
Printer << "(";
519+
print(type);
520+
if (needs_parens)
521+
Printer << ")";
522+
}
523+
511524
SugarType findSugar(NodePointer Node) {
512525
if (Node->getNumChildren() == 1 &&
513526
Node->getKind() == Node::Kind::Type)
@@ -595,12 +608,7 @@ class NodePrinter {
595608
case SugarType::Optional:
596609
case SugarType::ImplicitlyUnwrappedOptional: {
597610
NodePointer type = Node->getChild(1)->getChild(0);
598-
bool needs_parens = !isSimpleType(type);
599-
if (needs_parens)
600-
Printer << "(";
601-
print(type);
602-
if (needs_parens)
603-
Printer << ")";
611+
printWithParens(type);
604612
Printer << (sugarType == SugarType::Optional ? "?" : "!");
605613
break;
606614
}
@@ -1731,12 +1739,7 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
17311739
Idx++;
17321740
}
17331741
NodePointer type = Node->getChild(Idx)->getChild(0);
1734-
bool needs_parens = !isSimpleType(type);
1735-
if (needs_parens)
1736-
Printer << "(";
1737-
print(type);
1738-
if (needs_parens)
1739-
Printer << ")";
1742+
printWithParens(type);
17401743
if (isExistentialType(type)) {
17411744
Printer << ".Protocol";
17421745
} else {
@@ -2189,6 +2192,27 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
21892192
Printer << "protocol conformance ref (retroactive) ";
21902193
printChildren(Node);
21912194
return nullptr;
2195+
case Node::Kind::SugaredOptional:
2196+
printWithParens(Node->getChild(0));
2197+
Printer << "?";
2198+
return nullptr;
2199+
case Node::Kind::SugaredArray:
2200+
Printer << "[";
2201+
print(Node->getChild(0));
2202+
Printer << "]";
2203+
return nullptr;
2204+
case Node::Kind::SugaredDictionary:
2205+
Printer << "[";
2206+
print(Node->getChild(0));
2207+
Printer << " : ";
2208+
print(Node->getChild(1));
2209+
Printer << "]";
2210+
return nullptr;
2211+
case Node::Kind::SugaredParen:
2212+
Printer << "(";
2213+
print(Node->getChild(0));
2214+
Printer << ")";
2215+
return nullptr;
21922216
}
21932217
printer_unreachable("bad node kind!");
21942218
}

lib/Demangling/OldRemangler.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,6 +2260,22 @@ void Remangler::mangleProtocolSymbolicReference(Node *node, EntityContext&) {
22602260
unreachable("unsupported");
22612261
}
22622262

2263+
void Remangler::mangleSugaredOptional(Node *node) {
2264+
unreachable("unsupported");
2265+
}
2266+
2267+
void Remangler::mangleSugaredArray(Node *node) {
2268+
unreachable("unsupported");
2269+
}
2270+
2271+
void Remangler::mangleSugaredDictionary(Node *node) {
2272+
unreachable("unsupported");
2273+
}
2274+
2275+
void Remangler::mangleSugaredParen(Node *node) {
2276+
unreachable("unsupported");
2277+
}
2278+
22632279
/// The top-level interface to the remangler.
22642280
std::string Demangle::mangleNodeOld(const NodePointer &node) {
22652281
if (!node) return "";

lib/Demangling/Remangler.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,6 +2307,27 @@ void Remangler::mangleProtocolSymbolicReference(Node *node) {
23072307
(const void *)node->getIndex()));
23082308
}
23092309

2310+
void Remangler::mangleSugaredOptional(Node *node) {
2311+
mangleType(node->getChild(0));
2312+
Buffer << "XSq";
2313+
}
2314+
2315+
void Remangler::mangleSugaredArray(Node *node) {
2316+
mangleType(node->getChild(0));
2317+
Buffer << "XSa";
2318+
}
2319+
2320+
void Remangler::mangleSugaredDictionary(Node *node) {
2321+
mangleType(node->getChild(0));
2322+
mangleType(node->getChild(1));
2323+
Buffer << "XSD";
2324+
}
2325+
2326+
void Remangler::mangleSugaredParen(Node *node) {
2327+
mangleType(node->getChild(0));
2328+
Buffer << "XSp";
2329+
}
2330+
23102331
} // anonymous namespace
23112332

23122333
/// The top-level interface to the remangler.

0 commit comments

Comments
 (0)