llvm-project/clang-tools-extra/clangd
Sam McCall 588db1ccff [clangd] Use flags from open files when opening headers they include
Currently our strategy for getting header compile flags is something like:

A) look for flags for the header in compile_commands.json
   This basically never works, build systems don't generate this info.
B) try to match to an impl file in compile_commands.json and use its flags
   This only (mostly) works if the headers are in the same project.
C) give up and use fallback flags
   This kind of works for stdlib in the default configuration, and
   otherwise doesn't.

Obviously there are big gaps here.

This patch inserts a new attempt between A and B: if the header is
transitively included by any open file (whether same project or not),
then we use its compile command.

This doesn't make any attempt to solve some related problems:
 - parsing non-self-contained header files in context (importing PP state)
 - using the compile flags of non-opened candidate files found in the index

Fixes https://github.com/clangd/clangd/issues/123
Fixes https://github.com/clangd/clangd/issues/695
See https://github.com/clangd/clangd/issues/519

Differential Revision: https://reviews.llvm.org/D97351
2021-03-01 09:43:59 +01:00
..
benchmarks [clangd] Add bencmark for measuring latency of DecisionForest model. 2020-10-02 18:04:31 +02:00
fuzzer [clangd] Fix fuzzer build after 7ba0779fbb 2020-09-30 11:02:05 +02:00
include-mapping [clangd] Add include-mapping for C symbols. 2019-06-21 13:32:18 +00:00
index [clangd][remote] Add flag to set idletimeout 2021-02-26 15:04:44 +01:00
indexer [clangd] Improve clangd-indexer performance 2020-11-11 14:38:06 +03:00
quality Revert "[clangd] Extract symbol-scope logic out of Quality, add tests. NFC" 2021-01-29 14:59:16 +01:00
refactor [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
support [clangd] Expose absoluteParent helper 2021-02-19 13:40:21 +01:00
test [clangd] Use flags from open files when opening headers they include 2021-03-01 09:43:59 +01:00
tool [clangd] Retire clang-tidy-checks flag. 2021-02-13 14:14:22 +00:00
unittests [clangd] Use flags from open files when opening headers they include 2021-03-01 09:43:59 +01:00
xpc [clangd] makeStringError,make_error<StringError> -> error() 2020-09-14 11:48:31 +02:00
AST.cpp Improve hover scopes for Objective-C code 2021-02-12 10:27:32 -05:00
AST.h Improve hover scopes for Objective-C code 2021-02-12 10:27:32 -05:00
ASTSignals.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
ASTSignals.h [clangd] Trivial: Documentation fix in ASTSignals. 2021-01-14 18:38:42 +01:00
CMakeLists.txt [clangd] Modules can have a public API. NFC 2021-02-16 15:22:57 +01:00
CSymbolMap.inc [clangd] Add include-mapping for C symbols. 2019-06-21 13:32:18 +00:00
ClangdLSPServer.cpp [clangd] NFC, remove an extra "class" keyword. 2021-02-25 09:32:36 +01:00
ClangdLSPServer.h [clangd] Bind outgoing calls through LSPBinder too. NFC 2021-02-17 10:56:06 +01:00
ClangdServer.cpp [clangd] Shutdown sequence for modules, and doc threading requirements 2021-02-22 23:14:47 +01:00
ClangdServer.h [clangd] Shutdown sequence for modules, and doc threading requirements 2021-02-22 23:14:47 +01:00
CodeComplete.cpp [clangd] Drop template argument lists from completions followed by < 2021-02-18 13:06:11 +01:00
CodeComplete.h [clangd] Derive new signals in CC from ASTSignals. 2021-01-18 17:37:27 +01:00
CodeCompletionStrings.cpp [clangd] Fix invalid UTF8 when extracting doc comments. 2020-09-30 16:05:12 +02:00
CodeCompletionStrings.h
CollectMacros.cpp [clangd] Add main file macros into the main-file index. 2021-01-14 15:10:17 +03:00
CollectMacros.h [clangd] Add main file macros into the main-file index. 2021-01-14 15:10:17 +03:00
CompileCommands.cpp Reland [clangd] Quote/escape argv included in log messages. 2021-01-31 16:39:47 +01:00
CompileCommands.h Reland [clangd] Quote/escape argv included in log messages. 2021-01-31 16:39:47 +01:00
Compiler.cpp [clangd] Remove the recovery-ast options. 2021-01-20 11:23:57 +01:00
Compiler.h [clangd] Retire some flags for uncontroversial, stable features. 2021-01-20 11:47:12 +01:00
Config.cpp [clangd] config() -> Config::current to avoid confict with NS 2020-06-29 23:05:19 +02:00
Config.h [clangd] Parse Diagnostics block, and nest ClangTidy block under it. 2021-01-28 01:36:23 +01:00
ConfigCompile.cpp [clangd] Treat paths case-insensitively depending on the platform 2021-02-16 20:20:53 +01:00
ConfigFragment.h [clangd] Parse Diagnostics block, and nest ClangTidy block under it. 2021-01-28 01:36:23 +01:00
ConfigProvider.cpp [clangd] Expose absoluteParent helper 2021-02-19 13:40:21 +01:00
ConfigProvider.h [clangd] Publish config file errors over LSP 2020-12-07 11:07:32 +01:00
ConfigYAML.cpp [clangd] Parse Diagnostics block, and nest ClangTidy block under it. 2021-01-28 01:36:23 +01:00
Diagnostics.cpp [clangd] Allow diagnostics to be suppressed with configuration 2021-01-25 15:59:07 +01:00
Diagnostics.h [clangd] Allow diagnostics to be suppressed with configuration 2021-01-25 15:59:07 +01:00
DraftStore.cpp [clangd] Add error() function for creating formatv-style llvm::Errors. NFC 2020-09-14 10:43:42 +02:00
DraftStore.h [clangd] Move non-clang base pieces into separate support/ lib. NFCI 2020-04-29 15:57:12 +02:00
DumpAST.cpp Revert "Following up on PR48517, fix handling of template arguments that refer" 2021-01-20 15:55:35 +01:00
DumpAST.h [clangd] Add textDocument/ast extension method to dump the AST 2020-11-20 01:13:28 +01:00
ExpectedTypes.cpp Make llvm::StringRef to std::string conversions explicit. 2020-01-28 23:25:25 +01:00
ExpectedTypes.h
FS.cpp Make llvm::StringRef to std::string conversions explicit. 2020-01-28 23:25:25 +01:00
FS.h [clangd] Move non-clang base pieces into separate support/ lib. NFCI 2020-04-29 15:57:12 +02:00
Features.inc.in [clangd] Trim memory periodically when using glibc malloc 2020-12-22 08:54:28 +01:00
FileDistance.cpp [clangd] NFC: Use SmallVector<T> where possible 2020-12-10 13:36:49 +01:00
FileDistance.h Move endian constant from Host.h to SwapByteOrder.h, prune include 2019-10-19 00:48:11 +00:00
FindSymbols.cpp [clangd] Populate detail field in document symbols 2021-02-18 16:53:41 +01:00
FindSymbols.h [clang-tools-extra] NFC: Fix trivial typo in documents and comments 2020-04-05 15:28:40 +09:00
FindTarget.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
FindTarget.h [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
Format.cpp Lexer: Update the Lexer to use MemoryBufferRef, NFC 2020-10-19 19:10:21 -04:00
Format.h
FuzzyMatch.cpp
FuzzyMatch.h
GlobalCompilationDatabase.cpp [clangd] Expose absoluteParent helper 2021-02-19 13:40:21 +01:00
GlobalCompilationDatabase.h [clangd] Allow configuration database to be specified in config. 2021-01-25 23:15:48 +01:00
HeaderSourceSwitch.cpp [clangd][NFC] Use PathRef for getCorrespondingHeaderOrSource 2021-01-07 02:41:19 +00:00
HeaderSourceSwitch.h [clangd][NFC] Use PathRef for getCorrespondingHeaderOrSource 2021-01-07 02:41:19 +00:00
Headers.cpp [clangd] Introduce Modules 2021-02-12 18:37:16 +01:00
Headers.h [clangd] Use flags from open files when opening headers they include 2021-03-01 09:43:59 +01:00
HeuristicResolver.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
HeuristicResolver.h [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
Hover.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
Hover.h [clangd] Improve hover on arguments to function call 2020-07-03 11:51:15 +02:00
IncludeFixer.cpp [clangd] Deduplicate scopes in IncludeFixer queries 2021-02-05 14:02:50 +01:00
IncludeFixer.h [clangd] Compute scopes eagerly in IncludeFixer 2019-08-06 11:37:50 +00:00
JSONTransport.cpp [clangd] Avoid reallocating buffers for each message read: 2021-01-13 17:40:33 +01:00
LSPBinder.h [clangd] Bind outgoing calls through LSPBinder too. NFC 2021-02-17 10:56:06 +01:00
Module.cpp [clangd] Give modules access to filesystem, scheduler, and index. 2021-02-16 15:30:08 +01:00
Module.h [clangd] Shutdown sequence for modules, and doc threading requirements 2021-02-22 23:14:47 +01:00
ParsedAST.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
ParsedAST.h [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
PathMapping.cpp [clangd] Add error() function for creating formatv-style llvm::Errors. NFC 2020-09-14 10:43:42 +02:00
PathMapping.h [clangd] Add path mappings functionality 2020-01-07 12:40:51 +01:00
Preamble.cpp Frontend: Take VFS and MainFileBuffer by reference in PrecompiledPreamble::CanReuse, NFC 2021-01-25 17:50:56 -08:00
Preamble.h [clangd] Make use of preamble bounds from the patch inside ReplayPreamble 2020-06-17 18:32:59 +02:00
Protocol.cpp [clangd] Pass raw client capabilities to modules. NFC 2021-02-15 20:57:14 +01:00
Protocol.h [clangd] Pass raw client capabilities to modules. NFC 2021-02-15 20:57:14 +01:00
Quality.cpp Revert "[clangd] Extract symbol-scope logic out of Quality, add tests. NFC" 2021-01-29 14:59:16 +01:00
Quality.h Revert "[clangd] Extract symbol-scope logic out of Quality, add tests. NFC" 2021-01-29 14:59:16 +01:00
QueryDriverDatabase.cpp Reland [clangd] Quote/escape argv included in log messages. 2021-01-31 16:39:47 +01:00
README.md [Branch-Rename] Fix some links 2021-02-01 16:43:21 +05:30
RIFF.cpp [clangd] Add error() function for creating formatv-style llvm::Errors. NFC 2020-09-14 10:43:42 +02:00
RIFF.h [clangd] Improve serialization error messages. NFC 2020-07-08 17:31:40 +02:00
Selection.cpp [clangd] Selection handles CXXBaseSpecifier 2021-01-26 18:58:53 +00:00
Selection.h Remove references to the ast_type_traits namespace 2020-12-11 00:58:46 +01:00
SemanticHighlighting.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
SemanticHighlighting.h [clangd] Remove support for pre-standard semanticHighlighting notification 2021-02-10 22:09:03 +01:00
SemanticSelection.cpp [clang] Simplify buildSyntaxTree API 2020-11-09 22:49:54 +01:00
SemanticSelection.h [clangd] Implement textDocument/foldingRange 2020-07-14 09:28:42 +02:00
SourceCode.cpp [clangd] Fix locateMacroAt() for macro definition outside preamble 2020-12-13 18:33:33 -05:00
SourceCode.h [clangd] Add isKeyword function. 2020-10-05 15:11:24 +02:00
StdSymbolMap.inc [clangd] Add include-mapping for C symbols. 2019-06-21 13:32:18 +00:00
TUScheduler.cpp [clangd] Use flags from open files when opening headers they include 2021-03-01 09:43:59 +01:00
TUScheduler.h [clangd] Use flags from open files when opening headers they include 2021-03-01 09:43:59 +01:00
TidyProvider.cpp [clangd] Expose absoluteParent helper 2021-02-19 13:40:21 +01:00
TidyProvider.h [clangd] Validate clang-tidy Checks in clangd config. 2020-12-15 21:10:57 +00:00
Transport.h [NFC] Fix typos in Clangd and Clang 2019-12-16 10:54:40 +01:00
URI.cpp [clangd] Remove dead variable. NFC 2020-09-30 23:19:15 +02:00
URI.h [clangd] Simplify the callside of URI::resolve, NFC. 2019-09-23 14:39:37 +00:00
XRefs.cpp [clangd] Factor out the heuristic resolver code into its own class 2021-02-16 04:10:52 -05:00
XRefs.h [clangd] Report only decl of overridding method in xref. 2021-02-02 13:06:20 +01:00

README.md

clangd

clangd is a language server, and provides C++ IDE features to editors. This is not its documentation.

Communication channels

If you have any questions or feedback, you can reach community and developers through one of these channels:

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 default make is preferred. To do that consider passing -G Ninja to cmake invocation.
    • Finally, you can turn on assertions via -DLLVM_ENABLE_ASSERTS=On.
  • Afterwards you can build clangd with cmake --build $LLVM_ROOT/build --target clangd, similarly run tests by changing target to check-clangd.