diff options
| author | Eric Liu <ioeric@google.com> | 2019-04-11 09:36:36 +0000 |
|---|---|---|
| committer | Eric Liu <ioeric@google.com> | 2019-04-11 09:36:36 +0000 |
| commit | 00d99bd1c4ad80dc909c74c39681978f843a44c6 (patch) | |
| tree | f2bf9490f522f1fccb11a4e65e75a2d6c8db7d1a /clang-tools-extra/clangd/SourceCode.cpp | |
| parent | 6ef53b3bf2fcccfc97e9a47d17c44cbe1f2b4481 (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.cpp | 24 |
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 |
