Author: hokein Date: Tue Jun 25 01:01:46 2019 New Revision: 364280 URL: http://llvm.org/viewvc/llvm-project?rev=364280&view=rev Log: [clangd] Cleanup the duplicated getTokenRange.
Summary: Also lift it to SourceCode.h, so that it can be used in other places (semantic code highlighting). Reviewers: kadircet Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D63714 Modified: clang-tools-extra/trunk/clangd/SourceCode.cpp clang-tools-extra/trunk/clangd/SourceCode.h clang-tools-extra/trunk/clangd/XRefs.cpp Modified: clang-tools-extra/trunk/clangd/SourceCode.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SourceCode.cpp?rev=364280&r1=364279&r2=364280&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/SourceCode.cpp (original) +++ clang-tools-extra/trunk/clangd/SourceCode.cpp Tue Jun 25 01:01:46 2019 @@ -196,6 +196,17 @@ Position sourceLocToPosition(const Sourc return P; } +llvm::Optional<Range> getTokenRange(const SourceManager &SM, + const LangOptions &LangOpts, + SourceLocation TokLoc) { + if (!TokLoc.isValid()) + return llvm::None; + SourceLocation End = Lexer::getLocForEndOfToken(TokLoc, 0, SM, LangOpts); + if (!End.isValid()) + return llvm::None; + return halfOpenToRange(SM, CharSourceRange::getCharRange(TokLoc, End)); +} + bool isValidFileRange(const SourceManager &Mgr, SourceRange R) { if (!R.getBegin().isValid() || !R.getEnd().isValid()) return false; Modified: clang-tools-extra/trunk/clangd/SourceCode.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SourceCode.h?rev=364280&r1=364279&r2=364280&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/SourceCode.h (original) +++ clang-tools-extra/trunk/clangd/SourceCode.h Tue Jun 25 01:01:46 2019 @@ -65,6 +65,11 @@ Position offsetToPosition(llvm::StringRe /// FIXME: This should return an error if the location is invalid. Position sourceLocToPosition(const SourceManager &SM, SourceLocation Loc); +/// Returns the taken range at \p TokLoc. +llvm::Optional<Range> getTokenRange(const SourceManager &SM, + const LangOptions &LangOpts, + SourceLocation TokLoc); + /// Return the file location, corresponding to \p P. Note that one should take /// care to avoid comparing the result with expansion locations. llvm::Expected<SourceLocation> sourceLocationInMainFile(const SourceManager &SM, Modified: clang-tools-extra/trunk/clangd/XRefs.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.cpp?rev=364280&r1=364279&r2=364280&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/XRefs.cpp (original) +++ clang-tools-extra/trunk/clangd/XRefs.cpp Tue Jun 25 01:01:46 2019 @@ -260,14 +260,6 @@ IdentifiedSymbol getSymbolAtPosition(Par return {DeclMacrosFinder.getFoundDecls(), DeclMacrosFinder.takeMacroInfos()}; } -Range getTokenRange(ASTContext &AST, SourceLocation TokLoc) { - const SourceManager &SourceMgr = AST.getSourceManager(); - SourceLocation LocEnd = - Lexer::getLocForEndOfToken(TokLoc, 0, SourceMgr, AST.getLangOpts()); - return {sourceLocToPosition(SourceMgr, TokLoc), - sourceLocToPosition(SourceMgr, LocEnd)}; -} - llvm::Optional<Location> makeLocation(ASTContext &AST, SourceLocation TokLoc, llvm::StringRef TUPath) { const SourceManager &SourceMgr = AST.getSourceManager(); @@ -279,10 +271,14 @@ llvm::Optional<Location> makeLocation(AS log("failed to get path!"); return None; } - Location L; - L.uri = URIForFile::canonicalize(*FilePath, TUPath); - L.range = getTokenRange(AST, TokLoc); - return L; + if (auto Range = + getTokenRange(AST.getSourceManager(), AST.getLangOpts(), TokLoc)) { + Location L; + L.uri = URIForFile::canonicalize(*FilePath, TUPath); + L.range = *Range; + return L; + } + return None; } } // namespace @@ -471,15 +467,19 @@ std::vector<DocumentHighlight> findDocum std::vector<DocumentHighlight> Result; for (const auto &Ref : References) { - DocumentHighlight DH; - DH.range = getTokenRange(AST.getASTContext(), Ref.Loc); - if (Ref.Role & index::SymbolRoleSet(index::SymbolRole::Write)) - DH.kind = DocumentHighlightKind::Write; - else if (Ref.Role & index::SymbolRoleSet(index::SymbolRole::Read)) - DH.kind = DocumentHighlightKind::Read; - else - DH.kind = DocumentHighlightKind::Text; - Result.push_back(std::move(DH)); + if (auto Range = + getTokenRange(AST.getASTContext().getSourceManager(), + AST.getASTContext().getLangOpts(), Ref.Loc)) { + DocumentHighlight DH; + DH.range = *Range; + if (Ref.Role & index::SymbolRoleSet(index::SymbolRole::Write)) + DH.kind = DocumentHighlightKind::Write; + else if (Ref.Role & index::SymbolRoleSet(index::SymbolRole::Read)) + DH.kind = DocumentHighlightKind::Read; + else + DH.kind = DocumentHighlightKind::Text; + Result.push_back(std::move(DH)); + } } return Result; } @@ -610,18 +610,6 @@ fetchTemplateParameters(const TemplatePa return TempParameters; } -static llvm::Optional<Range> getTokenRange(SourceLocation Loc, - const ASTContext &Ctx) { - if (!Loc.isValid()) - return llvm::None; - SourceLocation End = Lexer::getLocForEndOfToken( - Loc, 0, Ctx.getSourceManager(), Ctx.getLangOpts()); - if (!End.isValid()) - return llvm::None; - return halfOpenToRange(Ctx.getSourceManager(), - CharSourceRange::getCharRange(Loc, End)); -} - static const FunctionDecl *getUnderlyingFunction(const Decl *D) { // Extract lambda from variables. if (const VarDecl *VD = llvm::dyn_cast<VarDecl>(D)) { @@ -910,7 +898,9 @@ llvm::Optional<HoverInfo> getHover(Parse tooling::applyAllReplacements(HI->Definition, Replacements)) HI->Definition = *Formatted; - HI->SymRange = getTokenRange(SourceLocationBeg, AST.getASTContext()); + HI->SymRange = + getTokenRange(AST.getASTContext().getSourceManager(), + AST.getASTContext().getLangOpts(), SourceLocationBeg); return HI; } @@ -933,10 +923,14 @@ std::vector<Location> findReferences(Par // TODO: should we handle macros, too? auto MainFileRefs = findRefs(Symbols.Decls, AST); for (const auto &Ref : MainFileRefs) { - Location Result; - Result.range = getTokenRange(AST.getASTContext(), Ref.Loc); - Result.uri = URIForFile::canonicalize(*MainFilePath, *MainFilePath); - Results.push_back(std::move(Result)); + if (auto Range = + getTokenRange(AST.getASTContext().getSourceManager(), + AST.getASTContext().getLangOpts(), Ref.Loc)) { + Location Result; + Result.range = *Range; + Result.uri = URIForFile::canonicalize(*MainFilePath, *MainFilePath); + Results.push_back(std::move(Result)); + } } // Now query the index for references from other files. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits