Browse Source

Improved the collection of type template parameters when parsing dependent name types.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/849/merge
Dimitar Dobrev 8 years ago
parent
commit
b77de1a36c
  1. 24
      src/CppParser/Parser.cpp
  2. 4
      src/CppParser/Parser.h

24
src/CppParser/Parser.cpp

@ -592,7 +592,7 @@ static TypeQualifiers GetTypeQualifiers(const clang::QualType& Type) @@ -592,7 +592,7 @@ static TypeQualifiers GetTypeQualifiers(const clang::QualType& Type)
return quals;
}
QualifiedType Parser::GetQualifiedType(const clang::QualType& qual, clang::TypeLoc* TL)
QualifiedType Parser::GetQualifiedType(const clang::QualType& qual, const clang::TypeLoc* TL)
{
QualifiedType qualType;
qualType.type = WalkType(qual, TL);
@ -2101,7 +2101,7 @@ bool Parser::ShouldCompleteType(const clang::QualType& QualType, bool LocValid) @@ -2101,7 +2101,7 @@ bool Parser::ShouldCompleteType(const clang::QualType& QualType, bool LocValid)
return true;
}
Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
bool DesugarType)
{
using namespace clang;
@ -2590,7 +2590,25 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, @@ -2590,7 +2590,25 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
{
case clang::NestedNameSpecifier::SpecifierKind::TypeSpec:
case clang::NestedNameSpecifier::SpecifierKind::TypeSpecWithTemplate:
DNT->qualifier = GetQualifiedType(clang::QualType(DN->getQualifier()->getAsType(), 0));
const auto& Qualifier = clang::QualType(DN->getQualifier()->getAsType(), 0);
if (LocValid)
{
const auto& DNTL = TL->getAs<DependentNameTypeLoc>();
if (!DNTL.isNull())
{
const auto& QL = DNTL.getQualifierLoc();
const auto& NNSL = QL.getTypeLoc();
DNT->qualifier = GetQualifiedType(Qualifier, &NNSL);
}
else
{
DNT->qualifier = GetQualifiedType(Qualifier, 0);
}
}
else
{
DNT->qualifier = GetQualifiedType(Qualifier, 0);
}
break;
}
DNT->Identifier = DN->getIdentifier()->getName();

4
src/CppParser/Parser.h

@ -86,7 +86,7 @@ private: @@ -86,7 +86,7 @@ private:
Friend* WalkFriend(const clang::FriendDecl* FD);
RawComment* WalkRawComment(const clang::RawComment* RC);
bool ShouldCompleteType(const clang::QualType& QualType, bool LocValid);
Type* WalkType(clang::QualType QualType, clang::TypeLoc* TL = 0,
Type* WalkType(clang::QualType QualType, const clang::TypeLoc* TL = 0,
bool DesugarType = false);
TemplateArgument WalkTemplateArgument(const clang::TemplateArgument& TA, clang::TemplateArgumentLoc* ArgLoc);
TemplateTemplateParameter* WalkTemplateTemplateParameter(const clang::TemplateTemplateParmDecl* TTP);
@ -104,7 +104,7 @@ private: @@ -104,7 +104,7 @@ private:
std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, clang::TemplateSpecializationTypeLoc* TSTL);
std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, const clang::ASTTemplateArgumentListInfo* TSTL);
void WalkVTable(const clang::CXXRecordDecl* RD, Class* C);
QualifiedType GetQualifiedType(const clang::QualType& qual, clang::TypeLoc* TL = 0);
QualifiedType GetQualifiedType(const clang::QualType& qual, const clang::TypeLoc* TL = 0);
void ReadClassLayout(Class* Class, const clang::RecordDecl* RD, clang::CharUnits Offset, bool IncludeVirtualBases);
LayoutField WalkVTablePointer(Class* Class, const clang::CharUnits& Offset, const std::string& prefix);
VTableLayout WalkVTableLayout(const clang::VTableLayout& VTLayout);

Loading…
Cancel
Save