From 033ff8219220f54a38d40c9181329641005c736f Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Mon, 16 Jul 2018 14:48:47 +0200 Subject: [PATCH] src: refactored cxx ast visitor code * extracted brace recording code into own ast visitor component * removed unnecessary cxx ast visitor code --- src/lib/data/parser/Parser.cpp | 5 - src/lib/data/parser/Parser.h | 5 +- src/lib_cxx/CMakeLists.txt | 2 + src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp | 63 ++++- src/lib_cxx/data/parser/cxx/CxxAstVisitor.h | 9 +- .../parser/cxx/CxxAstVisitorComponent.cpp | 4 - .../data/parser/cxx/CxxAstVisitorComponent.h | 2 +- .../CxxAstVisitorComponentBraceRecorder.cpp | 189 +++++++++++++ .../cxx/CxxAstVisitorComponentBraceRecorder.h | 28 ++ .../cxx/CxxAstVisitorComponentContext.cpp | 4 - .../cxx/CxxAstVisitorComponentContext.h | 41 ++- .../cxx/CxxAstVisitorComponentDeclRefKind.cpp | 5 - .../cxx/CxxAstVisitorComponentDeclRefKind.h | 55 ++-- .../CxxAstVisitorComponentImplicitCode.cpp | 5 - .../cxx/CxxAstVisitorComponentImplicitCode.h | 9 +- .../cxx/CxxAstVisitorComponentIndexer.cpp | 262 ++---------------- .../cxx/CxxAstVisitorComponentIndexer.h | 13 +- .../cxx/CxxAstVisitorComponentTypeRefKind.cpp | 4 - .../cxx/CxxAstVisitorComponentTypeRefKind.h | 13 +- .../parser/cxx/CxxCompilationDatabaseSingle.h | 6 +- src/lib_cxx/data/parser/cxx/CxxContext.cpp | 12 - src/lib_cxx/data/parser/cxx/CxxContext.h | 12 +- .../data/parser/cxx/CxxDiagnosticConsumer.h | 6 +- src/lib_cxx/data/parser/cxx/CxxParser.cpp | 5 - src/lib_cxx/data/parser/cxx/CxxParser.h | 5 +- .../data/parser/cxx/PreprocessorCallbacks.h | 20 +- src/lib_java/data/parser/java/JavaParser.h | 6 +- 27 files changed, 400 insertions(+), 390 deletions(-) create mode 100644 src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.cpp create mode 100644 src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.h diff --git a/src/lib/data/parser/Parser.cpp b/src/lib/data/parser/Parser.cpp index 82722ca2..8b0616a4 100644 --- a/src/lib/data/parser/Parser.cpp +++ b/src/lib/data/parser/Parser.cpp @@ -1,11 +1,6 @@ #include "data/parser/Parser.h" - Parser::Parser(std::shared_ptr client) : m_client(client) { } - -Parser::~Parser() -{ -} diff --git a/src/lib/data/parser/Parser.h b/src/lib/data/parser/Parser.h index a621c861..0570ae25 100644 --- a/src/lib/data/parser/Parser.h +++ b/src/lib/data/parser/Parser.h @@ -2,17 +2,14 @@ #define PARSER_H #include -#include -#include class ParserClient; -class TextAccess; class Parser { public: Parser(std::shared_ptr client); - virtual ~Parser(); + virtual ~Parser() = default; protected: std::shared_ptr m_client; diff --git a/src/lib_cxx/CMakeLists.txt b/src/lib_cxx/CMakeLists.txt index dbfd1dd6..0b4a5c2d 100644 --- a/src/lib_cxx/CMakeLists.txt +++ b/src/lib_cxx/CMakeLists.txt @@ -51,6 +51,8 @@ add_files( data/parser/cxx/CxxAstVisitor.h data/parser/cxx/CxxAstVisitorComponent.cpp data/parser/cxx/CxxAstVisitorComponent.h + data/parser/cxx/CxxAstVisitorComponentBraceRecorder.cpp + data/parser/cxx/CxxAstVisitorComponentBraceRecorder.h data/parser/cxx/CxxAstVisitorComponentContext.cpp data/parser/cxx/CxxAstVisitorComponentContext.h data/parser/cxx/CxxAstVisitorComponentDeclRefKind.cpp diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp index 993bfa71..f2de127b 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp @@ -8,6 +8,7 @@ #include "data/parser/cxx/CanonicalFilePathCache.h" #include "data/parser/cxx/CxxAstVisitorComponent.h" +#include "data/parser/cxx/CxxAstVisitorComponentBraceRecorder.h" #include "data/parser/cxx/CxxAstVisitorComponentContext.h" #include "data/parser/cxx/CxxAstVisitorComponentDeclRefKind.h" #include "data/parser/cxx/CxxAstVisitorComponentTypeRefKind.h" @@ -67,12 +68,10 @@ CxxAstVisitor::CxxAstVisitor( m_components.push_back(m_declRefKindComponent); m_implicitCodeComponent = std::make_shared(this); m_components.push_back(m_implicitCodeComponent); - m_indexerComponent = std::make_shared(this, astContext, client, fileRegister); + m_indexerComponent = std::make_shared(this, astContext, client); m_components.push_back(m_indexerComponent); -} - -CxxAstVisitor::~CxxAstVisitor() -{ + m_braceRecorderComponent = std::make_shared(this, astContext, client); + m_components.push_back(m_braceRecorderComponent); } template <> @@ -790,6 +789,60 @@ ParseLocation CxxAstVisitor::getParseLocation(const clang::SourceRange& sourceRa return parseLocation; } +bool CxxAstVisitor::shouldVisitStmt(const clang::Stmt* s) const +{ + if (s) + { + clang::SourceLocation loc = m_astContext->getSourceManager().getExpansionLoc(s->getLocStart()); + + if (loc.isInvalid()) + { + loc = s->getLocStart(); + } + + if (isLocatedInProjectFile(loc)) + { + return true; + } + } + return false; +} + +bool CxxAstVisitor::shouldVisitDecl(const clang::Decl* decl) const +{ + if (decl) + { + clang::SourceLocation loc = m_astContext->getSourceManager().getExpansionLoc(decl->getLocation()); + + if (loc.isInvalid()) + { + loc = decl->getLocation(); + } + + if (isLocatedInProjectFile(loc)) + { + return true; + } + } + return false; +} + +bool CxxAstVisitor::shouldVisitReference(const clang::SourceLocation& referenceLocation, const clang::Decl* contextDecl) const +{ + clang::SourceLocation loc = m_astContext->getSourceManager().getExpansionLoc(referenceLocation); + if (loc.isInvalid()) + { + loc = referenceLocation; + } + + if (isLocatedInProjectFile(loc)) + { + return true; + } + + return false; +} + bool CxxAstVisitor::isLocatedInProjectFile(clang::SourceLocation loc) const { const clang::SourceManager& sourceManager = m_astContext->getSourceManager(); diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h index fef87d12..557d18a2 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h @@ -15,6 +15,7 @@ class FileRegister; class FilePath; class CxxAstVisitorComponent; +class CxxAstVisitorComponentBraceRecorder; class CxxAstVisitorComponentContext; class CxxAstVisitorComponentDeclRefKind; class CxxAstVisitorComponentTypeRefKind; @@ -43,7 +44,7 @@ public: std::shared_ptr fileRegister, std::shared_ptr canonicalFilePathCache ); - virtual ~CxxAstVisitor(); + virtual ~CxxAstVisitor() = default; template std::shared_ptr getComponent(); @@ -147,6 +148,11 @@ public: ParseLocation getParseLocationOfFunctionBody(const clang::FunctionDecl* decl) const; ParseLocation getParseLocation(const clang::SourceLocation& loc) const; ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const; + + bool shouldVisitStmt(const clang::Stmt* s) const; + bool shouldVisitDecl(const clang::Decl* decl) const; + bool shouldVisitReference(const clang::SourceLocation& referenceLocation, const clang::Decl* contextDecl) const; + bool isLocatedInProjectFile(clang::SourceLocation loc) const; private: @@ -166,6 +172,7 @@ private: std::shared_ptr m_typeRefKindComponent; std::shared_ptr m_implicitCodeComponent; std::shared_ptr m_indexerComponent; + std::shared_ptr m_braceRecorderComponent; std::shared_ptr m_declNameCache; std::shared_ptr m_typeNameCache; diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.cpp index 0bc65a37..bb6b6fce 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.cpp @@ -5,10 +5,6 @@ CxxAstVisitorComponent::CxxAstVisitorComponent(CxxAstVisitor* astVisitor) { } -CxxAstVisitorComponent::~CxxAstVisitorComponent() -{ -} - CxxAstVisitor* CxxAstVisitorComponent::getAstVisitor() { return m_astVisitor; diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h index 4418c88d..cc65f6b6 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h @@ -10,7 +10,7 @@ class CxxAstVisitorComponent { public: CxxAstVisitorComponent(CxxAstVisitor* astVisitor); - virtual ~CxxAstVisitorComponent(); + virtual ~CxxAstVisitorComponent() = default; #define DEF_TRAVERSE_CUSTOM_TYPE_PTR(__NAME_TYPE__, __PARAM_TYPE__) \ virtual void beginTraverse##__NAME_TYPE__(clang::__PARAM_TYPE__ *v) {} \ diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.cpp new file mode 100644 index 00000000..08f71b7a --- /dev/null +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.cpp @@ -0,0 +1,189 @@ +#include "data/parser/cxx/CxxAstVisitorComponentBraceRecorder.h" + +#include + +#include "data/parser/cxx/CxxAstVisitorComponentContext.h" +#include "data/parser/cxx/utilityClang.h" +#include "data/parser/ParseLocation.h" +#include "data/parser/ParserClient.h" + +CxxAstVisitorComponentBraceRecorder::CxxAstVisitorComponentBraceRecorder( + CxxAstVisitor* astVisitor, clang::ASTContext* astContext, std::shared_ptr client +) + : CxxAstVisitorComponent(astVisitor) + , m_astContext(astContext) + , m_client(client) +{ +} + +void CxxAstVisitorComponentBraceRecorder::visitTagDecl(clang::TagDecl* d) +{ + if (getAstVisitor()->shouldVisitDecl(d)) + { + if (d->isThisDeclarationADefinition() && + ( + !clang::isa(d) || + clang::dyn_cast(d)->getTemplateSpecializationKind() != clang::TSK_ImplicitInstantiation + )) + { + recordBraces(getParseLocation(d->getBraceRange().getBegin()), getParseLocation(d->getBraceRange().getEnd())); + } + } +} + +void CxxAstVisitorComponentBraceRecorder::visitNamespaceDecl(clang::NamespaceDecl* d) +{ + if (getAstVisitor()->shouldVisitDecl(d)) + { + recordBraces( + getParseLocation(getFirstLBraceLocation(d->getLocStart())), + getParseLocation(getLastRBraceLocation(d->getLocStart(), d->getLocEnd())) + ); + } +} + +void CxxAstVisitorComponentBraceRecorder::visitCompoundStmt(clang::CompoundStmt* s) +{ + if (getAstVisitor()->shouldVisitStmt(s)) + { + const clang::NamedDecl* contextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(); + if (!contextDecl || !utility::isImplicit(contextDecl)) + { + recordBraces(getParseLocation(s->getLBracLoc()), getParseLocation(s->getRBracLoc())); + } + } +} + +void CxxAstVisitorComponentBraceRecorder::visitInitListExpr(clang::InitListExpr* s) +{ + if (getAstVisitor()->shouldVisitStmt(s)) + { + if (s->isSyntacticForm()) + { + const clang::NamedDecl* contextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(); + if (!contextDecl || !utility::isImplicit(contextDecl)) + { + recordBraces(getParseLocation(s->getLBraceLoc()), getParseLocation(s->getRBraceLoc())); + } + } + } +} + +void CxxAstVisitorComponentBraceRecorder::visitMSAsmStmt(clang::MSAsmStmt* s) +{ + if (getAstVisitor()->shouldVisitStmt(s)) + { + if (s->hasBraces()) + { + const clang::NamedDecl* contextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(); + if (!contextDecl || !utility::isImplicit(contextDecl)) + { + recordBraces( + getParseLocation(s->getLBraceLoc()), + getParseLocation(getLastRBraceLocation(s->getLocStart(), s->getLocEnd())) + ); + } + } + } +} + +ParseLocation CxxAstVisitorComponentBraceRecorder::getParseLocation(const clang::SourceLocation& loc) const +{ + return getAstVisitor()->getParseLocation(loc); +} + +void CxxAstVisitorComponentBraceRecorder::recordBraces(const ParseLocation& lbraceLoc, const ParseLocation& rbraceLoc) +{ + std::wstring name = + lbraceLoc.filePath.fileName() + L"<" + + std::to_wstring(lbraceLoc.startLineNumber) + L":" + + std::to_wstring(lbraceLoc.startColumnNumber) + L">"; + + if (lbraceLoc.startColumnNumber != rbraceLoc.startColumnNumber || + lbraceLoc.endColumnNumber != rbraceLoc.endColumnNumber || + lbraceLoc.startLineNumber != rbraceLoc.startLineNumber || + lbraceLoc.endLineNumber != rbraceLoc.endLineNumber) + { + if (lbraceLoc.startColumnNumber == lbraceLoc.endColumnNumber && + lbraceLoc.startLineNumber == lbraceLoc.endLineNumber) + { + m_client->recordLocalSymbol(name, lbraceLoc); + } + if (rbraceLoc.startColumnNumber == rbraceLoc.endColumnNumber && + rbraceLoc.startLineNumber == rbraceLoc.endLineNumber) + { + m_client->recordLocalSymbol(name, rbraceLoc); + } + } +} + +clang::SourceLocation CxxAstVisitorComponentBraceRecorder::getFirstLBraceLocation(clang::SourceLocation searchStartLoc) const +{ + const clang::SourceManager& sm = m_astContext->getSourceManager(); + const clang::LangOptions& opts = m_astContext->getLangOpts(); + + { + clang::Token token; + if (clang::Lexer::getRawToken(searchStartLoc, token, sm, opts)) + { + if (token.getKind() == clang::tok::l_brace) + { + return token.getLocation(); + } + } + } + + while (true) + { + llvm::Optional token = clang::Lexer::findNextToken(searchStartLoc, sm, opts); + if (token.hasValue()) + { + if (token.getValue().getKind() == clang::tok::l_brace) + { + return token.getValue().getLocation(); + } + searchStartLoc = token.getValue().getLocation(); + } + else + { + break; + } + } + return clang::SourceLocation(); +} + +clang::SourceLocation CxxAstVisitorComponentBraceRecorder::getLastRBraceLocation(clang::SourceLocation searchStartLoc, clang::SourceLocation searchEndLoc) const +{ + const clang::SourceManager& sm = m_astContext->getSourceManager(); + const clang::LangOptions& opts = m_astContext->getLangOpts(); + + { + searchEndLoc = searchEndLoc.getLocWithOffset(-1); + llvm::Optional token = clang::Lexer::findNextToken(searchEndLoc, sm, opts); + if (token.hasValue()) + { + if (token.getValue().getKind() == clang::tok::r_brace) + { + return token.getValue().getLocation(); + } + } + } + + while (true) + { + clang::Token token; + if (clang::Lexer::getRawToken(searchEndLoc, token, sm, opts)) + { + if (token.getKind() == clang::tok::r_brace) + { + return token.getLocation(); + } + } + if (searchEndLoc < searchStartLoc) + { + break; + } + searchEndLoc = searchEndLoc.getLocWithOffset(-1); + } + return clang::SourceLocation(); +} diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.h new file mode 100644 index 00000000..df9e12b4 --- /dev/null +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentBraceRecorder.h @@ -0,0 +1,28 @@ +#ifndef CXX_AST_VISITOR_COMPONENT_BRACE_RECORDER_H +#define CXX_AST_VISITOR_COMPONENT_BRACE_RECORDER_H + +#include "data/parser/cxx/CxxAstVisitorComponent.h" + +// This CxxAstVisitorComponent is responsible for recording all matching braces ["{", "}"] throughout the visited AST. +class CxxAstVisitorComponentBraceRecorder: public CxxAstVisitorComponent +{ +public: + CxxAstVisitorComponentBraceRecorder(CxxAstVisitor* astVisitor, clang::ASTContext* astContext, std::shared_ptr client); + + void visitTagDecl(clang::TagDecl* d) override; + void visitNamespaceDecl(clang::NamespaceDecl* d) override; + void visitCompoundStmt(clang::CompoundStmt* s) override; + void visitInitListExpr(clang::InitListExpr* s) override; + void visitMSAsmStmt(clang::MSAsmStmt* s) override; + +private: + ParseLocation getParseLocation(const clang::SourceLocation& loc) const; + void recordBraces(const ParseLocation& lbraceLoc, const ParseLocation& rbraceLoc); + clang::SourceLocation getFirstLBraceLocation(clang::SourceLocation searchStartLoc) const; + clang::SourceLocation getLastRBraceLocation(clang::SourceLocation searchStartLoc, clang::SourceLocation searchEndLoc) const; + + clang::ASTContext* m_astContext; + std::shared_ptr m_client; +}; + +#endif // CXX_AST_VISITOR_COMPONENT_BRACE_RECORDER_H diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.cpp index 528925e6..03ad0eaa 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.cpp @@ -5,10 +5,6 @@ CxxAstVisitorComponentContext::CxxAstVisitorComponentContext(CxxAstVisitor* astV { } -CxxAstVisitorComponentContext::~CxxAstVisitorComponentContext() -{ -} - const clang::NamedDecl* CxxAstVisitorComponentContext::getTopmostContextDecl() const { for (std::vector>::const_reverse_iterator it = m_contextStack.rbegin(); it != m_contextStack.rend(); it ++) diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.h index 0025c94d..b87b3df9 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentContext.h @@ -11,41 +11,40 @@ class CxxAstVisitorComponentContext: public CxxAstVisitorComponent { public: CxxAstVisitorComponentContext(CxxAstVisitor* astVisitor); - virtual ~CxxAstVisitorComponentContext(); const clang::NamedDecl* getTopmostContextDecl() const; NameHierarchy getContextName(const size_t skip = 0); NameHierarchy getContextName(const NameHierarchy& fallback, const size_t skip = 0); - virtual void beginTraverseDecl(clang::Decl* d) override; - virtual void endTraverseDecl(clang::Decl* d) override; + void beginTraverseDecl(clang::Decl* d) override; + void endTraverseDecl(clang::Decl* d) override; - virtual void beginTraverseTypeLoc(const clang::TypeLoc& tl) override; - virtual void endTraverseTypeLoc(const clang::TypeLoc& tl) override; + void beginTraverseTypeLoc(const clang::TypeLoc& tl) override; + void endTraverseTypeLoc(const clang::TypeLoc& tl) override; - virtual void beginTraverseLambdaExpr(clang::LambdaExpr* s) override; - virtual void endTraverseLambdaExpr(clang::LambdaExpr* s) override; + void beginTraverseLambdaExpr(clang::LambdaExpr* s) override; + void endTraverseLambdaExpr(clang::LambdaExpr* s) override; - virtual void beginTraverseFunctionDecl(clang::FunctionDecl* d) override; - virtual void endTraverseFunctionDecl(clang::FunctionDecl* d) override; + void beginTraverseFunctionDecl(clang::FunctionDecl* d) override; + void endTraverseFunctionDecl(clang::FunctionDecl* d) override; - virtual void beginTraverseClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl *d) override; - virtual void endTraverseClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl *d) override; + void beginTraverseClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl *d) override; + void endTraverseClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl *d) override; - virtual void beginTraverseClassTemplatePartialSpecializationDecl(clang::ClassTemplatePartialSpecializationDecl* d) override; - virtual void endTraverseClassTemplatePartialSpecializationDecl(clang::ClassTemplatePartialSpecializationDecl* d) override; + void beginTraverseClassTemplatePartialSpecializationDecl(clang::ClassTemplatePartialSpecializationDecl* d) override; + void endTraverseClassTemplatePartialSpecializationDecl(clang::ClassTemplatePartialSpecializationDecl* d) override; - virtual void beginTraverseDeclRefExpr(clang::DeclRefExpr* s) override; - virtual void endTraverseDeclRefExpr(clang::DeclRefExpr* s) override; + void beginTraverseDeclRefExpr(clang::DeclRefExpr* s) override; + void endTraverseDeclRefExpr(clang::DeclRefExpr* s) override; - virtual void beginTraverseTemplateSpecializationTypeLoc(const clang::TemplateSpecializationTypeLoc& loc) override; - virtual void endTraverseTemplateSpecializationTypeLoc(const clang::TemplateSpecializationTypeLoc& loc) override; + void beginTraverseTemplateSpecializationTypeLoc(const clang::TemplateSpecializationTypeLoc& loc) override; + void endTraverseTemplateSpecializationTypeLoc(const clang::TemplateSpecializationTypeLoc& loc) override; - virtual void beginTraverseUnresolvedLookupExpr(clang::UnresolvedLookupExpr* e) override; - virtual void endTraverseUnresolvedLookupExpr(clang::UnresolvedLookupExpr* e) override; + void beginTraverseUnresolvedLookupExpr(clang::UnresolvedLookupExpr* e) override; + void endTraverseUnresolvedLookupExpr(clang::UnresolvedLookupExpr* e) override; - virtual void beginTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; - virtual void endTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; + void beginTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; + void endTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; private: std::vector> m_contextStack; diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.cpp index 80a7e42f..2103bb41 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.cpp @@ -7,16 +7,11 @@ CxxAstVisitorComponentDeclRefKind::CxxAstVisitorComponentDeclRefKind(CxxAstVisit { } -CxxAstVisitorComponentDeclRefKind::~CxxAstVisitorComponentDeclRefKind() -{ -} - ReferenceKind CxxAstVisitorComponentDeclRefKind::getReferenceKind() const { return m_thisRefKind; } - void CxxAstVisitorComponentDeclRefKind::beginTraverseDecl(clang::Decl* d) { saveAll(); diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.h index e2f68e93..44f726f3 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentDeclRefKind.h @@ -15,58 +15,57 @@ class CxxAstVisitorComponentDeclRefKind: public CxxAstVisitorComponent { public: CxxAstVisitorComponentDeclRefKind(CxxAstVisitor* astVisitor); - virtual ~CxxAstVisitorComponentDeclRefKind(); ReferenceKind getReferenceKind() const; - virtual void beginTraverseDecl(clang::Decl* d) override; - virtual void endTraverseDecl(clang::Decl* d) override; + void beginTraverseDecl(clang::Decl* d) override; + void endTraverseDecl(clang::Decl* d) override; - virtual void beginTraverseStmt(clang::Stmt* s) override; - virtual void endTraverseStmt(clang::Stmt* s) override; + void beginTraverseStmt(clang::Stmt* s) override; + void endTraverseStmt(clang::Stmt* s) override; - virtual void beginTraverseType(const clang::QualType& t) override; - virtual void endTraverseType(const clang::QualType& t) override; + void beginTraverseType(const clang::QualType& t) override; + void endTraverseType(const clang::QualType& t) override; - virtual void beginTraverseTypeLoc(const clang::TypeLoc& tl) override; - virtual void endTraverseTypeLoc(const clang::TypeLoc& tl) override; + void beginTraverseTypeLoc(const clang::TypeLoc& tl) override; + void endTraverseTypeLoc(const clang::TypeLoc& tl) override; - virtual void beginTraverseCallCommonCallee() override; + void beginTraverseCallCommonCallee() override; - virtual void beginTraverseCallCommonArgument() override; + void beginTraverseCallCommonArgument() override; - virtual void beginTraverseBinCommaLhs() override; + void beginTraverseBinCommaLhs() override; - virtual void beginTraverseBinCommaRhs() override; + void beginTraverseBinCommaRhs() override; - virtual void beginTraverseAssignCommonLhs() override; + void beginTraverseAssignCommonLhs() override; - virtual void beginTraverseAssignCommonRhs() override; + void beginTraverseAssignCommonRhs() override; - virtual void beginTraverseConstructorInitializer(clang::CXXCtorInitializer* init) override; + void beginTraverseConstructorInitializer(clang::CXXCtorInitializer* init) override; - virtual void beginTraverseCXXTemporaryObjectExpr(clang::CXXTemporaryObjectExpr* s) override; + void beginTraverseCXXTemporaryObjectExpr(clang::CXXTemporaryObjectExpr* s) override; - virtual void beginTraverseUnresolvedMemberExpr(clang::UnresolvedMemberExpr* s) override; + void beginTraverseUnresolvedMemberExpr(clang::UnresolvedMemberExpr* s) override; - virtual void visitVarDecl(clang::VarDecl* d) override; + void visitVarDecl(clang::VarDecl* d) override; - virtual void visitCastExpr(clang::CastExpr* s) override; + void visitCastExpr(clang::CastExpr* s) override; - virtual void visitUnaryAddrOf(clang::UnaryOperator* s) override; + void visitUnaryAddrOf(clang::UnaryOperator* s) override; - virtual void visitUnaryDeref(clang::UnaryOperator* s) override; + void visitUnaryDeref(clang::UnaryOperator* s) override; - virtual void visitDeclStmt(clang::DeclStmt* s) override; + void visitDeclStmt(clang::DeclStmt* s) override; - virtual void visitReturnStmt(clang::ReturnStmt* s) override; + void visitReturnStmt(clang::ReturnStmt* s) override; - virtual void visitInitListExpr(clang::InitListExpr* s) override; + void visitInitListExpr(clang::InitListExpr* s) override; - virtual void visitMemberExpr(clang::MemberExpr* s) override; + void visitMemberExpr(clang::MemberExpr* s) override; + + void visitCXXDependentScopeMemberExpr(clang::CXXDependentScopeMemberExpr* s) override; - virtual void visitCXXDependentScopeMemberExpr(clang::CXXDependentScopeMemberExpr* s) override; - private: void saveAll(); void restoreAll(); diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.cpp index 91adcc4a..c00a8a12 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.cpp @@ -5,10 +5,6 @@ CxxAstVisitorComponentImplicitCode::CxxAstVisitorComponentImplicitCode(CxxAstVis { } -CxxAstVisitorComponentImplicitCode::~CxxAstVisitorComponentImplicitCode() -{ -} - bool CxxAstVisitorComponentImplicitCode::shouldVisitImplicitCode() const { if (!m_stack.empty()) @@ -26,7 +22,6 @@ void CxxAstVisitorComponentImplicitCode::beginTraverseDecl(clang::Decl* d) void CxxAstVisitorComponentImplicitCode::endTraverseDecl(clang::Decl* d) { m_stack.pop_back(); - } void CxxAstVisitorComponentImplicitCode::beginTraverseCXXForRangeStmt(clang::CXXForRangeStmt* s) diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.h index c366592c..a3c33eb3 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentImplicitCode.h @@ -8,15 +8,14 @@ class CxxAstVisitorComponentImplicitCode: public CxxAstVisitorComponent { public: CxxAstVisitorComponentImplicitCode(CxxAstVisitor* astVisitor); - virtual ~CxxAstVisitorComponentImplicitCode(); bool shouldVisitImplicitCode() const; - virtual void beginTraverseDecl(clang::Decl* d) override; - virtual void endTraverseDecl(clang::Decl* d) override; + void beginTraverseDecl(clang::Decl* d) override; + void endTraverseDecl(clang::Decl* d) override; - virtual void beginTraverseCXXForRangeStmt(clang::CXXForRangeStmt* s) override; - virtual void endTraverseCXXForRangeStmt(clang::CXXForRangeStmt* s) override; + void beginTraverseCXXForRangeStmt(clang::CXXForRangeStmt* s) override; + void endTraverseCXXForRangeStmt(clang::CXXForRangeStmt* s) override; private: std::vector m_stack; diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp index 0c31d970..3bd0971c 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp @@ -14,87 +14,18 @@ #include "data/parser/ParserClient.h" #include "utility/file/FileRegister.h" -namespace -{ - clang::SourceLocation getFirstLBraceLocation(clang::SourceLocation searchStartLoc, const clang::SourceManager& sm, const clang::LangOptions& opts) - { - { - clang::Token token; - if (clang::Lexer::getRawToken(searchStartLoc, token, sm, opts)) - { - if (token.getKind() == clang::tok::l_brace) - { - return token.getLocation(); - } - } - } - - while (true) - { - llvm::Optional token = clang::Lexer::findNextToken(searchStartLoc, sm, opts); - if (token.hasValue()) - { - if (token.getValue().getKind() == clang::tok::l_brace) - { - return token.getValue().getLocation(); - } - searchStartLoc = token.getValue().getLocation(); - } - else - { - break; - } - } - return clang::SourceLocation(); - } - - clang::SourceLocation getLastRBraceLocation(clang::SourceLocation searchStartLoc, clang::SourceLocation searchEndLoc, const clang::SourceManager& sm, const clang::LangOptions& opts) - { - { - searchEndLoc = searchEndLoc.getLocWithOffset(-1); - llvm::Optional token = clang::Lexer::findNextToken(searchEndLoc, sm, opts); - if (token.hasValue()) - { - if (token.getValue().getKind() == clang::tok::r_brace) - { - return token.getValue().getLocation(); - } - } - } - - while (true) - { - clang::Token token; - if (clang::Lexer::getRawToken(searchEndLoc, token, sm, opts)) - { - if (token.getKind() == clang::tok::r_brace) - { - return token.getLocation(); - } - } - if (searchEndLoc < searchStartLoc) - { - break; - } - searchEndLoc = searchEndLoc.getLocWithOffset(-1); - } - return clang::SourceLocation(); - } -} - CxxAstVisitorComponentIndexer::CxxAstVisitorComponentIndexer( - CxxAstVisitor* astVisitor, clang::ASTContext* astContext, std::shared_ptr client, std::shared_ptr fileRegister + CxxAstVisitor* astVisitor, clang::ASTContext* astContext, std::shared_ptr client ) : CxxAstVisitorComponent(astVisitor) , m_astContext(astContext) , m_client(client) - , m_fileRegister(fileRegister) { } void CxxAstVisitorComponentIndexer::beginTraverseNestedNameSpecifierLoc(const clang::NestedNameSpecifierLoc& loc) { - if (!shouldVisitReference(loc.getBeginLoc(), getAstVisitor()->getComponent()->getTopmostContextDecl())) + if (!getAstVisitor()->shouldVisitReference(loc.getBeginLoc(), getAstVisitor()->getComponent()->getTopmostContextDecl())) { return; } @@ -187,7 +118,7 @@ void CxxAstVisitorComponentIndexer::beginTraverseTemplateArgumentLoc(const clang { if ( (loc.getArgument().getKind() == clang::TemplateArgument::Template) && - (shouldVisitReference(loc.getLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) + (getAstVisitor()->shouldVisitReference(loc.getLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) ){ // TODO: maybe move this to VisitTemplateName m_client->recordReference( @@ -222,7 +153,7 @@ void CxxAstVisitorComponentIndexer::beginTraverseLambdaCapture(clang::LambdaExpr void CxxAstVisitorComponentIndexer::visitTagDecl(clang::TagDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { DefinitionKind definitionKind = DEFINITION_NONE; if (d->isThisDeclarationADefinition()) @@ -258,21 +189,12 @@ void CxxAstVisitorComponentIndexer::visitTagDecl(clang::TagDecl* d) symbolKind ); } - - if (d->isThisDeclarationADefinition() && - ( - !clang::isa(d) || - clang::dyn_cast(d)->getTemplateSpecializationKind() != clang::TSK_ImplicitInstantiation - )) - { - recordBraces(getParseLocation(d->getBraceRange().getBegin()), getParseLocation(d->getBraceRange().getEnd())); - } } } void CxxAstVisitorComponentIndexer::visitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { clang::NamedDecl* specializedFromDecl = nullptr; @@ -298,7 +220,7 @@ void CxxAstVisitorComponentIndexer::visitClassTemplateSpecializationDecl(clang:: void CxxAstVisitorComponentIndexer::visitVarDecl(clang::VarDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { SymbolKind symbolKind = utility::getSymbolKind(d); if (symbolKind == SYMBOL_LOCAL_VARIABLE || symbolKind == SYMBOL_PARAMETER) @@ -335,7 +257,7 @@ void CxxAstVisitorComponentIndexer::visitVarDecl(clang::VarDecl* d) void CxxAstVisitorComponentIndexer::visitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { clang::NamedDecl* specializedFromDecl = nullptr; @@ -361,7 +283,7 @@ void CxxAstVisitorComponentIndexer::visitVarTemplateSpecializationDecl(clang::Va void CxxAstVisitorComponentIndexer::visitFieldDecl(clang::FieldDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -399,7 +321,7 @@ void CxxAstVisitorComponentIndexer::visitFieldDecl(clang::FieldDecl* d) void CxxAstVisitorComponentIndexer::visitFunctionDecl(clang::FunctionDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -429,7 +351,7 @@ void CxxAstVisitorComponentIndexer::visitFunctionDecl(clang::FunctionDecl* d) void CxxAstVisitorComponentIndexer::visitCXXMethodDecl(clang::CXXMethodDecl* d) { // Decl has been recorded in VisitFunctionDecl - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { for (clang::CXXMethodDecl::method_iterator it = d->begin_overridden_methods(); // TODO: iterate in traversal and use REFERENCE_OVERRIDE or so.. it != d->end_overridden_methods(); it++) @@ -457,7 +379,7 @@ void CxxAstVisitorComponentIndexer::visitCXXMethodDecl(clang::CXXMethodDecl* d) void CxxAstVisitorComponentIndexer::visitEnumConstantDecl(clang::EnumConstantDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -471,7 +393,7 @@ void CxxAstVisitorComponentIndexer::visitEnumConstantDecl(clang::EnumConstantDec void CxxAstVisitorComponentIndexer::visitNamespaceDecl(clang::NamespaceDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -481,17 +403,12 @@ void CxxAstVisitorComponentIndexer::visitNamespaceDecl(clang::NamespaceDecl* d) utility::convertAccessSpecifier(d->getAccess()), utility::isImplicit(d) ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT ); - - recordBraces( - getParseLocation(getFirstLBraceLocation(d->getLocStart(), m_astContext->getSourceManager(), m_astContext->getLangOpts())), - getParseLocation(getLastRBraceLocation(d->getLocStart(), d->getLocEnd(), m_astContext->getSourceManager(), m_astContext->getLangOpts())) - ); } } void CxxAstVisitorComponentIndexer::visitNamespaceAliasDecl(clang::NamespaceAliasDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -514,7 +431,7 @@ void CxxAstVisitorComponentIndexer::visitNamespaceAliasDecl(clang::NamespaceAlia void CxxAstVisitorComponentIndexer::visitTypedefDecl(clang::TypedefDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -528,7 +445,7 @@ void CxxAstVisitorComponentIndexer::visitTypedefDecl(clang::TypedefDecl* d) void CxxAstVisitorComponentIndexer::visitTypeAliasDecl(clang::TypeAliasDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -542,7 +459,7 @@ void CxxAstVisitorComponentIndexer::visitTypeAliasDecl(clang::TypeAliasDecl* d) void CxxAstVisitorComponentIndexer::visitUsingDirectiveDecl(clang::UsingDirectiveDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { const NameHierarchy nameHierarchy = getAstVisitor()->getDeclNameCache()->getValue(d->getNominatedNamespaceAsWritten()); @@ -560,7 +477,7 @@ void CxxAstVisitorComponentIndexer::visitUsingDirectiveDecl(clang::UsingDirectiv void CxxAstVisitorComponentIndexer::visitUsingDecl(clang::UsingDecl* d) { - if (shouldVisitDecl(d)) + if (getAstVisitor()->shouldVisitDecl(d)) { ParseLocation loc = getParseLocation(d->getLocation()); m_client->recordReference( @@ -574,7 +491,7 @@ void CxxAstVisitorComponentIndexer::visitUsingDecl(clang::UsingDecl* d) void CxxAstVisitorComponentIndexer::visitNonTypeTemplateParmDecl(clang::NonTypeTemplateParmDecl* d) { - if (shouldVisitDecl(d) && !d->getName().empty()) // We don't create symbols for unnamed template parameters. + if (getAstVisitor()->shouldVisitDecl(d) && !d->getName().empty()) // We don't create symbols for unnamed template parameters. { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -588,7 +505,7 @@ void CxxAstVisitorComponentIndexer::visitNonTypeTemplateParmDecl(clang::NonTypeT void CxxAstVisitorComponentIndexer::visitTemplateTypeParmDecl(clang::TemplateTypeParmDecl* d) { - if (shouldVisitDecl(d) && !d->getName().empty()) // We don't create symbols for unnamed template parameters. + if (getAstVisitor()->shouldVisitDecl(d) && !d->getName().empty()) // We don't create symbols for unnamed template parameters. { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -602,7 +519,7 @@ void CxxAstVisitorComponentIndexer::visitTemplateTypeParmDecl(clang::TemplateTyp void CxxAstVisitorComponentIndexer::visitTemplateTemplateParmDecl(clang::TemplateTemplateParmDecl* d) { - if (shouldVisitDecl(d) && !d->getName().empty()) // We don't create symbols for unnamed template parameters. + if (getAstVisitor()->shouldVisitDecl(d) && !d->getName().empty()) // We don't create symbols for unnamed template parameters. { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(d), @@ -616,7 +533,7 @@ void CxxAstVisitorComponentIndexer::visitTemplateTemplateParmDecl(clang::Templat void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl) { - if ((shouldVisitReference(tl.getBeginLoc(), getAstVisitor()->getComponent()->getTopmostContextDecl())) && + if ((getAstVisitor()->shouldVisitReference(tl.getBeginLoc(), getAstVisitor()->getComponent()->getTopmostContextDecl())) && (!getAstVisitor()->checkIgnoresTypeLoc(tl))) { if (clang::dyn_cast_or_null(tl.getTypePtr())) @@ -644,37 +561,10 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl) } } -void CxxAstVisitorComponentIndexer::visitCompoundStmt(clang::CompoundStmt* s) -{ - if (shouldVisitStmt(s)) - { - const clang::NamedDecl* contextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(); - if (!contextDecl || !utility::isImplicit(contextDecl)) - { - recordBraces(getParseLocation(s->getLBracLoc()), getParseLocation(s->getRBracLoc())); - } - } -} - -void CxxAstVisitorComponentIndexer::visitInitListExpr(clang::InitListExpr* s) -{ - if (shouldVisitStmt(s)) - { - if (s->isSyntacticForm()) - { - const clang::NamedDecl* contextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(); - if (!contextDecl || !utility::isImplicit(contextDecl)) - { - recordBraces(getParseLocation(s->getLBraceLoc()), getParseLocation(s->getRBraceLoc())); - } - } - } -} - void CxxAstVisitorComponentIndexer::visitDeclRefExpr(clang::DeclRefExpr* s) { clang::ValueDecl* decl = s->getDecl(); - if (shouldVisitReference(s->getLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) + if (getAstVisitor()->shouldVisitReference(s->getLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) { if ((clang::isa(decl)) || (clang::isa(decl) && decl->getParentFunctionOrMethod() != nullptr) @@ -708,7 +598,7 @@ void CxxAstVisitorComponentIndexer::visitDeclRefExpr(clang::DeclRefExpr* s) void CxxAstVisitorComponentIndexer::visitMemberExpr(clang::MemberExpr* s) { - if (shouldVisitReference(s->getMemberLoc(), getAstVisitor()->getComponent()->getTopmostContextDecl())) + if (getAstVisitor()->shouldVisitReference(s->getMemberLoc(), getAstVisitor()->getComponent()->getTopmostContextDecl())) { const ReferenceKind refKind = consumeDeclRefContextKind(); const NameHierarchy referencedName = getAstVisitor()->getDeclNameCache()->getValue(s->getMemberDecl()); @@ -744,7 +634,7 @@ void CxxAstVisitorComponentIndexer::visitCXXConstructExpr(clang::CXXConstructExp } } - if (shouldVisitReference(s->getLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) + if (getAstVisitor()->shouldVisitReference(s->getLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) { //if (e->getParenOrBraceRange().isValid()) { // // XXX: This code is a kludge. Recording calls to constructors is @@ -809,7 +699,7 @@ void CxxAstVisitorComponentIndexer::visitCXXConstructExpr(clang::CXXConstructExp void CxxAstVisitorComponentIndexer::visitLambdaExpr(clang::LambdaExpr* s) { clang::CXXMethodDecl* methodDecl = s->getCallOperator(); - if (shouldVisitDecl(methodDecl)) + if (getAstVisitor()->shouldVisitDecl(methodDecl)) { m_client->recordSymbol( getAstVisitor()->getDeclNameCache()->getValue(methodDecl), @@ -822,28 +712,9 @@ void CxxAstVisitorComponentIndexer::visitLambdaExpr(clang::LambdaExpr* s) } } -void CxxAstVisitorComponentIndexer::visitMSAsmStmt(clang::MSAsmStmt* s) -{ - if (shouldVisitStmt(s)) - { - if (s->hasBraces()) - { - const clang::NamedDecl* contextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(); - if (!contextDecl || !utility::isImplicit(contextDecl)) - { - ParseLocation asdasd = getParseLocation(s->getLocEnd()); - recordBraces( - getParseLocation(s->getLBraceLoc()), - getParseLocation(getLastRBraceLocation(s->getLocStart(), s->getLocEnd(), m_astContext->getSourceManager(), m_astContext->getLangOpts())) - ); - } - } - } -} - void CxxAstVisitorComponentIndexer::visitConstructorInitializer(clang::CXXCtorInitializer* init) { - if (shouldVisitReference(init->getMemberLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) + if (getAstVisitor()->shouldVisitReference(init->getMemberLocation(), getAstVisitor()->getComponent()->getTopmostContextDecl())) { // record the field usage here because it is not a DeclRefExpr if (clang::FieldDecl* memberDecl = init->getMember()) @@ -877,33 +748,6 @@ void CxxAstVisitorComponentIndexer::recordTemplateMemberSpecialization( } } -void CxxAstVisitorComponentIndexer::recordBraces(const ParseLocation& lbraceLoc, const ParseLocation& rbraceLoc) -{ - std::wstring name = - lbraceLoc.filePath.fileName() + L"<" + - std::to_wstring(lbraceLoc.startLineNumber) + L":" + - std::to_wstring(lbraceLoc.startColumnNumber) + L">"; - - if (lbraceLoc.startColumnNumber != rbraceLoc.startColumnNumber || - lbraceLoc.endColumnNumber != rbraceLoc.endColumnNumber || - lbraceLoc.startLineNumber != rbraceLoc.startLineNumber || - lbraceLoc.endLineNumber != rbraceLoc.endLineNumber) - { - if (lbraceLoc.startColumnNumber == lbraceLoc.endColumnNumber && - lbraceLoc.startLineNumber == lbraceLoc.endLineNumber) - { - m_client->recordLocalSymbol(name, lbraceLoc); - //m_client->recordLocalSymbol(L"BRACE_START", lbraceLoc); - } - if (rbraceLoc.startColumnNumber == rbraceLoc.endColumnNumber && - rbraceLoc.startLineNumber == rbraceLoc.endLineNumber) - { - m_client->recordLocalSymbol(name, rbraceLoc); - //m_client->recordLocalSymbol(L"BRACE_END", rbraceLoc); - } - } -} - ParseLocation CxxAstVisitorComponentIndexer::getParseLocationOfTagDeclBody(clang::TagDecl* decl) const { return getAstVisitor()->getParseLocationOfTagDeclBody(decl); @@ -940,57 +784,3 @@ ReferenceKind CxxAstVisitorComponentIndexer::consumeDeclRefContextKind() } return refKind; } - -bool CxxAstVisitorComponentIndexer::shouldVisitStmt(const clang::Stmt* s) const -{ - if (s) - { - clang::SourceLocation loc = m_astContext->getSourceManager().getExpansionLoc(s->getLocStart()); - - if (loc.isInvalid()) - { - loc = s->getLocStart(); - } - - if (getAstVisitor()->isLocatedInProjectFile(loc)) - { - return true; - } - } - return false; -} - -bool CxxAstVisitorComponentIndexer::shouldVisitDecl(const clang::Decl* decl) const -{ - if (decl) - { - clang::SourceLocation loc = m_astContext->getSourceManager().getExpansionLoc(decl->getLocation()); - - if (loc.isInvalid()) - { - loc = decl->getLocation(); - } - - if (getAstVisitor()->isLocatedInProjectFile(loc)) - { - return true; - } - } - return false; -} - -bool CxxAstVisitorComponentIndexer::shouldVisitReference(const clang::SourceLocation& referenceLocation, const clang::Decl* contextDecl) const -{ - clang::SourceLocation loc = m_astContext->getSourceManager().getExpansionLoc(referenceLocation); - if (loc.isInvalid()) - { - loc = referenceLocation; - } - - if (getAstVisitor()->isLocatedInProjectFile(loc)) - { - return true; - } - - return false; -} diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h index 5ba71601..c32149ca 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h @@ -3,7 +3,6 @@ #include -#include "data/parser/cxx/CxxAstVisitor.h" #include "data/parser/cxx/CxxAstVisitorComponent.h" #include "data/parser/ReferenceKind.h" #include "data/parser/SymbolKind.h" @@ -12,7 +11,7 @@ class CxxAstVisitorComponentIndexer: public CxxAstVisitorComponent { public: - CxxAstVisitorComponentIndexer(CxxAstVisitor* astVisitor, clang::ASTContext* astContext, std::shared_ptr client, std::shared_ptr fileRegister); + CxxAstVisitorComponentIndexer(CxxAstVisitor* astVisitor, clang::ASTContext* astContext, std::shared_ptr client); void beginTraverseNestedNameSpecifierLoc(const clang::NestedNameSpecifierLoc& loc) override; void beginTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; @@ -38,13 +37,10 @@ public: void visitTypeLoc(clang::TypeLoc tl) override; - void visitCompoundStmt(clang::CompoundStmt* s) override; - void visitInitListExpr(clang::InitListExpr* s) override; void visitDeclRefExpr(clang::DeclRefExpr* s) override; void visitMemberExpr(clang::MemberExpr* s) override; void visitCXXConstructExpr(clang::CXXConstructExpr* s) override; void visitLambdaExpr(clang::LambdaExpr* s) override; - void visitMSAsmStmt(clang::MSAsmStmt* s) override; void visitConstructorInitializer(clang::CXXCtorInitializer* init) override; @@ -56,8 +52,6 @@ private: SymbolKind symbolKind ); - void recordBraces(const ParseLocation& lbraceLoc, const ParseLocation& rbraceLoc); - ParseLocation getParseLocationOfTagDeclBody(clang::TagDecl* decl) const; ParseLocation getParseLocationOfFunctionBody(const clang::FunctionDecl* decl) const; ParseLocation getParseLocation(const clang::SourceLocation& loc) const; @@ -65,13 +59,8 @@ private: ReferenceKind consumeDeclRefContextKind(); - bool shouldVisitStmt(const clang::Stmt* s) const; - bool shouldVisitDecl(const clang::Decl* decl) const; - bool shouldVisitReference(const clang::SourceLocation& referenceLocation, const clang::Decl* contextDecl) const; - clang::ASTContext* m_astContext; std::shared_ptr m_client; - std::shared_ptr m_fileRegister; }; #endif // CXX_AST_VISITOR_COMPONENT_INDEXER_H diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.cpp index dde1671e..52bd4dca 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.cpp @@ -5,10 +5,6 @@ CxxAstVisitorComponentTypeRefKind::CxxAstVisitorComponentTypeRefKind(CxxAstVisit { } -CxxAstVisitorComponentTypeRefKind::~CxxAstVisitorComponentTypeRefKind() -{ -} - ReferenceKind CxxAstVisitorComponentTypeRefKind::getReferenceKind() const { for (auto it = m_refKindStack.rbegin(); it != m_refKindStack.rend(); it++) diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.h index 9c72403c..f906d472 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentTypeRefKind.h @@ -15,18 +15,17 @@ class CxxAstVisitorComponentTypeRefKind: public CxxAstVisitorComponent { public: CxxAstVisitorComponentTypeRefKind(CxxAstVisitor* astVisitor); - virtual ~CxxAstVisitorComponentTypeRefKind(); ReferenceKind getReferenceKind() const; - virtual void beginTraverseCXXBaseSpecifier() override; - virtual void endTraverseCXXBaseSpecifier() override; + void beginTraverseCXXBaseSpecifier() override; + void endTraverseCXXBaseSpecifier() override; - virtual void beginTraverseTemplateDefaultArgumentLoc() override; - virtual void endTraverseTemplateDefaultArgumentLoc() override; + void beginTraverseTemplateDefaultArgumentLoc() override; + void endTraverseTemplateDefaultArgumentLoc() override; - virtual void beginTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; - virtual void endTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; + void beginTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; + void endTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc) override; private: std::vector m_refKindStack; diff --git a/src/lib_cxx/data/parser/cxx/CxxCompilationDatabaseSingle.h b/src/lib_cxx/data/parser/cxx/CxxCompilationDatabaseSingle.h index a8a54a9b..ff994c53 100644 --- a/src/lib_cxx/data/parser/cxx/CxxCompilationDatabaseSingle.h +++ b/src/lib_cxx/data/parser/cxx/CxxCompilationDatabaseSingle.h @@ -9,9 +9,9 @@ class CxxCompilationDatabaseSingle public: CxxCompilationDatabaseSingle(const clang::tooling::CompileCommand& command); - virtual std::vector getCompileCommands(llvm::StringRef FilePath) const override; - virtual std::vector getAllFiles() const override; - virtual std::vector getAllCompileCommands() const override; + std::vector getCompileCommands(llvm::StringRef FilePath) const override; + std::vector getAllFiles() const override; + std::vector getAllCompileCommands() const override; private: clang::tooling::CompileCommand m_command; diff --git a/src/lib_cxx/data/parser/cxx/CxxContext.cpp b/src/lib_cxx/data/parser/cxx/CxxContext.cpp index ce0fee29..0fb34a68 100644 --- a/src/lib_cxx/data/parser/cxx/CxxContext.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxContext.cpp @@ -1,19 +1,11 @@ #include "data/parser/cxx/CxxContext.h" -CxxContext::~CxxContext() -{ -} - CxxContextDecl::CxxContextDecl(const clang::NamedDecl* decl, std::shared_ptr nameCache) : m_decl(decl) , m_nameCache(nameCache) { } -CxxContextDecl::~CxxContextDecl() -{ -} - NameHierarchy CxxContextDecl::getName() { return m_nameCache->getValue(m_decl); @@ -30,10 +22,6 @@ CxxContextType::CxxContextType(const clang::Type* type, std::shared_ptrgetValue(m_type); diff --git a/src/lib_cxx/data/parser/cxx/CxxContext.h b/src/lib_cxx/data/parser/cxx/CxxContext.h index 370705ad..af9be27f 100644 --- a/src/lib_cxx/data/parser/cxx/CxxContext.h +++ b/src/lib_cxx/data/parser/cxx/CxxContext.h @@ -12,7 +12,7 @@ typedef UnorderedCache TypeNameCache; class CxxContext { public: - virtual ~CxxContext(); + virtual ~CxxContext() = default; virtual NameHierarchy getName() = 0; virtual const clang::NamedDecl* getDecl() = 0; }; @@ -21,9 +21,8 @@ class CxxContextDecl: public CxxContext { public: CxxContextDecl(const clang::NamedDecl* decl, std::shared_ptr nameCache); - virtual ~CxxContextDecl(); - virtual NameHierarchy getName(); - virtual const clang::NamedDecl* getDecl(); + NameHierarchy getName() override; + const clang::NamedDecl* getDecl() override; private: const clang::NamedDecl* m_decl; @@ -34,9 +33,8 @@ class CxxContextType: public CxxContext { public: CxxContextType(const clang::Type* type, std::shared_ptr nameCache); - virtual ~CxxContextType(); - virtual NameHierarchy getName(); - virtual const clang::NamedDecl* getDecl(); + NameHierarchy getName() override; + const clang::NamedDecl* getDecl() override; private: const clang::Type* m_type; diff --git a/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.h b/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.h index cddc1fe0..154918ae 100644 --- a/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.h +++ b/src/lib_cxx/data/parser/cxx/CxxDiagnosticConsumer.h @@ -22,10 +22,10 @@ public: bool useLogging = true ); - void BeginSourceFile(const clang::LangOptions& langOptions, const clang::Preprocessor* preProcessor); - void EndSourceFile(); + void BeginSourceFile(const clang::LangOptions& langOptions, const clang::Preprocessor* preProcessor) override; + void EndSourceFile() override; - void HandleDiagnostic(clang::DiagnosticsEngine::Level level, const clang::Diagnostic& info); + void HandleDiagnostic(clang::DiagnosticsEngine::Level level, const clang::Diagnostic& info) override; private: std::shared_ptr m_client; diff --git a/src/lib_cxx/data/parser/cxx/CxxParser.cpp b/src/lib_cxx/data/parser/cxx/CxxParser.cpp index 3bdac8c6..7872e637 100644 --- a/src/lib_cxx/data/parser/cxx/CxxParser.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxParser.cpp @@ -9,7 +9,6 @@ #include "data/parser/cxx/CanonicalFilePathCache.h" #include "data/parser/cxx/CxxCompilationDatabaseSingle.h" #include "data/parser/cxx/CxxDiagnosticConsumer.h" - #include "utility/file/FilePath.h" #include "utility/file/FileRegister.h" #include "utility/logging/logging.h" @@ -66,10 +65,6 @@ CxxParser::CxxParser(std::shared_ptr client, std::shared_ptr indexerCommand) { clang::tooling::CompileCommand compileCommand; diff --git a/src/lib_cxx/data/parser/cxx/CxxParser.h b/src/lib_cxx/data/parser/cxx/CxxParser.h index e9649c34..0ccd7cbf 100644 --- a/src/lib_cxx/data/parser/cxx/CxxParser.h +++ b/src/lib_cxx/data/parser/cxx/CxxParser.h @@ -1,6 +1,9 @@ #ifndef CXX_PARSER_H #define CXX_PARSER_H +#include +#include + #include "data/parser/Parser.h" class CanonicalFilePathCache; @@ -10,6 +13,7 @@ class FileRegister; class IndexerCommandCxxCdb; class IndexerCommandCxxEmpty; class TaskParseCxx; +class TextAccess; namespace clang { namespace tooling { @@ -22,7 +26,6 @@ class CxxParser: public Parser { public: CxxParser(std::shared_ptr client, std::shared_ptr fileRegister); - ~CxxParser(); void buildIndex(std::shared_ptr indexerCommand); void buildIndex(std::shared_ptr indexerCommand); diff --git a/src/lib_cxx/data/parser/cxx/PreprocessorCallbacks.h b/src/lib_cxx/data/parser/cxx/PreprocessorCallbacks.h index 580f78b1..0349a8a1 100644 --- a/src/lib_cxx/data/parser/cxx/PreprocessorCallbacks.h +++ b/src/lib_cxx/data/parser/cxx/PreprocessorCallbacks.h @@ -27,28 +27,28 @@ public: std::shared_ptr fileRegister, std::shared_ptr canonicalFilePathCache); - virtual void FileChanged( + void FileChanged( clang::SourceLocation location, FileChangeReason reason, clang::SrcMgr::CharacteristicKind, clang::FileID) override; - virtual void InclusionDirective( + void InclusionDirective( clang::SourceLocation hashLocation, const clang::Token& includeToken, llvm::StringRef fileName, bool isAngled, clang::CharSourceRange fileNameRange, const clang::FileEntry* fileEntry, llvm::StringRef searchPath, llvm::StringRef relativePath, const clang::Module* imported) override; - virtual void MacroDefined(const clang::Token& macroNameToken, const clang::MacroDirective* macroDirective) override; - virtual void MacroUndefined( - const clang::Token& macroNameToken, - const clang::MacroDefinition& macroDefinition, + void MacroDefined(const clang::Token& macroNameToken, const clang::MacroDirective* macroDirective) override; + void MacroUndefined( + const clang::Token& macroNameToken, + const clang::MacroDefinition& macroDefinition, const clang::MacroDirective* macroUndefinition) override; - virtual void Defined( + void Defined( const clang::Token& macroNameToken, const clang::MacroDefinition& macroDefinition, clang::SourceRange range) override; - virtual void Ifdef(clang::SourceLocation location, const clang::Token& macroNameToken, + void Ifdef(clang::SourceLocation location, const clang::Token& macroNameToken, const clang::MacroDefinition& macroDefinition) override; - virtual void Ifndef(clang::SourceLocation location, const clang::Token& macroNameToken, + void Ifndef(clang::SourceLocation location, const clang::Token& macroNameToken, const clang::MacroDefinition& macroDefinition) override; - virtual void MacroExpands( + void MacroExpands( const clang::Token& macroNameToken, const clang::MacroDefinition& macroDirective, clang::SourceRange range, const clang::MacroArgs* args ) override; diff --git a/src/lib_java/data/parser/java/JavaParser.h b/src/lib_java/data/parser/java/JavaParser.h index 5affab68..d354e4fa 100644 --- a/src/lib_java/data/parser/java/JavaParser.h +++ b/src/lib_java/data/parser/java/JavaParser.h @@ -3,6 +3,7 @@ #include #include +#include #include "data/indexer/IndexerCommandJava.h" #include "data/parser/Parser.h" @@ -27,6 +28,7 @@ class _jstring; typedef _jstring *jstring; class FilePath; +class TextAccess; class JavaParser: public Parser { @@ -41,7 +43,7 @@ public: private: void buildIndex( - const FilePath& sourceFilePath, + const FilePath& sourceFilePath, const std::string& languageStandard, const std::string& classPath, std::shared_ptr textAccess); @@ -130,7 +132,7 @@ private: LOG_ERROR("parser with id " + std::to_string(parserId) + " not found"); \ } \ } - + DEF_RELAYING_METHOD_1(LogInfo, jstring) DEF_RELAYING_METHOD_1(LogWarning, jstring) DEF_RELAYING_METHOD_1(LogError, jstring)