From 5dada05bc555ec906d29fc4056b2edbb547fe160 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Wed, 4 Nov 2015 13:47:33 +0100 Subject: [PATCH] data: saving macro definition scopes --- bin/app/data/src/sample/samples.cpp | 1 + src/lib/data/Storage.cpp | 6 ++++-- src/lib/data/Storage.h | 3 ++- src/lib/data/parser/ParserClient.h | 3 ++- src/lib/data/parser/cxx/ASTVisitor.h | 10 +++++----- .../data/parser/cxx/PreprocessorCallbacks.cpp | 5 +++-- src/lib/data/parser/cxx/PreprocessorCallbacks.h | 4 ++-- src/test/CxxParserTestSuite.h | 17 ++++++++++++++--- 8 files changed, 33 insertions(+), 16 deletions(-) diff --git a/bin/app/data/src/sample/samples.cpp b/bin/app/data/src/sample/samples.cpp index 860b8a9f..690676e3 100644 --- a/bin/app/data/src/sample/samples.cpp +++ b/bin/app/data/src/sample/samples.cpp @@ -21,6 +21,7 @@ int calculate(int i) return a; } +#define PI 3.1415 #define CALL_CALCULATE() \ do \ diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 93d0da39..17a7dd9d 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -687,12 +687,14 @@ Id Storage::onFileIncludeParsed(const ParseLocation& location, const FileInfo& f return fileNodeId; } -Id Storage::onMacroDefineParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy) -{ +Id Storage::onMacroDefineParsed( + const ParseLocation& location, const NameHierarchy& macroNameHierarchy, const ParseLocation& scopeLocation +){ log("macro", macroNameHierarchy.getFullName(), location); Id macroId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, true); addSourceLocation(macroId, location); + addSourceLocation(macroId, scopeLocation, true); Id fileNodeId = getFileNodeId(location.filePath); addEdge(fileNodeId, macroId, Edge::EDGE_MACRO_USAGE, location); diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index 58ab0f5b..34f93777 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -123,7 +123,8 @@ public: virtual Id onFileIncludeParsed( const ParseLocation& location, const FileInfo& fileInfo, const FileInfo& includedFileInfo); - virtual Id onMacroDefineParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy); + virtual Id onMacroDefineParsed( + const ParseLocation& location, const NameHierarchy& macroNameHierarchy, const ParseLocation& scopeLocation); virtual Id onMacroExpandParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy); // StorageAccess implementation diff --git a/src/lib/data/parser/ParserClient.h b/src/lib/data/parser/ParserClient.h index b48b34f5..f67ac6cf 100644 --- a/src/lib/data/parser/ParserClient.h +++ b/src/lib/data/parser/ParserClient.h @@ -141,7 +141,8 @@ public: const ParseLocation& location, const FileInfo& fileInfo, const FileInfo& includedFileInfo) = 0; - virtual Id onMacroDefineParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy) = 0; + virtual Id onMacroDefineParsed( + const ParseLocation& location, const NameHierarchy& macroNameHierarchy, const ParseLocation& scopeLocation) = 0; virtual Id onMacroExpandParsed( const ParseLocation& location, const NameHierarchy& macroNameHierarchy) = 0; }; diff --git a/src/lib/data/parser/cxx/ASTVisitor.h b/src/lib/data/parser/cxx/ASTVisitor.h index aeac2a44..9e51fcbd 100644 --- a/src/lib/data/parser/cxx/ASTVisitor.h +++ b/src/lib/data/parser/cxx/ASTVisitor.h @@ -18,11 +18,11 @@ public: virtual ~ASTVisitor(); // Left for debugging purposes. Uncomment to see a colored ast-dump of the parsed file. -// virtual bool VisitTranslationUnitDecl(clang::TranslationUnitDecl* decl) -// { -// decl->dump(); -// return true; -// } + // virtual bool VisitTranslationUnitDecl(clang::TranslationUnitDecl* decl) + // { + // decl->dump(); + // return true; + // } // RecursiveASTVisitor implementation virtual bool VisitStmt(const clang::Stmt* statement); // avoid visiting diff --git a/src/lib/data/parser/cxx/PreprocessorCallbacks.cpp b/src/lib/data/parser/cxx/PreprocessorCallbacks.cpp index 7ed3ce75..6a622db7 100644 --- a/src/lib/data/parser/cxx/PreprocessorCallbacks.cpp +++ b/src/lib/data/parser/cxx/PreprocessorCallbacks.cpp @@ -88,7 +88,8 @@ void PreprocessorCallbacks::MacroDefined(const clang::Token& macroNameToken, con NameHierarchy nameHierarchy; nameHierarchy.push(std::make_shared(macroNameToken.getIdentifierInfo()->getName().str())); - m_client->onMacroDefineParsed(getParseLocation(macroNameToken), nameHierarchy); + m_client->onMacroDefineParsed( + getParseLocation(macroNameToken), nameHierarchy, getParseLocation(macroDirective->getMacroInfo())); } } @@ -124,7 +125,7 @@ ParseLocation PreprocessorCallbacks::getParseLocation(const clang::Token& macroN ); } -ParseLocation PreprocessorCallbacks::getParseLocation(clang::MacroInfo* macroInfo) const +ParseLocation PreprocessorCallbacks::getParseLocation(const clang::MacroInfo* macroInfo) const { clang::SourceLocation location = macroInfo->getDefinitionLoc(); clang::SourceLocation endLocation = macroInfo->getDefinitionEndLoc(); diff --git a/src/lib/data/parser/cxx/PreprocessorCallbacks.h b/src/lib/data/parser/cxx/PreprocessorCallbacks.h index 97f41cc7..7f93c18e 100644 --- a/src/lib/data/parser/cxx/PreprocessorCallbacks.h +++ b/src/lib/data/parser/cxx/PreprocessorCallbacks.h @@ -32,9 +32,9 @@ public: ); private: - ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const; ParseLocation getParseLocation(const clang::Token& macroNameToc) const; - ParseLocation getParseLocation(clang::MacroInfo* macroNameToc) const; + ParseLocation getParseLocation(const clang::MacroInfo* macroNameToc) const; + ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const; const clang::SourceManager& m_sourceManager; ParserClient* m_client; diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h index 3435dc19..53bb61e9 100644 --- a/src/test/CxxParserTestSuite.h +++ b/src/test/CxxParserTestSuite.h @@ -1211,7 +1211,17 @@ public: "};\n" ); TS_ASSERT_EQUALS(client->macros.size(),1); - TS_ASSERT_EQUALS(client->macros[0], "PI <1:9 1:10>"); + TS_ASSERT_EQUALS(client->macros[0], "PI <1:9 <1:9 1:10> 1:8>"); + } + + void test_cxx_parser_finds_macro_define_scope() + { + std::shared_ptr client = parseCode( + "#define MAX(a,b) \\\n" + " ((a)>(b)?(a):(b))" + ); + TS_ASSERT_EQUALS(client->macros.size(),1); + TS_ASSERT_EQUALS(client->macros[0], "MAX <1:9 <1:9 1:11> 2:17>"); } void test_cxx_parser_finds_macro_expand() @@ -2784,9 +2794,10 @@ private: return 0; } - virtual Id onMacroDefineParsed(const ParseLocation& location, const NameHierarchy& macroNameHierarchy) + virtual Id onMacroDefineParsed( + const ParseLocation& location, const NameHierarchy& macroNameHierarchy, const ParseLocation& scopeLocation) { - macros.push_back(addLocationSuffix(macroNameHierarchy.getFullName() ,location)); + macros.push_back(addLocationSuffix(macroNameHierarchy.getFullName(), location, scopeLocation)); return 0; }