forked from OSchip/llvm-project
![]() - Inline SymbolID hashing to header - Don't collect references for symbols without a SymbolID - Store referenced symbols, rather than separately storing decls and macros. - Don't defer ref collection to end of translation unit - Perform const_cast when updating reference counts (~0.5% saving) - Introduce caching for getSymbolID in SymbolCollector. (~30% saving) - Don't modify symbolslab if there's no definition location - Don't lex the whole file to deduce spelled tokens, just lex the relevant piece (~8%) Overall this achieves ~38% reduction in time spent inside SymbolCollector compared to baseline (on my machine :)). I'd expect the last optimization to affect dynamic index a lot more, I was testing with clangd-indexer on clangd subfolder of LLVM. As clangd-indexer runs indexing of whole TU at once, we indeed see almost every token from every source included in the TU (hence lexing full files vs just lexing referenced tokens are almost the same), whereas during dynamic indexing we mostly index main file symbols, but we would touch the files defining/declaring those symbols, and lex complete files for nothing, rather than just the token location. The last optimization is also a functional change (added test), previously we used raw tokens from syntax::tokenize, which didn't canonicalize trigraphs/newlines in identifiers, wheres Lexer::getSpelling canonicalizes them. Differential Revision: https://reviews.llvm.org/D122894 |
||
---|---|---|
.. | ||
benchmarks | ||
fuzzer | ||
index | ||
indexer | ||
quality | ||
refactor | ||
support | ||
test | ||
tool | ||
unittests | ||
xpc | ||
AST.cpp | ||
AST.h | ||
ASTSignals.cpp | ||
ASTSignals.h | ||
CMakeLists.txt | ||
ClangdLSPServer.cpp | ||
ClangdLSPServer.h | ||
ClangdServer.cpp | ||
ClangdServer.h | ||
CodeComplete.cpp | ||
CodeComplete.h | ||
CodeCompletionStrings.cpp | ||
CodeCompletionStrings.h | ||
CollectMacros.cpp | ||
CollectMacros.h | ||
CompileCommands.cpp | ||
CompileCommands.h | ||
Compiler.cpp | ||
Compiler.h | ||
Config.cpp | ||
Config.h | ||
ConfigCompile.cpp | ||
ConfigFragment.h | ||
ConfigProvider.cpp | ||
ConfigProvider.h | ||
ConfigYAML.cpp | ||
Diagnostics.cpp | ||
Diagnostics.h | ||
DraftStore.cpp | ||
DraftStore.h | ||
DumpAST.cpp | ||
DumpAST.h | ||
ExpectedTypes.cpp | ||
ExpectedTypes.h | ||
FS.cpp | ||
FS.h | ||
Feature.cpp | ||
Feature.h | ||
FeatureModule.cpp | ||
FeatureModule.h | ||
Features.inc.in | ||
FileDistance.cpp | ||
FileDistance.h | ||
FindSymbols.cpp | ||
FindSymbols.h | ||
FindTarget.cpp | ||
FindTarget.h | ||
Format.cpp | ||
Format.h | ||
FuzzyMatch.cpp | ||
FuzzyMatch.h | ||
GlobalCompilationDatabase.cpp | ||
GlobalCompilationDatabase.h | ||
HeaderSourceSwitch.cpp | ||
HeaderSourceSwitch.h | ||
Headers.cpp | ||
Headers.h | ||
HeuristicResolver.cpp | ||
HeuristicResolver.h | ||
Hover.cpp | ||
Hover.h | ||
IncludeCleaner.cpp | ||
IncludeCleaner.h | ||
IncludeFixer.cpp | ||
IncludeFixer.h | ||
InlayHints.cpp | ||
InlayHints.h | ||
JSONTransport.cpp | ||
LSPBinder.h | ||
ParsedAST.cpp | ||
ParsedAST.h | ||
PathMapping.cpp | ||
PathMapping.h | ||
Preamble.cpp | ||
Preamble.h | ||
Protocol.cpp | ||
Protocol.h | ||
Quality.cpp | ||
Quality.h | ||
QueryDriverDatabase.cpp | ||
README.md | ||
RIFF.cpp | ||
RIFF.h | ||
Selection.cpp | ||
Selection.h | ||
SemanticHighlighting.cpp | ||
SemanticHighlighting.h | ||
SemanticSelection.cpp | ||
SemanticSelection.h | ||
SourceCode.cpp | ||
SourceCode.h | ||
TUScheduler.cpp | ||
TUScheduler.h | ||
TidyProvider.cpp | ||
TidyProvider.h | ||
Transport.h | ||
URI.cpp | ||
URI.h | ||
XRefs.cpp | ||
XRefs.h |
README.md
clangd
clangd is a language server, and provides C++ IDE features to editors. This is not its documentation.
- the website is https://clangd.llvm.org/.
- the bug tracker is https://github.com/clangd/clangd/issues
- the source code is hosted at https://github.com/llvm/llvm-project/tree/main/clang-tools-extra/clangd.
- the website source code is at https://github.com/llvm/clangd-www/
Communication channels
If you have any questions or feedback, you can reach community and developers through one of these channels:
- chat: #clangd room hosted on LLVM's Discord channel.
- user questions and feature requests can be asked in the clangd topic on LLVM Discussion Forums
Building and testing clangd
For a minimal setup on building clangd:
-
Clone the LLVM repo to
$LLVM_ROOT
. -
Create a build directory, for example at
$LLVM_ROOT/build
. -
Inside the build directory run:
cmake $LLVM_ROOT/llvm/ -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra"
.- We suggest building in
Release
mode as building DEBUG binaries requires considerably more resources. You can check Building LLVM with CMake documentation for more details about cmake flags. - In addition to that using
Ninja
as a generator rather than defaultmake
is preferred. To do that consider passing-G Ninja
to cmake invocation. - Finally, you can turn on assertions via
-DLLVM_ENABLE_ASSERTS=On
.
- We suggest building in
-
Afterwards you can build clangd with
cmake --build $LLVM_ROOT/build --target clangd
, similarly run tests by changing target tocheck-clangd
.