mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
AST: Nuke the unqualified archetype mangling
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
CONTEXT_NODE(Allocator)
|
||||
NODE(Archetype)
|
||||
NODE(ArchetypeRef)
|
||||
NODE(ArgumentTuple)
|
||||
NODE(AssociatedType)
|
||||
NODE(AssociatedTypeRef)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user