|
|
@ -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; |
|
|
|