Browse Source

Fixed the parser to always fill the original pointer value in declarations.

pull/159/head
triton 12 years ago
parent
commit
74368b2c3d
  1. 16
      src/CppParser/Parser.cpp
  2. 11
      src/Parser/Parser.cpp

16
src/CppParser/Parser.cpp

@ -919,6 +919,10 @@ TranslationUnit* Parser::GetTranslationUnit(clang::SourceLocation Loc,
*Kind = LocKind; *Kind = LocKind;
auto Unit = Lib->FindOrCreateModule(File); auto Unit = Lib->FindOrCreateModule(File);
if (Unit->OriginalPtr == nullptr)
Unit->OriginalPtr = (void*) SM.getFileEntryForID(SM.getFileID(Loc));
if (LocKind != SourceLocationKind::Invalid) if (LocKind != SourceLocationKind::Invalid)
Unit->IsSystemHeader = SM.isInSystemHeader(Loc); Unit->IsSystemHeader = SM.isInSystemHeader(Loc);
@ -969,11 +973,12 @@ DeclarationContext* Parser::GetNamespace(clang::Decl* D,
{ {
case Decl::Namespace: case Decl::Namespace:
{ {
const NamespaceDecl* ND = cast<NamespaceDecl>(Ctx); NamespaceDecl* ND = cast<NamespaceDecl>(Ctx);
if (ND->isAnonymousNamespace()) if (ND->isAnonymousNamespace())
continue; continue;
auto Name = ND->getName(); auto Name = ND->getName();
DC = DC->FindCreateNamespace(Name); DC = DC->FindCreateNamespace(Name);
HandleDeclaration(ND, DC);
continue; continue;
} }
case Decl::LinkageSpec: case Decl::LinkageSpec:
@ -1896,6 +1901,8 @@ void Parser::WalkMacros(clang::PreprocessingRecord* PR)
break; break;
auto macro = new MacroDefinition(); auto macro = new MacroDefinition();
macro->OriginalPtr = (void*) MD;
macro->Name = II->getName().trim(); macro->Name = II->getName().trim();
macro->Expression = Expression.trim(); macro->Expression = Expression.trim();
@ -2040,6 +2047,11 @@ void Parser::HandleOriginalText(clang::Decl* D, Declaration* Decl)
void Parser::HandleDeclaration(clang::Decl* D, Declaration* Decl) void Parser::HandleDeclaration(clang::Decl* D, Declaration* Decl)
{ {
if (Decl->OriginalPtr != nullptr)
return;
Decl->OriginalPtr = (void*) D;
if (Decl->PreprocessedEntities.empty()) if (Decl->PreprocessedEntities.empty())
{ {
auto startLoc = GetDeclStartLocation(C.get(), D); auto startLoc = GetDeclStartLocation(C.get(), D);
@ -2135,6 +2147,7 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D,
{ {
auto TS = cast<ClassTemplateSpecializationDecl>(D); auto TS = cast<ClassTemplateSpecializationDecl>(D);
auto CT = new ClassTemplateSpecialization(); auto CT = new ClassTemplateSpecialization();
HandleDeclaration(TS, CT);
Decl = CT; Decl = CT;
break; break;
@ -2143,6 +2156,7 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D,
{ {
auto TS = cast<ClassTemplatePartialSpecializationDecl>(D); auto TS = cast<ClassTemplatePartialSpecializationDecl>(D);
auto CT = new ClassTemplatePartialSpecialization(); auto CT = new ClassTemplatePartialSpecialization();
HandleDeclaration(TS, CT);
Decl = CT; Decl = CT;
break; break;

11
src/Parser/Parser.cpp

@ -1020,6 +1020,10 @@ CppSharp::AST::TranslationUnit^ Parser::GetTranslationUnit(clang::SourceLocation
*Kind = LocKind; *Kind = LocKind;
auto Unit = Lib->FindOrCreateModule(clix::marshalString<clix::E_UTF8>(File)); auto Unit = Lib->FindOrCreateModule(clix::marshalString<clix::E_UTF8>(File));
if (Unit->OriginalPtr.ToPointer() == nullptr)
Unit->OriginalPtr = System::IntPtr((void*)SM.getFileEntryForID(SM.getFileID(Loc)));
if (LocKind != SourceLocationKind::Invalid) if (LocKind != SourceLocationKind::Invalid)
Unit->IsSystemHeader = SM.isInSystemHeader(Loc); Unit->IsSystemHeader = SM.isInSystemHeader(Loc);
@ -1070,11 +1074,12 @@ CppSharp::AST::DeclarationContext^ Parser::GetNamespace(clang::Decl* D,
{ {
case Decl::Namespace: case Decl::Namespace:
{ {
const NamespaceDecl* ND = cast<NamespaceDecl>(Ctx); NamespaceDecl* ND = cast<NamespaceDecl>(Ctx);
if (ND->isAnonymousNamespace()) if (ND->isAnonymousNamespace())
continue; continue;
auto Name = clix::marshalString<clix::E_UTF8>(ND->getName()); auto Name = clix::marshalString<clix::E_UTF8>(ND->getName());
DC = DC->FindCreateNamespace(Name); DC = DC->FindCreateNamespace(Name);
HandleDeclaration(ND, DC);
continue; continue;
} }
case Decl::LinkageSpec: case Decl::LinkageSpec:
@ -1972,7 +1977,7 @@ void Parser::WalkMacros(clang::PreprocessingRecord* PR)
{ {
case PreprocessedEntity::MacroDefinitionKind: case PreprocessedEntity::MacroDefinitionKind:
{ {
const MacroDefinition* MD = cast<MacroDefinition>(PE); auto MD = cast<MacroDefinition>(PE);
if (!IsValidDeclaration(MD->getLocation())) if (!IsValidDeclaration(MD->getLocation()))
break; break;
@ -2007,6 +2012,8 @@ void Parser::WalkMacros(clang::PreprocessingRecord* PR)
break; break;
auto macro = gcnew CppSharp::AST::MacroDefinition(); auto macro = gcnew CppSharp::AST::MacroDefinition();
macro->OriginalPtr = System::IntPtr((void*)MD);
macro->Name = marshalString<E_UTF8>(II->getName())->Trim(); macro->Name = marshalString<E_UTF8>(II->getName())->Trim();
macro->Expression = marshalString<E_UTF8>(Expression)->Trim(); macro->Expression = marshalString<E_UTF8>(Expression)->Trim();

Loading…
Cancel
Save