From 74368b2c3d3e15f79c4fd575164f25f30b78556e Mon Sep 17 00:00:00 2001 From: triton Date: Mon, 27 Jan 2014 19:52:23 +0000 Subject: [PATCH] Fixed the parser to always fill the original pointer value in declarations. --- src/CppParser/Parser.cpp | 16 +++++++++++++++- src/Parser/Parser.cpp | 11 +++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 45a684ca..fb1cad47 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -919,6 +919,10 @@ TranslationUnit* Parser::GetTranslationUnit(clang::SourceLocation Loc, *Kind = LocKind; auto Unit = Lib->FindOrCreateModule(File); + + if (Unit->OriginalPtr == nullptr) + Unit->OriginalPtr = (void*) SM.getFileEntryForID(SM.getFileID(Loc)); + if (LocKind != SourceLocationKind::Invalid) Unit->IsSystemHeader = SM.isInSystemHeader(Loc); @@ -969,11 +973,12 @@ DeclarationContext* Parser::GetNamespace(clang::Decl* D, { case Decl::Namespace: { - const NamespaceDecl* ND = cast(Ctx); + NamespaceDecl* ND = cast(Ctx); if (ND->isAnonymousNamespace()) continue; auto Name = ND->getName(); DC = DC->FindCreateNamespace(Name); + HandleDeclaration(ND, DC); continue; } case Decl::LinkageSpec: @@ -1896,6 +1901,8 @@ void Parser::WalkMacros(clang::PreprocessingRecord* PR) break; auto macro = new MacroDefinition(); + macro->OriginalPtr = (void*) MD; + macro->Name = II->getName().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) { + if (Decl->OriginalPtr != nullptr) + return; + + Decl->OriginalPtr = (void*) D; + if (Decl->PreprocessedEntities.empty()) { auto startLoc = GetDeclStartLocation(C.get(), D); @@ -2135,6 +2147,7 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D, { auto TS = cast(D); auto CT = new ClassTemplateSpecialization(); + HandleDeclaration(TS, CT); Decl = CT; break; @@ -2143,6 +2156,7 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D, { auto TS = cast(D); auto CT = new ClassTemplatePartialSpecialization(); + HandleDeclaration(TS, CT); Decl = CT; break; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 3d416518..166ffb6a 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1020,6 +1020,10 @@ CppSharp::AST::TranslationUnit^ Parser::GetTranslationUnit(clang::SourceLocation *Kind = LocKind; auto Unit = Lib->FindOrCreateModule(clix::marshalString(File)); + + if (Unit->OriginalPtr.ToPointer() == nullptr) + Unit->OriginalPtr = System::IntPtr((void*)SM.getFileEntryForID(SM.getFileID(Loc))); + if (LocKind != SourceLocationKind::Invalid) Unit->IsSystemHeader = SM.isInSystemHeader(Loc); @@ -1070,11 +1074,12 @@ CppSharp::AST::DeclarationContext^ Parser::GetNamespace(clang::Decl* D, { case Decl::Namespace: { - const NamespaceDecl* ND = cast(Ctx); + NamespaceDecl* ND = cast(Ctx); if (ND->isAnonymousNamespace()) continue; auto Name = clix::marshalString(ND->getName()); DC = DC->FindCreateNamespace(Name); + HandleDeclaration(ND, DC); continue; } case Decl::LinkageSpec: @@ -1972,7 +1977,7 @@ void Parser::WalkMacros(clang::PreprocessingRecord* PR) { case PreprocessedEntity::MacroDefinitionKind: { - const MacroDefinition* MD = cast(PE); + auto MD = cast(PE); if (!IsValidDeclaration(MD->getLocation())) break; @@ -2007,6 +2012,8 @@ void Parser::WalkMacros(clang::PreprocessingRecord* PR) break; auto macro = gcnew CppSharp::AST::MacroDefinition(); + macro->OriginalPtr = System::IntPtr((void*)MD); + macro->Name = marshalString(II->getName())->Trim(); macro->Expression = marshalString(Expression)->Trim();