AST: Nuke the unqualified archetype mangling

This commit is contained in:
Slava Pestov
2016-11-27 23:55:13 -08:00
parent 1a22a8d6b5
commit ee295ddbb8
11 changed files with 46 additions and 166 deletions

View File

@@ -1056,8 +1056,6 @@ Types
assoc-type-list ::= assoc-type-name '_' assoc-type-name*
archetype ::= 'Q' INDEX // archetype with depth=0, idx=N
archetype ::= 'Qd' INDEX INDEX // archetype with depth=M+1, idx=N
archetype ::= context 'Qq' INDEX // archetype+context (DWARF only)
archetype ::= associated-type

View File

@@ -26,7 +26,6 @@
CONTEXT_NODE(Allocator)
NODE(Archetype)
NODE(ArchetypeRef)
NODE(ArgumentTuple)
NODE(AssociatedType)
NODE(AssociatedTypeRef)

View File

@@ -568,6 +568,8 @@ void ASTMangler::appendType(Type type) {
case TypeKind::Archetype: {
auto *archetype = cast<ArchetypeType>(tybase);
assert(DWARFMangling && "Cannot mangle free-standing archetypes");
// Mangle the associated type of a parent archetype.
if (auto parent = archetype->getParent()) {
assert(archetype->getAssocType()
@@ -591,7 +593,6 @@ void ASTMangler::appendType(Type type) {
auto GTPT = DC->mapTypeOutOfContext(archetype)
->castTo<GenericTypeParamType>();
if (DWARFMangling) {
Buffer << 'q' << Index(GTPT->getIndex());
// The DWARF output created by Swift is intentionally flat,
@@ -610,12 +611,6 @@ void ASTMangler::appendType(Type type) {
DWARFMangling = true;
return appendOperator("Qq", Index(GTPT->getIndex()));
}
if (GTPT->getDepth() != 0) {
return appendOperator("Qd", Index(GTPT->getDepth() - 1),
Index(GTPT->getIndex()));
}
return appendOperator("Q", Index(GTPT->getIndex()));
}
case TypeKind::DynamicSelf: {
auto dynamicSelf = cast<DynamicSelfType>(tybase);

View File

@@ -1132,6 +1132,8 @@ void Mangler::mangleType(Type type, unsigned uncurryLevel) {
case TypeKind::Archetype: {
auto *archetype = cast<ArchetypeType>(tybase);
assert(DWARFMangling && "Cannot mangle free-standing archetypes");
// archetype ::= associated-type
// associated-type ::= substitution
@@ -1161,7 +1163,6 @@ void Mangler::mangleType(Type type, unsigned uncurryLevel) {
auto GTPT = DC->mapTypeOutOfContext(archetype)
->castTo<GenericTypeParamType>();
if (DWARFMangling) {
Buffer << 'q' << Index(GTPT->getIndex());
{
@@ -1185,12 +1186,6 @@ void Mangler::mangleType(Type type, unsigned uncurryLevel) {
ContextMangler.finalize(Buffer);
}
} else {
if (GTPT->getDepth() != 0) {
Buffer << 'd' << Index(GTPT->getDepth() - 1);
}
Buffer << Index(GTPT->getIndex());
}
return;
}

View File

@@ -1421,15 +1421,6 @@ private:
return entity;
}
NodePointer demangleArchetypeRef(Node::IndexType depth, Node::IndexType i) {
// FIXME: Name won't match demangled context generic signatures correctly.
auto ref = NodeFactory::create(Node::Kind::ArchetypeRef,
archetypeName(i, depth));
ref->addChild(NodeFactory::create(Node::Kind::Index, depth));
ref->addChild(NodeFactory::create(Node::Kind::Index, i));
return ref;
}
NodePointer getDependentGenericParamType(unsigned depth, unsigned index) {
DemanglerPrinter PrintName;
PrintName << archetypeName(index, depth);
@@ -1773,14 +1764,6 @@ private:
NodePointer stdlib = NodeFactory::create(Node::Kind::Module, STDLIB_NAME);
return makeAssociatedType(stdlib);
}
if (Mangled.nextIf('d')) {
Node::IndexType depth, index;
if (!demangleIndex(depth))
return nullptr;
if (!demangleIndex(index))
return nullptr;
return demangleArchetypeRef(depth + 1, index);
}
if (Mangled.nextIf('q')) {
NodePointer index = demangleIndexAsNode();
if (!index)
@@ -1795,10 +1778,7 @@ private:
qual_atype->addChild(decl_ctx);
return qual_atype;
}
Node::IndexType index;
if (!demangleIndex(index))
return nullptr;
return demangleArchetypeRef(0, index);
}
NodePointer demangleTuple(IsVariadic isV) {
@@ -2449,7 +2429,6 @@ private:
bool isSimpleType(NodePointer pointer) {
switch (pointer->getKind()) {
case Node::Kind::Archetype:
case Node::Kind::ArchetypeRef:
case Node::Kind::AssociatedType:
case Node::Kind::AssociatedTypeRef:
case Node::Kind::BoundGenericClass:
@@ -3574,9 +3553,6 @@ void NodePrinter::print(NodePointer pointer, bool asContext, bool suppressType)
Printer << pointer->getText();
return;
}
case Node::Kind::ArchetypeRef:
Printer << pointer->getText();
return;
case Node::Kind::AssociatedTypeRef:
print(pointer->getChild(0));
Printer << '.' << pointer->getChild(1)->getText();

View File

@@ -885,24 +885,8 @@ static std::string getArchetypeName(Node::IndexType index,
return std::move(name).str();
}
NodePointer Demangler::createArchetypeRef(int depth, int i) {
if (depth < 0 || i < 0)
return nullptr;
// FIXME: Name won't match demangled context generic signatures correctly.
auto ref = NodeFactory::create(Node::Kind::ArchetypeRef,
getArchetypeName(i, depth));
ref->addChild(NodeFactory::create(Node::Kind::Index, depth));
ref->addChild(NodeFactory::create(Node::Kind::Index, i));
return createType(ref);
}
NodePointer Demangler::demangleArchetype() {
int index = demangleIndex();
if (index >= 0)
return createArchetypeRef(0, index);
switch (nextChar()) {
case 'a': {
NodePointer Ident = popNode(Node::Kind::Identifier);
@@ -912,11 +896,6 @@ NodePointer Demangler::demangleArchetype() {
addSubstitution(AssocTy);
return AssocTy;
}
case 'd': {
int depth = demangleIndex() + 1;
int index = demangleIndex();
return createArchetypeRef(depth, index);
}
case 'q': {
NodePointer Idx = demangleIndexAsNode();
NodePointer Ctx = popContext();
@@ -924,9 +903,6 @@ NodePointer Demangler::demangleArchetype() {
return createType(createWithChildren(Node::Kind::QualifiedArchetype,
Idx, DeclCtx));
}
case 'P':
// TODO: self type of protocol
return nullptr;
case 'y': {
NodePointer T = demangleAssociatedTypeSimple(demangleGenericParamIndex());
addSubstitution(T);

View File

@@ -1388,18 +1388,6 @@ void Remangler::mangleAssociatedType(Node *node) {
}
}
void Remangler::mangleArchetypeRef(Node *node) {
Node::IndexType relativeDepth = node->getChild(0)->getIndex();
Node::IndexType index = node->getChild(1)->getIndex();
Out << 'Q';
if (relativeDepth != 0) {
Out << 'd';
mangleIndex(relativeDepth - 1);
}
mangleIndex(index);
}
void Remangler::mangleQualifiedArchetype(Node *node) {
Out << "Qq";
mangleChildNodes(node); // index, declcontext

View File

@@ -474,18 +474,6 @@ void Remangler::mangleArchetype(Node *node) {
unreachable("unsupported node");
}
void Remangler::mangleArchetypeRef(Node *node) {
Node::IndexType relativeDepth = node->getChild(0)->getIndex();
Node::IndexType index = node->getChild(1)->getIndex();
Buffer << 'Q';
if (relativeDepth != 0) {
Buffer << 'd';
mangleIndex(relativeDepth - 1);
}
mangleIndex(index);
}
void Remangler::mangleArgumentTuple(Node *node) {
Node *Ty = getSingleChild(node, Node::Kind::Type);
Node *Child = getSingleChild(Ty);

View File

@@ -755,37 +755,6 @@ static void VisitNodeArchetype(
}
}
static void VisitNodeArchetypeRef(
ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
Demangle::NodePointer &cur_node, VisitNodeResult &result,
const VisitNodeResult &generic_context) { // set by GenericType case
const StringRef &archetype_name(cur_node->getText());
Type result_type;
for (const Type &archetype : generic_context._types) {
const ArchetypeType *cast_archetype =
dyn_cast<ArchetypeType>(archetype.getPointer());
if (cast_archetype &&
!cast_archetype->getName().str().compare(archetype_name)) {
result_type = archetype;
break;
}
}
if (result_type)
result._types.push_back(result_type);
else {
if (ast) {
SmallVector<ProtocolDecl *, 1> protocols;
result._types.push_back(ArchetypeType::getNew(
*ast, nullptr, ast->getIdentifier(archetype_name), protocols,
Type(), LayoutConstraint()));
} else {
result._error = "invalid ASTContext";
}
}
}
static void VisitNodeAssociatedTypeRef(
ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
Demangle::NodePointer &cur_node, VisitNodeResult &result,
@@ -1997,10 +1966,6 @@ static void visitNodeImpl(
VisitNodeAddressor(ast, nodes, node, result, genericContext);
break;
case Demangle::Node::Kind::ArchetypeRef:
VisitNodeArchetypeRef(ast, nodes, node, result, genericContext);
break;
case Demangle::Node::Kind::Archetype:
VisitNodeArchetype(ast, nodes, node, result, genericContext);
break;

View File

@@ -215,8 +215,8 @@ _TTSf2dgs___TTSf2s_d___TFVs11_StringCoreCfVs13_StringBufferS_ ---> function sign
_TTSf3d_i_d_i_d_i___TFVs11_StringCoreCfVs13_StringBufferS_ ---> function signature specialization <Arg[0] = Dead, Arg[1] = Value Promoted from Box, Arg[2] = Dead, Arg[3] = Value Promoted from Box, Arg[4] = Dead, Arg[5] = Value Promoted from Box> of Swift._StringCore.init (Swift._StringBuffer) -> Swift._StringCore
_TTSf3d_i_n_i_d_i___TFVs11_StringCoreCfVs13_StringBufferS_ ---> function signature specialization <Arg[0] = Dead, Arg[1] = Value Promoted from Box, Arg[3] = Value Promoted from Box, Arg[4] = Dead, Arg[5] = Value Promoted from Box> of Swift._StringCore.init (Swift._StringBuffer) -> Swift._StringCore
_TFIZvV8mangling10HasVarInit5stateSbiu_KT_Sb ---> static mangling.HasVarInit.(state : Swift.Bool).(variable initialization expression).(implicit closure #1)
_TFFV23interface_type_mangling18GenericTypeContext23closureInGenericContexturFqd__T_L_3fooFTQd__Q__T_ ---> interface_type_mangling.GenericTypeContext.(closureInGenericContext <A> (A1) -> ()).(foo #1) (A1, A) -> ()
_TFFV23interface_type_mangling18GenericTypeContextg31closureInGenericPropertyContextxL_3fooFT_Q_ ---> interface_type_mangling.GenericTypeContext.(closureInGenericPropertyContext.getter : A).(foo #1) () -> A
_TFFV23interface_type_mangling18GenericTypeContext23closureInGenericContexturFqd__T_L_3fooFTqd__x_T_ ---> interface_type_mangling.GenericTypeContext.(closureInGenericContext <A> (A1) -> ()).(foo #1) (A1, A) -> ()
_TFFV23interface_type_mangling18GenericTypeContextg31closureInGenericPropertyContextxL_3fooFT_x ---> interface_type_mangling.GenericTypeContext.(closureInGenericPropertyContext.getter : A).(foo #1) () -> A
_TTWurGV23interface_type_mangling18GenericTypeContextx_S_18GenericWitnessTestS_FS1_23closureInGenericContextuRxS1_rfqd__T_ ---> protocol witness for interface_type_mangling.GenericWitnessTest.closureInGenericContext <A where A: interface_type_mangling.GenericWitnessTest> (A1) -> () in conformance <A> interface_type_mangling.GenericTypeContext<A> : interface_type_mangling.GenericWitnessTest in interface_type_mangling
_TTWurGV23interface_type_mangling18GenericTypeContextx_S_18GenericWitnessTestS_FS1_g31closureInGenericPropertyContextwx3Tee ---> protocol witness for interface_type_mangling.GenericWitnessTest.closureInGenericPropertyContext.getter : A.Tee in conformance <A> interface_type_mangling.GenericTypeContext<A> : interface_type_mangling.GenericWitnessTest in interface_type_mangling
_TTWurGV23interface_type_mangling18GenericTypeContextx_S_18GenericWitnessTestS_FS1_16twoParamsAtDepthu0_RxS1_rfTqd__1yqd_0__T_ ---> protocol witness for interface_type_mangling.GenericWitnessTest.twoParamsAtDepth <A, B where A: interface_type_mangling.GenericWitnessTest> (A1, y : B1) -> () in conformance <A> interface_type_mangling.GenericTypeContext<A> : interface_type_mangling.GenericWitnessTest in interface_type_mangling

View File

@@ -176,7 +176,7 @@ _TtPMP_ ---> Any.Type
_TFCs13_NSSwiftArray29canStoreElementsOfDynamicTypefPMP_Sb ---> _NSSwiftArray.canStoreElementsOfDynamicType(Any.Type) -> Bool
_TFCs13_NSSwiftArrayg17staticElementTypePMP_ ---> _NSSwiftArray.staticElementType.getter
_TFCs17_DictionaryMirrorg9valueTypePMP_ ---> _DictionaryMirror.valueType.getter
_TPA__TFFVs11GeneratorOfcuRd__s13GeneratorTyperFqd__GS_x_U_FT_GSqQd___ ---> partial apply for GeneratorOf.(init<A where ...> (A1) -> GeneratorOf<A>).(closure #1)
_TPA__TFFVs11GeneratorOfcuRd__s13GeneratorTyperFqd__GS_x_U_FT_GSqx_ ---> partial apply for GeneratorOf.(init<A where ...> (A1) -> GeneratorOf<A>).(closure #1)
_TTSf1cl35_TFF7specgen6callerFSiT_U_FTSiSi_T_Si___TF7specgen12take_closureFFTSiSi_T_T_ ---> specialized take_closure((Int, Int) -> ()) -> ()
_TTSf1cl35_TFF7specgen6callerFSiT_U_FTSiSi_T_Si___TTSg5Si___TF7specgen12take_closureFFTSiSi_T_T_ ---> specialized specialized take_closure((Int, Int) -> ()) -> ()
_TTSg5Si___TTSf1cl35_TFF7specgen6callerFSiT_U_FTSiSi_T_Si___TF7specgen12take_closureFFTSiSi_T_T_ ---> specialized specialized take_closure((Int, Int) -> ()) -> ()
@@ -190,8 +190,8 @@ _TTSf2dgs___TTSf2s_d___TFVs11_StringCoreCfVs13_StringBufferS_ ---> specialized s
_TTSf3d_i_d_i_d_i___TFVs11_StringCoreCfVs13_StringBufferS_ ---> specialized _StringCore.init(_StringBuffer) -> _StringCore
_TTSf3d_i_n_i_d_i___TFVs11_StringCoreCfVs13_StringBufferS_ ---> specialized _StringCore.init(_StringBuffer) -> _StringCore
_TFIZvV8mangling10HasVarInit5stateSbiu_KT_Sb ---> static HasVarInit.(state).(variable initialization expression).(implicit closure #1)
_TFFV23interface_type_mangling18GenericTypeContext23closureInGenericContexturFqd__T_L_3fooFTQd__x_T_ ---> GenericTypeContext.(closureInGenericContext<A> (A1) -> ()).(foo #1)(A1, A) -> ()
_TFFV23interface_type_mangling18GenericTypeContextg31closureInGenericPropertyContextxL_3fooFT_Q_ ---> GenericTypeContext.(closureInGenericPropertyContext.getter).(foo #1)() -> A
_TFFV23interface_type_mangling18GenericTypeContext23closureInGenericContexturFqd__T_L_3fooFTqd__x_T_ ---> GenericTypeContext.(closureInGenericContext<A> (A1) -> ()).(foo #1)(A1, A) -> ()
_TFFV23interface_type_mangling18GenericTypeContextg31closureInGenericPropertyContextxL_3fooFT_x ---> GenericTypeContext.(closureInGenericPropertyContext.getter).(foo #1)() -> A
_TTWurGV23interface_type_mangling18GenericTypeContextx_S_18GenericWitnessTestS_FS1_23closureInGenericContextu_RxS1_rfqd__T_ ---> protocol witness for GenericWitnessTest.closureInGenericContext<A where ...> (A1) -> () in conformance <A> GenericTypeContext<A>
_TTWurGV23interface_type_mangling18GenericTypeContextx_S_18GenericWitnessTestS_FS1_g31closureInGenericPropertyContextwx3Tee ---> protocol witness for GenericWitnessTest.closureInGenericPropertyContext.getter in conformance <A> GenericTypeContext<A>
_TTWurGV23interface_type_mangling18GenericTypeContextx_S_18GenericWitnessTestS_FS1_16twoParamsAtDepthu0_RxS1_rfTqd__1yqd_0__T_ ---> protocol witness for GenericWitnessTest.twoParamsAtDepth<A, B where ...> (A1, y : B1) -> () in conformance <A> GenericTypeContext<A>