diff options
author | Hans Wennborg <hans@hanshq.net> | 2019-08-13 11:35:16 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2019-08-13 11:35:16 +0000 |
commit | b13c264ccaf8891c3f784afef8f48f609c9f5ce5 (patch) | |
tree | 9d1a0a33fb44b0bf5185c14c065cf4311c86d225 | |
parent | Merging r368230: (diff) | |
download | llvm-project-b13c264ccaf8891c3f784afef8f48f609c9f5ce5.tar.gz llvm-project-b13c264ccaf8891c3f784afef8f48f609c9f5ce5.tar.bz2 llvm-project-b13c264ccaf8891c3f784afef8f48f609c9f5ce5.zip |
Merging r366541:
------------------------------------------------------------------------
r366541 | hokein | 2019-07-19 10:33:39 +0200 (Fri, 19 Jul 2019) | 11 lines
[clangd] cleanup: unify the implemenation of checking a location is inside main file.
Summary: We have variant implementations in the codebase, this patch unifies them.
Reviewers: ilya-biryukov, kadircet
Subscribers: MaskRay, jkorous, arphaman, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D64915
------------------------------------------------------------------------
llvm-svn: 368669
-rw-r--r-- | clang-tools-extra/clangd/ClangdUnit.cpp | 5 | ||||
-rw-r--r-- | clang-tools-extra/clangd/Diagnostics.cpp | 6 | ||||
-rw-r--r-- | clang-tools-extra/clangd/Headers.cpp | 2 | ||||
-rw-r--r-- | clang-tools-extra/clangd/IncludeFixer.cpp | 2 | ||||
-rw-r--r-- | clang-tools-extra/clangd/Quality.cpp | 7 | ||||
-rw-r--r-- | clang-tools-extra/clangd/SourceCode.cpp | 4 | ||||
-rw-r--r-- | clang-tools-extra/clangd/SourceCode.h | 8 | ||||
-rw-r--r-- | clang-tools-extra/clangd/XRefs.cpp | 2 | ||||
-rw-r--r-- | clang-tools-extra/clangd/index/SymbolCollector.cpp | 3 | ||||
-rw-r--r-- | clang-tools-extra/clangd/refactor/Rename.cpp | 3 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/SourceCodeTests.cpp | 30 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp | 3 |
12 files changed, 54 insertions, 21 deletions
diff --git a/clang-tools-extra/clangd/ClangdUnit.cpp b/clang-tools-extra/clangd/ClangdUnit.cpp index b337d851d0f7..3e9db706cfad 100644 --- a/clang-tools-extra/clangd/ClangdUnit.cpp +++ b/clang-tools-extra/clangd/ClangdUnit.cpp @@ -68,7 +68,7 @@ public: bool HandleTopLevelDecl(DeclGroupRef DG) override { for (Decl *D : DG) { auto &SM = D->getASTContext().getSourceManager(); - if (!SM.isWrittenInMainFile(SM.getExpansionLoc(D->getLocation()))) + if (!isInsideMainFile(D->getLocation(), SM)) continue; // ObjCMethodDecl are not actually top-level decls. @@ -355,8 +355,7 @@ ParsedAST::build(std::unique_ptr<CompilerInvocation> CI, // those might take us into a preamble file as well. bool IsInsideMainFile = Info.hasSourceManager() && - Info.getSourceManager().isWrittenInMainFile( - Info.getSourceManager().getFileLoc(Info.getLocation())); + isInsideMainFile(Info.getLocation(), Info.getSourceManager()); if (IsInsideMainFile && tidy::ShouldSuppressDiagnostic( DiagLevel, Info, *CTContext, /* CheckMacroExpansion = */ false)) { diff --git a/clang-tools-extra/clangd/Diagnostics.cpp b/clang-tools-extra/clangd/Diagnostics.cpp index 88bd6fdcad11..53192711a5df 100644 --- a/clang-tools-extra/clangd/Diagnostics.cpp +++ b/clang-tools-extra/clangd/Diagnostics.cpp @@ -140,15 +140,11 @@ void adjustDiagFromHeader(Diag &D, const clang::Diagnostic &Info, D.Message = llvm::Twine("in included file: ", D.Message).str(); } -bool isInsideMainFile(const SourceLocation Loc, const SourceManager &M) { - return Loc.isValid() && M.isWrittenInMainFile(M.getFileLoc(Loc)); -} - bool isInsideMainFile(const clang::Diagnostic &D) { if (!D.hasSourceManager()) return false; - return isInsideMainFile(D.getLocation(), D.getSourceManager()); + return clangd::isInsideMainFile(D.getLocation(), D.getSourceManager()); } bool isNote(DiagnosticsEngine::Level L) { diff --git a/clang-tools-extra/clangd/Headers.cpp b/clang-tools-extra/clangd/Headers.cpp index 877301ee2d92..7caaebaa6f30 100644 --- a/clang-tools-extra/clangd/Headers.cpp +++ b/clang-tools-extra/clangd/Headers.cpp @@ -35,7 +35,7 @@ public: llvm::StringRef /*RelativePath*/, const Module * /*Imported*/, SrcMgr::CharacteristicKind FileKind) override { - if (SM.isWrittenInMainFile(HashLoc)) { + if (isInsideMainFile(HashLoc, SM)) { Out->MainFileIncludes.emplace_back(); auto &Inc = Out->MainFileIncludes.back(); Inc.R = halfOpenToRange(SM, FilenameRange); diff --git a/clang-tools-extra/clangd/IncludeFixer.cpp b/clang-tools-extra/clangd/IncludeFixer.cpp index eb525f40e257..081dad83583b 100644 --- a/clang-tools-extra/clangd/IncludeFixer.cpp +++ b/clang-tools-extra/clangd/IncludeFixer.cpp @@ -338,7 +338,7 @@ public: assert(SemaPtr && "Sema must have been set."); if (SemaPtr->isSFINAEContext()) return TypoCorrection(); - if (!SemaPtr->SourceMgr.isWrittenInMainFile(Typo.getLoc())) + if (!isInsideMainFile(Typo.getLoc(), SemaPtr->SourceMgr)) return clang::TypoCorrection(); auto Extracted = extractUnresolvedNameCheaply( diff --git a/clang-tools-extra/clangd/Quality.cpp b/clang-tools-extra/clangd/Quality.cpp index 6ab05293274f..bd25256904cd 100644 --- a/clang-tools-extra/clangd/Quality.cpp +++ b/clang-tools-extra/clangd/Quality.cpp @@ -9,6 +9,7 @@ #include "Quality.h" #include "AST.h" #include "FileDistance.h" +#include "SourceCode.h" #include "URI.h" #include "index/Symbol.h" #include "clang/AST/ASTContext.h" @@ -42,8 +43,7 @@ static bool isReserved(llvm::StringRef Name) { static bool hasDeclInMainFile(const Decl &D) { auto &SourceMgr = D.getASTContext().getSourceManager(); for (auto *Redecl : D.redecls()) { - auto Loc = SourceMgr.getSpellingLoc(Redecl->getLocation()); - if (SourceMgr.isWrittenInMainFile(Loc)) + if (isInsideMainFile(Redecl->getLocation(), SourceMgr)) return true; } return false; @@ -53,8 +53,7 @@ static bool hasUsingDeclInMainFile(const CodeCompletionResult &R) { const auto &Context = R.Declaration->getASTContext(); const auto &SourceMgr = Context.getSourceManager(); if (R.ShadowDecl) { - const auto Loc = SourceMgr.getExpansionLoc(R.ShadowDecl->getLocation()); - if (SourceMgr.isWrittenInMainFile(Loc)) + if (isInsideMainFile(R.ShadowDecl->getLocation(), SourceMgr)) return true; } return false; diff --git a/clang-tools-extra/clangd/SourceCode.cpp b/clang-tools-extra/clangd/SourceCode.cpp index 9996f0ba6749..5370a8d88479 100644 --- a/clang-tools-extra/clangd/SourceCode.cpp +++ b/clang-tools-extra/clangd/SourceCode.cpp @@ -369,6 +369,10 @@ static SourceRange getTokenFileRange(SourceLocation Loc, return FileRange; } +bool isInsideMainFile(SourceLocation Loc, const SourceManager &SM) { + return Loc.isValid() && SM.isWrittenInMainFile(SM.getExpansionLoc(Loc)); +} + llvm::Optional<SourceRange> toHalfOpenFileRange(const SourceManager &SM, const LangOptions &LangOpts, SourceRange R) { diff --git a/clang-tools-extra/clangd/SourceCode.h b/clang-tools-extra/clangd/SourceCode.h index 8e58e66f4db8..4bbf3cf49fcd 100644 --- a/clang-tools-extra/clangd/SourceCode.h +++ b/clang-tools-extra/clangd/SourceCode.h @@ -75,6 +75,14 @@ llvm::Optional<Range> getTokenRange(const SourceManager &SM, llvm::Expected<SourceLocation> sourceLocationInMainFile(const SourceManager &SM, Position P); +/// Returns true iff \p Loc is inside the main file. This function handles +/// file & macro locations. For macro locations, returns iff the macro is being +/// expanded inside the main file. +/// +/// The function is usually used to check whether a declaration is inside the +/// the main file. +bool isInsideMainFile(SourceLocation Loc, const SourceManager &SM); + /// Turns a token range into a half-open range and checks its correctness. /// The resulting range will have only valid source location on both sides, both /// of which are file locations. diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index 77c975870c01..6d4f6f1fb292 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -406,7 +406,7 @@ public: assert(D->isCanonicalDecl() && "expect D to be a canonical declaration"); const SourceManager &SM = AST.getSourceManager(); Loc = SM.getFileLoc(Loc); - if (SM.isWrittenInMainFile(Loc) && CanonicalTargets.count(D)) + if (isInsideMainFile(Loc, SM) && CanonicalTargets.count(D)) References.push_back({D, Loc, Roles}); return true; } diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp index 8b2d40b3d389..cca8b004ca36 100644 --- a/clang-tools-extra/clangd/index/SymbolCollector.cpp +++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp @@ -185,8 +185,7 @@ getTokenLocation(SourceLocation TokLoc, const SourceManager &SM, bool isPreferredDeclaration(const NamedDecl &ND, index::SymbolRoleSet Roles) { const auto &SM = ND.getASTContext().getSourceManager(); return (Roles & static_cast<unsigned>(index::SymbolRole::Definition)) && - isa<TagDecl>(&ND) && - !SM.isWrittenInMainFile(SM.getExpansionLoc(ND.getLocation())); + isa<TagDecl>(&ND) && !isInsideMainFile(ND.getLocation(), SM); } RefKind toRefKind(index::SymbolRoleSet Roles) { diff --git a/clang-tools-extra/clangd/refactor/Rename.cpp b/clang-tools-extra/clangd/refactor/Rename.cpp index d54fae519140..b66eac4ee8da 100644 --- a/clang-tools-extra/clangd/refactor/Rename.cpp +++ b/clang-tools-extra/clangd/refactor/Rename.cpp @@ -104,8 +104,7 @@ llvm::Optional<ReasonToReject> renamableWithinFile(const Decl &RenameDecl, auto &ASTCtx = RenameDecl.getASTContext(); const auto &SM = ASTCtx.getSourceManager(); bool MainFileIsHeader = ASTCtx.getLangOpts().IsHeaderFile; - bool DeclaredInMainFile = - SM.isWrittenInMainFile(SM.getExpansionLoc(RenameDecl.getLocation())); + bool DeclaredInMainFile = isInsideMainFile(RenameDecl.getBeginLoc(), SM); // If the symbol is declared in the main file (which is not a header), we // rename it. diff --git a/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp b/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp index 1b2f4266bc2b..47d1f802cb7d 100644 --- a/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp +++ b/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp @@ -422,6 +422,36 @@ TEST(SourceCodeTests, GetMacros) { EXPECT_THAT(*Result, MacroName("MACRO")); } +TEST(SourceCodeTests, IsInsideMainFile){ + TestTU TU; + TU.HeaderCode = R"cpp( + #define DEFINE_CLASS(X) class X {}; + #define DEFINE_YY DEFINE_CLASS(YY) + + class Header1 {}; + DEFINE_CLASS(Header2) + class Header {}; + )cpp"; + TU.Code = R"cpp( + class Main1 {}; + DEFINE_CLASS(Main2) + DEFINE_YY + class Main {}; + )cpp"; + TU.ExtraArgs.push_back("-DHeader=Header3"); + TU.ExtraArgs.push_back("-DMain=Main3"); + auto AST = TU.build(); + const auto& SM = AST.getSourceManager(); + auto DeclLoc = [&AST](llvm::StringRef Name) { + return findDecl(AST, Name).getLocation(); + }; + for (const auto *HeaderDecl : {"Header1", "Header2", "Header3"}) + EXPECT_FALSE(isInsideMainFile(DeclLoc(HeaderDecl), SM)); + + for (const auto *MainDecl : {"Main1", "Main2", "Main3", "YY"}) + EXPECT_TRUE(isInsideMainFile(DeclLoc(MainDecl), SM)); +} + // Test for functions toHalfOpenFileRange and getHalfOpenFileRange TEST(SourceCodeTests, HalfOpenFileRange) { // Each marked range should be the file range of the decl with the same name diff --git a/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp b/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp index 8c88fe5169d8..8caa1c5aa732 100644 --- a/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp +++ b/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp @@ -124,8 +124,7 @@ public: const NamedDecl &ND = Qualified ? findDecl(*AST, Name) : findUnqualifiedDecl(*AST, Name); const SourceManager &SM = AST->getSourceManager(); - bool MainFile = - SM.isWrittenInMainFile(SM.getExpansionLoc(ND.getBeginLoc())); + bool MainFile = isInsideMainFile(ND.getBeginLoc(), SM); return SymbolCollector::shouldCollectSymbol( ND, AST->getASTContext(), SymbolCollector::Options(), MainFile); } |