Skip to content

Commit c96090f

Browse files
committed
Parser.cpp: refactor unused function ResolveTypeLoc + implement
1 parent 2e1133d commit c96090f

File tree

1 file changed

+32
-61
lines changed

1 file changed

+32
-61
lines changed

Diff for: src/CppParser/Parser.cpp

+32-61
Original file line numberDiff line numberDiff line change
@@ -2162,34 +2162,46 @@ static PrimitiveType WalkBuiltinType(const clang::BuiltinType* Builtin)
21622162

21632163
//-----------------------------------//
21642164

2165-
clang::TypeLoc ResolveTypeLoc(clang::TypeLoc TL, clang::TypeLoc::TypeLocClass Class)
2165+
clang::TypeLoc ResolveTypeLoc(clang::TypeLoc TL, bool isRecursive = true, const std::vector<clang::TypeLoc::TypeLocClass>& Classes = {})
21662166
{
21672167
using namespace clang;
21682168

21692169
auto TypeLocClass = TL.getTypeLocClass();
21702170

2171-
if (TypeLocClass == Class)
2171+
if (std::find(Classes.begin(), Classes.end(), TypeLocClass) != Classes.end())
21722172
{
21732173
return TL;
21742174
}
2175-
if (TypeLocClass == TypeLoc::Qualified)
2175+
else if (TypeLocClass == TypeLoc::Qualified)
21762176
{
21772177
auto UTL = TL.getUnqualifiedLoc();
21782178
TL = UTL;
2179+
if (isRecursive)
2180+
{
2181+
return ResolveTypeLoc(TL, isRecursive, Classes);
2182+
}
21792183
}
21802184
else if (TypeLocClass == TypeLoc::Elaborated)
21812185
{
21822186
auto ETL = TL.getAs<ElaboratedTypeLoc>();
21832187
auto ITL = ETL.getNextTypeLoc();
21842188
TL = ITL;
2189+
if (isRecursive)
2190+
{
2191+
return ResolveTypeLoc(TL, isRecursive, Classes);
2192+
}
21852193
}
2186-
else if (TypeLocClass == TypeLoc::Paren)
2194+
else if (!Classes.empty())
21872195
{
2188-
auto PTL = TL.getAs<ParenTypeLoc>();
2189-
TL = PTL.getNextTypeLoc();
2196+
auto ITL = TL.getNextTypeLoc();
2197+
TL = ITL;
2198+
if (isRecursive)
2199+
{
2200+
return ResolveTypeLoc(TL, isRecursive, Classes);
2201+
}
21902202
}
21912203

2192-
assert(TL.getTypeLocClass() == Class);
2204+
assert(Classes.empty() || std::find(Classes.begin(), Classes.end(), TL.getTypeLocClass()) != Classes.end());
21932205
return TL;
21942206
}
21952207

@@ -2642,28 +2654,16 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
26422654

26432655
if (LocValid)
26442656
{
2645-
TypeLoc UTL, ETL, ITL;
2646-
auto TypeLocClass = TL->getTypeLocClass();
2647-
if (TypeLocClass == TypeLoc::Qualified)
2648-
{
2649-
UTL = TL->getUnqualifiedLoc();
2650-
TL = &UTL;
2651-
}
2652-
else if (TypeLocClass == TypeLoc::Elaborated)
2653-
{
2654-
ETL = TL->getAs<ElaboratedTypeLoc>();
2655-
ITL = ETL.getNextTypeLoc();
2656-
TL = &ITL;
2657-
}
2657+
TypeLoc resolvedTypeLoc = ResolveTypeLoc(*TL, true, { TypeLoc::TemplateSpecialization , TypeLoc::DependentTemplateSpecialization });
26582658

2659-
if (TL->getTypeLocClass() == TypeLoc::DependentTemplateSpecialization)
2659+
if (resolvedTypeLoc.getTypeLocClass() == TypeLoc::DependentTemplateSpecialization)
26602660
{
2661-
DependentTemplateSpecializationTypeLoc TSpecTL = TL->getAs<DependentTemplateSpecializationTypeLoc>();
2661+
DependentTemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc.getAs<DependentTemplateSpecializationTypeLoc>();
26622662
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
26632663
}
2664-
else if (TL->getTypeLocClass() == TypeLoc::TemplateSpecialization)
2664+
else if (resolvedTypeLoc.getTypeLocClass() == TypeLoc::TemplateSpecialization)
26652665
{
2666-
TemplateSpecializationTypeLoc TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>();
2666+
TemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc.getAs<TemplateSpecializationTypeLoc>();
26672667
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
26682668
}
26692669
else
@@ -2691,28 +2691,16 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
26912691

26922692
if (LocValid)
26932693
{
2694-
TypeLoc UTL, ETL, ITL;
2695-
auto TypeLocClass = TL->getTypeLocClass();
2696-
if (TypeLocClass == TypeLoc::Qualified)
2697-
{
2698-
UTL = TL->getUnqualifiedLoc();
2699-
TL = &UTL;
2700-
}
2701-
else if (TypeLocClass == TypeLoc::Elaborated)
2702-
{
2703-
ETL = TL->getAs<ElaboratedTypeLoc>();
2704-
ITL = ETL.getNextTypeLoc();
2705-
TL = &ITL;
2706-
}
2694+
TypeLoc resolvedTypeLoc = ResolveTypeLoc(*TL, true, { TypeLoc::TemplateSpecialization , TypeLoc::DependentTemplateSpecialization });
27072695

2708-
if (TL->getTypeLocClass() == TypeLoc::DependentTemplateSpecialization)
2696+
if (resolvedTypeLoc.getTypeLocClass() == TypeLoc::DependentTemplateSpecialization)
27092697
{
2710-
DependentTemplateSpecializationTypeLoc TSpecTL = TL->getAs<DependentTemplateSpecializationTypeLoc>();
2698+
DependentTemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc.getAs<DependentTemplateSpecializationTypeLoc>();
27112699
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
27122700
}
2713-
else if (TL->getTypeLocClass() == TypeLoc::TemplateSpecialization)
2701+
else if (resolvedTypeLoc.getTypeLocClass() == TypeLoc::TemplateSpecialization)
27142702
{
2715-
TemplateSpecializationTypeLoc TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>();
2703+
TemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc.getAs<TemplateSpecializationTypeLoc>();
27162704
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
27172705
}
27182706
else
@@ -2741,27 +2729,10 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
27412729

27422730
if (LocValid)
27432731
{
2744-
auto TypeLocClass = TL->getTypeLocClass();
2745-
if (TypeLocClass == TypeLoc::Qualified)
2746-
{
2747-
UTL = TL->getUnqualifiedLoc();
2748-
TL = &UTL;
2749-
}
2750-
else if (TypeLocClass == TypeLoc::Elaborated)
2751-
{
2752-
ETL = TL->getAs<ElaboratedTypeLoc>();
2753-
ITL = ETL.getNextTypeLoc();
2754-
TL = &ITL;
2755-
}
2756-
2757-
while (TL->getTypeLocClass() != TypeLoc::TemplateTypeParm)
2758-
{
2759-
Next = TL->getNextTypeLoc();
2760-
TL = &Next;
2761-
}
2732+
TypeLoc resolvedTypeLoc = ResolveTypeLoc(*TL, true, { TypeLoc::TemplateTypeParm });
27622733

2763-
assert(TL->getTypeLocClass() == TypeLoc::TemplateTypeParm);
2764-
auto TTTL = TL->getAs<TemplateTypeParmTypeLoc>();
2734+
assert(resolvedTypeLoc.getTypeLocClass() == TypeLoc::TemplateTypeParm);
2735+
auto TTTL = resolvedTypeLoc.getAs<TemplateTypeParmTypeLoc>();
27652736

27662737
TPT->parameter = WalkTypeTemplateParameter(TTTL.getDecl());
27672738
}

0 commit comments

Comments
 (0)