Skip to content

Commit 3d9dc0c

Browse files
committed
[ReconstructType] Factor the giant switch out of VisitNode NFC
Make the control flow clearer by factoring out the switch. There was a single key line burried under there where the node is popped. Incidentally rename the lonely snake_case parameter to this functiong, since we're modifying every line anyway.
1 parent 381caaa commit 3d9dc0c

File tree

1 file changed

+148
-139
lines changed

1 file changed

+148
-139
lines changed

lib/IDE/ReconstructType.cpp

Lines changed: 148 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,7 @@ static TypeBase *FixCallingConv(Decl *in_decl, TypeBase *in_type) {
771771
static void
772772
VisitNode(ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
773773
VisitNodeResult &result,
774-
const VisitNodeResult &generic_context); // set by GenericType case
774+
const VisitNodeResult &genericContext); // set by GenericType case
775775

776776
static void VisitNodeAddressor(
777777
ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
@@ -2142,178 +2142,187 @@ static void VisitAllChildNodes(
21422142
}
21432143
}
21442144

2145-
static void
2146-
VisitNode(ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
2147-
VisitNodeResult &result,
2148-
const VisitNodeResult &generic_context) { // set by GenericType case
2149-
if (nodes.empty())
2150-
result._error = "no node";
2151-
else if (nodes.back() == nullptr)
2152-
result._error = "last node is NULL";
2153-
else
2154-
result._error = "";
2145+
static void visitNodeImpl(
2146+
ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
2147+
Demangle::NodePointer node, VisitNodeResult &result,
2148+
const VisitNodeResult &genericContext) { // set by GenericType case
2149+
assert(result._error.empty());
2150+
assert(nodes.back() == node);
2151+
2152+
const Demangle::Node::Kind nodeKind = node->getKind();
2153+
2154+
switch (nodeKind) {
2155+
case Demangle::Node::Kind::OwningAddressor:
2156+
case Demangle::Node::Kind::OwningMutableAddressor:
2157+
case Demangle::Node::Kind::UnsafeAddressor:
2158+
case Demangle::Node::Kind::UnsafeMutableAddressor:
2159+
VisitNodeAddressor(ast, nodes, node, result, genericContext);
2160+
break;
21552161

2156-
if (result._error.empty()) {
2157-
Demangle::NodePointer node = nodes.back();
2158-
const Demangle::Node::Kind node_kind = node->getKind();
2162+
case Demangle::Node::Kind::Generics:
2163+
VisitNodeGenerics(ast, nodes, node, result, genericContext);
2164+
break;
21592165

2160-
switch (node_kind) {
2161-
case Demangle::Node::Kind::OwningAddressor:
2162-
case Demangle::Node::Kind::OwningMutableAddressor:
2163-
case Demangle::Node::Kind::UnsafeAddressor:
2164-
case Demangle::Node::Kind::UnsafeMutableAddressor:
2165-
VisitNodeAddressor(ast, nodes, node, result, generic_context);
2166-
break;
2166+
case Demangle::Node::Kind::ArchetypeRef:
2167+
VisitNodeArchetypeRef(ast, nodes, node, result, genericContext);
2168+
break;
21672169

2168-
case Demangle::Node::Kind::Generics:
2169-
VisitNodeGenerics(ast, nodes, node, result, generic_context);
2170-
break;
2170+
case Demangle::Node::Kind::Archetype:
2171+
VisitNodeArchetype(ast, nodes, node, result, genericContext);
2172+
break;
21712173

2172-
case Demangle::Node::Kind::ArchetypeRef:
2173-
VisitNodeArchetypeRef(ast, nodes, node, result, generic_context);
2174-
break;
2174+
case Demangle::Node::Kind::ArgumentTuple:
2175+
VisitFirstChildNode(ast, nodes, node, result, genericContext);
2176+
break;
21752177

2176-
case Demangle::Node::Kind::Archetype:
2177-
VisitNodeArchetype(ast, nodes, node, result, generic_context);
2178-
break;
2178+
case Demangle::Node::Kind::AssociatedTypeRef:
2179+
VisitNodeAssociatedTypeRef(ast, nodes, node, result, genericContext);
2180+
break;
21792181

2180-
case Demangle::Node::Kind::ArgumentTuple:
2181-
VisitFirstChildNode(ast, nodes, node, result, generic_context);
2182-
break;
2182+
case Demangle::Node::Kind::BoundGenericClass:
2183+
case Demangle::Node::Kind::BoundGenericStructure:
2184+
case Demangle::Node::Kind::BoundGenericEnum:
2185+
VisitNodeBoundGeneric(ast, nodes, node, result, genericContext);
2186+
break;
21832187

2184-
case Demangle::Node::Kind::AssociatedTypeRef:
2185-
VisitNodeAssociatedTypeRef(ast, nodes, node, result, generic_context);
2186-
break;
2188+
case Demangle::Node::Kind::BuiltinTypeName:
2189+
VisitNodeBuiltinTypeName(ast, nodes, node, result, genericContext);
2190+
break;
21872191

2188-
case Demangle::Node::Kind::BoundGenericClass:
2189-
case Demangle::Node::Kind::BoundGenericStructure:
2190-
case Demangle::Node::Kind::BoundGenericEnum:
2191-
VisitNodeBoundGeneric(ast, nodes, node, result, generic_context);
2192-
break;
2192+
case Demangle::Node::Kind::Structure:
2193+
case Demangle::Node::Kind::Class:
2194+
case Demangle::Node::Kind::Enum:
2195+
case Demangle::Node::Kind::Global:
2196+
case Demangle::Node::Kind::Static:
2197+
case Demangle::Node::Kind::TypeAlias:
2198+
case Demangle::Node::Kind::Type:
2199+
case Demangle::Node::Kind::TypeMangling:
2200+
case Demangle::Node::Kind::ReturnType:
2201+
case Demangle::Node::Kind::Protocol:
2202+
VisitAllChildNodes(ast, nodes, node, result, genericContext);
2203+
break;
21932204

2194-
case Demangle::Node::Kind::BuiltinTypeName:
2195-
VisitNodeBuiltinTypeName(ast, nodes, node, result, generic_context);
2196-
break;
2205+
case Demangle::Node::Kind::Constructor:
2206+
VisitNodeConstructor(ast, nodes, node, result, genericContext);
2207+
break;
21972208

2198-
case Demangle::Node::Kind::Structure:
2199-
case Demangle::Node::Kind::Class:
2200-
case Demangle::Node::Kind::Enum:
2201-
case Demangle::Node::Kind::Global:
2202-
case Demangle::Node::Kind::Static:
2203-
case Demangle::Node::Kind::TypeAlias:
2204-
case Demangle::Node::Kind::Type:
2205-
case Demangle::Node::Kind::TypeMangling:
2206-
case Demangle::Node::Kind::ReturnType:
2207-
case Demangle::Node::Kind::Protocol:
2208-
VisitAllChildNodes(ast, nodes, node, result, generic_context);
2209-
break;
2209+
case Demangle::Node::Kind::Destructor:
2210+
VisitNodeDestructor(ast, nodes, node, result, genericContext);
2211+
break;
22102212

2211-
case Demangle::Node::Kind::Constructor:
2212-
VisitNodeConstructor(ast, nodes, node, result, generic_context);
2213-
break;
2213+
case Demangle::Node::Kind::DeclContext:
2214+
VisitNodeDeclContext(ast, nodes, node, result, genericContext);
2215+
break;
22142216

2215-
case Demangle::Node::Kind::Destructor:
2216-
VisitNodeDestructor(ast, nodes, node, result, generic_context);
2217-
break;
2217+
case Demangle::Node::Kind::ErrorType:
2218+
result._error = "error type encountered while demangling name";
2219+
break;
22182220

2219-
case Demangle::Node::Kind::DeclContext:
2220-
VisitNodeDeclContext(ast, nodes, node, result, generic_context);
2221-
break;
2221+
case Demangle::Node::Kind::Extension:
2222+
VisitNodeExtension(ast, nodes, node, result, genericContext);
2223+
break;
22222224

2223-
case Demangle::Node::Kind::ErrorType:
2224-
result._error = "error type encountered while demangling name";
2225-
break;
2225+
case Demangle::Node::Kind::ExplicitClosure:
2226+
VisitNodeExplicitClosure(ast, nodes, node, result, genericContext);
2227+
break;
22262228

2227-
case Demangle::Node::Kind::Extension:
2228-
VisitNodeExtension(ast, nodes, node, result, generic_context);
2229-
break;
2229+
case Demangle::Node::Kind::Function:
2230+
case Demangle::Node::Kind::Allocator:
2231+
case Demangle::Node::Kind::Variable: // Out of order on purpose
2232+
VisitNodeFunction(ast, nodes, node, result, genericContext);
2233+
break;
22302234

2231-
case Demangle::Node::Kind::ExplicitClosure:
2232-
VisitNodeExplicitClosure(ast, nodes, node, result, generic_context);
2233-
break;
2235+
case Demangle::Node::Kind::FunctionType:
2236+
case Demangle::Node::Kind::UncurriedFunctionType: // Out of order on
2237+
// purpose.
2238+
VisitNodeFunctionType(ast, nodes, node, result, genericContext);
2239+
break;
22342240

2235-
case Demangle::Node::Kind::Function:
2236-
case Demangle::Node::Kind::Allocator:
2237-
case Demangle::Node::Kind::Variable: // Out of order on purpose
2238-
VisitNodeFunction(ast, nodes, node, result, generic_context);
2239-
break;
2241+
case Demangle::Node::Kind::GenericType:
2242+
VisitNodeGenericType(ast, nodes, node, result, genericContext);
2243+
break;
22402244

2241-
case Demangle::Node::Kind::FunctionType:
2242-
case Demangle::Node::Kind::UncurriedFunctionType: // Out of order on
2243-
// purpose.
2244-
VisitNodeFunctionType(ast, nodes, node, result, generic_context);
2245-
break;
2245+
case Demangle::Node::Kind::DidSet:
2246+
case Demangle::Node::Kind::Getter:
2247+
case Demangle::Node::Kind::Setter:
2248+
case Demangle::Node::Kind::WillSet: // out of order on purpose
2249+
VisitNodeSetterGetter(ast, nodes, node, result, genericContext);
2250+
break;
22462251

2247-
case Demangle::Node::Kind::GenericType:
2248-
VisitNodeGenericType(ast, nodes, node, result, generic_context);
2249-
break;
2252+
case Demangle::Node::Kind::LocalDeclName:
2253+
VisitNodeLocalDeclName(ast, nodes, node, result, genericContext);
2254+
break;
22502255

2251-
case Demangle::Node::Kind::DidSet:
2252-
case Demangle::Node::Kind::Getter:
2253-
case Demangle::Node::Kind::Setter:
2254-
case Demangle::Node::Kind::WillSet: // out of order on purpose
2255-
VisitNodeSetterGetter(ast, nodes, node, result, generic_context);
2256-
break;
2256+
case Demangle::Node::Kind::Identifier:
2257+
VisitNodeIdentifier(ast, nodes, node, result, genericContext);
2258+
break;
22572259

2258-
case Demangle::Node::Kind::LocalDeclName:
2259-
VisitNodeLocalDeclName(ast, nodes, node, result, generic_context);
2260-
break;
2260+
case Demangle::Node::Kind::InOut:
2261+
VisitNodeInOut(ast, nodes, node, result, genericContext);
2262+
break;
22612263

2262-
case Demangle::Node::Kind::Identifier:
2263-
VisitNodeIdentifier(ast, nodes, node, result, generic_context);
2264-
break;
2264+
case Demangle::Node::Kind::Metatype:
2265+
VisitNodeMetatype(ast, nodes, node, result, genericContext);
2266+
break;
22652267

2266-
case Demangle::Node::Kind::InOut:
2267-
VisitNodeInOut(ast, nodes, node, result, generic_context);
2268-
break;
2268+
case Demangle::Node::Kind::Module:
2269+
VisitNodeModule(ast, nodes, node, result, genericContext);
2270+
break;
22692271

2270-
case Demangle::Node::Kind::Metatype:
2271-
VisitNodeMetatype(ast, nodes, node, result, generic_context);
2272-
break;
2272+
case Demangle::Node::Kind::NonVariadicTuple:
2273+
VisitNodeNonVariadicTuple(ast, nodes, node, result, genericContext);
2274+
break;
22732275

2274-
case Demangle::Node::Kind::Module:
2275-
VisitNodeModule(ast, nodes, node, result, generic_context);
2276-
break;
2276+
case Demangle::Node::Kind::PrivateDeclName:
2277+
VisitNodePrivateDeclName(ast, nodes, node, result, genericContext);
2278+
break;
22772279

2278-
case Demangle::Node::Kind::NonVariadicTuple:
2279-
VisitNodeNonVariadicTuple(ast, nodes, node, result, generic_context);
2280-
break;
2280+
case Demangle::Node::Kind::ProtocolList:
2281+
VisitNodeProtocolList(ast, nodes, node, result, genericContext);
2282+
break;
22812283

2282-
case Demangle::Node::Kind::PrivateDeclName:
2283-
VisitNodePrivateDeclName(ast, nodes, node, result, generic_context);
2284-
break;
2284+
case Demangle::Node::Kind::QualifiedArchetype:
2285+
VisitNodeQualifiedArchetype(ast, nodes, node, result, genericContext);
2286+
break;
22852287

2286-
case Demangle::Node::Kind::ProtocolList:
2287-
VisitNodeProtocolList(ast, nodes, node, result, generic_context);
2288-
break;
2288+
case Demangle::Node::Kind::SelfTypeRef:
2289+
VisitNodeSelfTypeRef(ast, nodes, node, result, genericContext);
2290+
break;
22892291

2290-
case Demangle::Node::Kind::QualifiedArchetype:
2291-
VisitNodeQualifiedArchetype(ast, nodes, node, result, generic_context);
2292-
break;
2292+
case Demangle::Node::Kind::TupleElement:
2293+
VisitNodeTupleElement(ast, nodes, node, result, genericContext);
2294+
break;
22932295

2294-
case Demangle::Node::Kind::SelfTypeRef:
2295-
VisitNodeSelfTypeRef(ast, nodes, node, result, generic_context);
2296-
break;
2296+
case Demangle::Node::Kind::TypeList:
2297+
VisitNodeTypeList(ast, nodes, node, result, genericContext);
2298+
break;
22972299

2298-
case Demangle::Node::Kind::TupleElement:
2299-
VisitNodeTupleElement(ast, nodes, node, result, generic_context);
2300-
break;
2300+
case Demangle::Node::Kind::Unowned:
2301+
VisitNodeUnowned(ast, nodes, node, result, genericContext);
2302+
break;
23012303

2302-
case Demangle::Node::Kind::TypeList:
2303-
VisitNodeTypeList(ast, nodes, node, result, generic_context);
2304-
break;
2304+
case Demangle::Node::Kind::Weak:
2305+
VisitNodeWeak(ast, nodes, node, result, genericContext);
2306+
break;
2307+
default:
2308+
break;
2309+
}
2310+
}
23052311

2306-
case Demangle::Node::Kind::Unowned:
2307-
VisitNodeUnowned(ast, nodes, node, result, generic_context);
2308-
break;
2312+
static void
2313+
VisitNode(ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
2314+
VisitNodeResult &result,
2315+
const VisitNodeResult &genericContext) { // set by GenericType case
2316+
if (nodes.empty())
2317+
result._error = "no node";
2318+
else if (nodes.back() == nullptr)
2319+
result._error = "last node is NULL";
2320+
else
2321+
result._error = "";
2322+
2323+
if (result._error.empty())
2324+
visitNodeImpl(ast, nodes, nodes.back(), result, genericContext);
23092325

2310-
case Demangle::Node::Kind::Weak:
2311-
VisitNodeWeak(ast, nodes, node, result, generic_context);
2312-
break;
2313-
default:
2314-
break;
2315-
}
2316-
}
23172326
nodes.pop_back();
23182327
}
23192328

0 commit comments

Comments
 (0)