summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/SourceCode.cpp
diff options
context:
space:
mode:
authorEric Liu <ioeric@google.com>2019-04-11 09:36:36 +0000
committerEric Liu <ioeric@google.com>2019-04-11 09:36:36 +0000
commit00d99bd1c4ad80dc909c74c39681978f843a44c6 (patch)
treef2bf9490f522f1fccb11a4e65e75a2d6c8db7d1a /clang-tools-extra/clangd/SourceCode.cpp
parent6ef53b3bf2fcccfc97e9a47d17c44cbe1f2b4481 (diff)
[clangd] Use identifiers in file as completion candidates when build is not ready.
Summary: o Lex the code to get the identifiers and put them into a "symbol" index. o Adds a new completion mode without compilation/sema into code completion workflow. o Make IncludeInserter work even when no compile command is present, by avoiding inserting non-verbatim headers. Reviewers: sammccall Reviewed By: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, jdoerfert, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D60126 llvm-svn: 358159
Diffstat (limited to 'clang-tools-extra/clangd/SourceCode.cpp')
-rw-r--r--clang-tools-extra/clangd/SourceCode.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/SourceCode.cpp b/clang-tools-extra/clangd/SourceCode.cpp
index 656ab1dc3c1e..d90b04a8a87d 100644
--- a/clang-tools-extra/clangd/SourceCode.cpp
+++ b/clang-tools-extra/clangd/SourceCode.cpp
@@ -391,5 +391,29 @@ cleanupAndFormat(StringRef Code, const tooling::Replacements &Replaces,
return formatReplacements(Code, std::move(*CleanReplaces), Style);
}
+llvm::StringMap<unsigned> collectIdentifiers(llvm::StringRef Content,
+ const format::FormatStyle &Style) {
+ SourceManagerForFile FileSM("dummy.cpp", Content);
+ auto &SM = FileSM.get();
+ auto FID = SM.getMainFileID();
+ Lexer Lex(FID, SM.getBuffer(FID), SM, format::getFormattingLangOpts(Style));
+ Token Tok;
+
+ llvm::StringMap<unsigned> Identifiers;
+ while (!Lex.LexFromRawLexer(Tok)) {
+ switch (Tok.getKind()) {
+ case tok::identifier:
+ ++Identifiers[Tok.getIdentifierInfo()->getName()];
+ break;
+ case tok::raw_identifier:
+ ++Identifiers[Tok.getRawIdentifier()];
+ break;
+ default:
+ continue;
+ }
+ }
+ return Identifiers;
+}
+
} // namespace clangd
} // namespace clang