Browse Source

Simplified the walking of qualified types in the parser.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/658/head
Dimitar Dobrev 9 years ago
parent
commit
0af26773de
  1. 78
      src/CppParser/Parser.cpp
  2. 3
      src/CppParser/Parser.h

78
src/CppParser/Parser.cpp

@ -462,11 +462,10 @@ static TypeQualifiers GetTypeQualifiers(clang::QualType Type)
return quals; return quals;
} }
static QualifiedType QualifiedType Parser::GetQualifiedType(clang::QualType qual, clang::TypeLoc* TL)
GetQualifiedType(clang::QualType qual, Type* type)
{ {
QualifiedType qualType; QualifiedType qualType;
qualType.Type = type; qualType.Type = WalkType(qual, TL);
qualType.Qualifiers = GetTypeQualifiers(qual); qualType.Qualifiers = GetTypeQualifiers(qual);
return qualType; return qualType;
} }
@ -1032,8 +1031,7 @@ TypeTemplateParameter* Parser::WalkTypeTemplateParameter(clang::TemplateTypeParm
TP->Name = GetDeclName(TTPD); TP->Name = GetDeclName(TTPD);
HandleDeclaration(TTPD, TP); HandleDeclaration(TTPD, TP);
if (TTPD->hasDefaultArgument()) if (TTPD->hasDefaultArgument())
TP->DefaultArgument = GetQualifiedType( TP->DefaultArgument = GetQualifiedType(TTPD->getDefaultArgument());
TTPD->getDefaultArgument(), WalkType(TTPD->getDefaultArgument()));
TP->Depth = TTPD->getDepth(); TP->Depth = TTPD->getDepth();
TP->Index = TTPD->getIndex(); TP->Index = TTPD->getIndex();
TP->IsParameterPack = TTPD->isParameterPack(); TP->IsParameterPack = TTPD->isParameterPack();
@ -1118,11 +1116,11 @@ Parser::WalkTemplateArgument(const clang::TemplateArgument& TA, clang::TemplateA
if (ArgLoc) if (ArgLoc)
{ {
auto ArgTL = ArgLoc->getTypeSourceInfo()->getTypeLoc(); auto ArgTL = ArgLoc->getTypeSourceInfo()->getTypeLoc();
Arg.Type = GetQualifiedType(TA.getAsType(), WalkType(TA.getAsType(), &ArgTL)); Arg.Type = GetQualifiedType(TA.getAsType(), &ArgTL);
} }
else else
{ {
Arg.Type = GetQualifiedType(TA.getAsType(), WalkType(TA.getAsType())); Arg.Type = GetQualifiedType(TA.getAsType());
} }
break; break;
} }
@ -1329,8 +1327,7 @@ Method* Parser::WalkMethodCXX(clang::CXXMethodDecl* MD)
{ {
auto TL = MD->getTypeSourceInfo()->getTypeLoc().castAs<FunctionTypeLoc>(); auto TL = MD->getTypeSourceInfo()->getTypeLoc().castAs<FunctionTypeLoc>();
auto RTL = TL.getReturnLoc(); auto RTL = TL.getReturnLoc();
auto ConvTy = WalkType(CD->getConversionType(), &RTL); Method->ConversionType = GetQualifiedType(CD->getConversionType(), &RTL);
Method->ConversionType = GetQualifiedType(CD->getConversionType(), ConvTy);
} }
Class->Methods.push_back(Method); Class->Methods.push_back(Method);
@ -1346,19 +1343,13 @@ Field* Parser::WalkFieldCXX(const clang::FieldDecl* FD, Class* Class)
const auto& USR = GetDeclUSR(FD); const auto& USR = GetDeclUSR(FD);
auto FoundField = std::find_if(Class->Fields.begin(), Class->Fields.end(),
[&](Field* Field) { return Field->USR == USR; });
if (FoundField != Class->Fields.end())
return *FoundField;
auto F = new Field(); auto F = new Field();
HandleDeclaration(FD, F); HandleDeclaration(FD, F);
F->_Namespace = Class; F->_Namespace = Class;
F->Name = FD->getName(); F->Name = FD->getName();
auto TL = FD->getTypeSourceInfo()->getTypeLoc(); auto TL = FD->getTypeSourceInfo()->getTypeLoc();
F->QualifiedType = GetQualifiedType(FD->getType(), WalkType(FD->getType(), &TL)); F->QualifiedType = GetQualifiedType(FD->getType(), &TL);
F->Access = ConvertToAccess(FD->getAccess()); F->Access = ConvertToAccess(FD->getAccess());
F->Class = Class; F->Class = Class;
F->IsBitField = FD->isBitField(); F->IsBitField = FD->isBitField();
@ -1745,10 +1736,10 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
auto AT = new AttributedType(); auto AT = new AttributedType();
auto Modified = Attributed->getModifiedType(); auto Modified = Attributed->getModifiedType();
AT->Modified = GetQualifiedType(Modified, WalkType(Modified, &Next)); AT->Modified = GetQualifiedType(Modified, &Next);
auto Equivalent = Attributed->getEquivalentType(); auto Equivalent = Attributed->getEquivalentType();
AT->Equivalent = GetQualifiedType(Equivalent, WalkType(Equivalent, &Next)); AT->Equivalent = GetQualifiedType(Equivalent, &Next);
Ty = AT; Ty = AT;
break; break;
@ -1786,7 +1777,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto Pointee = Pointer->getPointeeType(); auto Pointee = Pointer->getPointeeType();
P->QualifiedPointee = GetQualifiedType(Pointee, WalkType(Pointee, &Next)); P->QualifiedPointee = GetQualifiedType(Pointee, &Next);
Ty = P; Ty = P;
break; break;
@ -1814,12 +1805,9 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto Type = new DecayedType(); auto Type = new DecayedType();
Type->Decayed = GetQualifiedType(DT->getDecayedType(), Type->Decayed = GetQualifiedType(DT->getDecayedType(), &Next);
WalkType(DT->getDecayedType(), &Next)); Type->Original = GetQualifiedType(DT->getOriginalType(), &Next);
Type->Original = GetQualifiedType(DT->getOriginalType(), Type->Pointee = GetQualifiedType(DT->getPointeeType(), &Next);
WalkType(DT->getOriginalType(), &Next));
Type->Pointee = GetQualifiedType(DT->getPointeeType(),
WalkType(DT->getPointeeType(), &Next));
Ty = Type; Ty = Type;
break; break;
@ -1864,7 +1852,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
auto A = new ArrayType(); auto A = new ArrayType();
auto ElemTy = AT->getElementType(); auto ElemTy = AT->getElementType();
A->QualifiedType = GetQualifiedType(ElemTy, WalkType(ElemTy, &Next)); A->QualifiedType = GetQualifiedType(ElemTy, &Next);
A->SizeType = ArrayType::ArraySize::Constant; A->SizeType = ArrayType::ArraySize::Constant;
A->Size = AST->getConstantArrayElementCount(AT); A->Size = AST->getConstantArrayElementCount(AT);
if (!ElemTy->isDependentType()) if (!ElemTy->isDependentType())
@ -1881,8 +1869,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto A = new ArrayType(); auto A = new ArrayType();
A->QualifiedType = GetQualifiedType(AT->getElementType(), A->QualifiedType = GetQualifiedType(AT->getElementType(), &Next);
WalkType(AT->getElementType(), &Next));
A->SizeType = ArrayType::ArraySize::Incomplete; A->SizeType = ArrayType::ArraySize::Incomplete;
Ty = A; Ty = A;
@ -1896,8 +1883,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto A = new ArrayType(); auto A = new ArrayType();
A->QualifiedType = GetQualifiedType(AT->getElementType(), A->QualifiedType = GetQualifiedType(AT->getElementType(), &Next);
WalkType(AT->getElementType(), &Next));
A->SizeType = ArrayType::ArraySize::Dependent; A->SizeType = ArrayType::ArraySize::Dependent;
//A->Size = AT->getSizeExpr(); //A->Size = AT->getSizeExpr();
@ -1927,8 +1913,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
} }
auto F = new FunctionType(); auto F = new FunctionType();
F->ReturnType = GetQualifiedType(FP->getReturnType(), F->ReturnType = GetQualifiedType(FP->getReturnType(), &RL);
WalkType(FP->getReturnType(), &RL));
F->CallingConvention = ConvertCallConv(FP->getCallConv()); F->CallingConvention = ConvertCallConv(FP->getCallConv());
Ty = F; Ty = F;
@ -1957,8 +1942,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
} }
auto F = new FunctionType(); auto F = new FunctionType();
F->ReturnType = GetQualifiedType(FP->getReturnType(), F->ReturnType = GetQualifiedType(FP->getReturnType(), &RL);
WalkType(FP->getReturnType(), &RL));
F->CallingConvention = ConvertCallConv(FP->getCallConv()); F->CallingConvention = ConvertCallConv(FP->getCallConv());
for (unsigned i = 0; i < FP->getNumParams(); ++i) for (unsigned i = 0; i < FP->getNumParams(); ++i)
@ -1972,13 +1956,13 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
auto PTL = PVD->getTypeSourceInfo()->getTypeLoc(); auto PTL = PVD->getTypeSourceInfo()->getTypeLoc();
FA->Name = PVD->getNameAsString(); FA->Name = PVD->getNameAsString();
FA->QualifiedType = GetQualifiedType(PVD->getType(), WalkType(PVD->getType(), &PTL)); FA->QualifiedType = GetQualifiedType(PVD->getType(), &PTL);
} }
else else
{ {
auto Arg = FP->getParamType(i); auto Arg = FP->getParamType(i);
FA->Name = ""; FA->Name = "";
FA->QualifiedType = GetQualifiedType(Arg, WalkType(Arg)); FA->QualifiedType = GetQualifiedType(Arg);
// In this case we have no valid value to use as a pointer so // In this case we have no valid value to use as a pointer so
// use a special value known to the managed side to make sure // use a special value known to the managed side to make sure
@ -2013,8 +1997,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto MPT = new MemberPointerType(); auto MPT = new MemberPointerType();
MPT->Pointee = GetQualifiedType(MP->getPointeeType(), MPT->Pointee = GetQualifiedType(MP->getPointeeType(), &Next);
WalkType(MP->getPointeeType(), &Next));
Ty = MPT; Ty = MPT;
break; break;
@ -2118,7 +2101,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto RepTy = TP->getReplacementType(); auto RepTy = TP->getReplacementType();
TPT->Replacement = GetQualifiedType(RepTy, WalkType(RepTy, &Next)); TPT->Replacement = GetQualifiedType(RepTy, &Next);
Ty = TPT; Ty = TPT;
break; break;
@ -2130,8 +2113,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
ICNT->Class = static_cast<Class*>(WalkDeclaration( ICNT->Class = static_cast<Class*>(WalkDeclaration(
ICN->getDecl(), 0, /*IgnoreSystemDecls=*/false)); ICN->getDecl(), 0, /*IgnoreSystemDecls=*/false));
ICNT->InjectedSpecializationType = GetQualifiedType( ICNT->InjectedSpecializationType = GetQualifiedType(
ICN->getInjectedSpecializationType(), ICN->getInjectedSpecializationType());
WalkType(ICN->getInjectedSpecializationType()));
Ty = ICNT; Ty = ICNT;
break; break;
@ -2155,7 +2137,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto Pointee = LR->getPointeeType(); auto Pointee = LR->getPointeeType();
P->QualifiedPointee = GetQualifiedType(Pointee, WalkType(Pointee, &Next)); P->QualifiedPointee = GetQualifiedType(Pointee, &Next);
Ty = P; Ty = P;
break; break;
@ -2171,7 +2153,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (LocValid) Next = TL->getNextTypeLoc(); if (LocValid) Next = TL->getNextTypeLoc();
auto Pointee = LR->getPointeeType(); auto Pointee = LR->getPointeeType();
P->QualifiedPointee = GetQualifiedType(Pointee, WalkType(Pointee, &Next)); P->QualifiedPointee = GetQualifiedType(Pointee, &Next);
Ty = P; Ty = P;
break; break;
@ -2367,8 +2349,7 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Function* F,
} }
} }
F->ReturnType = GetQualifiedType(FD->getReturnType(), F->ReturnType = GetQualifiedType(FD->getReturnType(), &RTL);
WalkType(FD->getReturnType(), &RTL));
const auto& Mangled = GetDeclMangledName(FD); const auto& Mangled = GetDeclMangledName(FD);
F->Mangled = Mangled; F->Mangled = Mangled;
@ -2417,7 +2398,7 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Function* F,
HandlePreprocessedEntities(P, paramRange, MacroLocation::FunctionParameters); HandlePreprocessedEntities(P, paramRange, MacroLocation::FunctionParameters);
P->QualifiedType = GetQualifiedType(VD->getType(), WalkType(VD->getType(), &PTL)); P->QualifiedType = GetQualifiedType(VD->getType(), &PTL);
P->HasDefaultValue = VD->hasDefaultArg(); P->HasDefaultValue = VD->hasDefaultArg();
P->_Namespace = NS; P->_Namespace = NS;
P->Index = VD->getFunctionScopeIndex(); P->Index = VD->getFunctionScopeIndex();
@ -2568,7 +2549,7 @@ Variable* Parser::WalkVariable(clang::VarDecl *VD)
Var->Access = ConvertToAccess(VD->getAccess()); Var->Access = ConvertToAccess(VD->getAccess());
auto TL = VD->getTypeSourceInfo()->getTypeLoc(); auto TL = VD->getTypeSourceInfo()->getTypeLoc();
Var->QualifiedType = GetQualifiedType(VD->getType(), WalkType(VD->getType(), &TL)); Var->QualifiedType = GetQualifiedType(VD->getType(), &TL);
auto Mangled = GetDeclMangledName(VD); auto Mangled = GetDeclMangledName(VD);
Var->Mangled = Mangled; Var->Mangled = Mangled;
@ -3088,8 +3069,7 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D,
HandleDeclaration(TD, Typedef); HandleDeclaration(TD, Typedef);
auto TTL = TD->getTypeSourceInfo()->getTypeLoc(); auto TTL = TD->getTypeSourceInfo()->getTypeLoc();
Typedef->QualifiedType = GetQualifiedType(TD->getUnderlyingType(), Typedef->QualifiedType = GetQualifiedType(TD->getUnderlyingType(), &TTL);
WalkType(TD->getUnderlyingType(), &TTL));
Decl = Typedef; Decl = Typedef;
break; break;

3
src/CppParser/Parser.h

@ -97,8 +97,7 @@ private:
std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, clang::TemplateSpecializationTypeLoc* TSTL); std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, clang::TemplateSpecializationTypeLoc* TSTL);
std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, const clang::ASTTemplateArgumentListInfo* TSTL); std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, const clang::ASTTemplateArgumentListInfo* TSTL);
void WalkVTable(const clang::CXXRecordDecl* RD, Class* C); void WalkVTable(const clang::CXXRecordDecl* RD, Class* C);
Field* WalkVTablePointer(const std::string& prefix, Class* Class, QualifiedType GetQualifiedType(clang::QualType qual, clang::TypeLoc* TL = 0);
const clang::RecordDecl * RD, const clang::CharUnits& Offset);
VTableLayout WalkVTableLayout(const clang::VTableLayout& VTLayout); VTableLayout WalkVTableLayout(const clang::VTableLayout& VTLayout);
VTableComponent WalkVTableComponent(const clang::VTableComponent& Component); VTableComponent WalkVTableComponent(const clang::VTableComponent& Component);
PreprocessedEntity* WalkPreprocessedEntity(Declaration* Decl, PreprocessedEntity* WalkPreprocessedEntity(Declaration* Decl,

Loading…
Cancel
Save