forked from OSchip/llvm-project
![]() Adds a flag to `ClangTidyContext` that is used to indicate to checks that fixes will only be applied one at a time. This is to indicate to checks that each fix emitted should not depend on any other fixes emitted across the translation unit. I've currently implemented the `IncludeInserter`, `LoopConvertCheck` and `PreferMemberInitializerCheck` to use these support these modes. Reasoning behind this is in use cases like `clangd` it's only possible to apply one fix at a time. For include inserter checks, the include is only added once for the first diagnostic that requires it, this will result in subsequent fixes not having the included needed. A similar issue is seen in the `PreferMemberInitializerCheck` where the `:` will only be added for the first member that needs fixing. Fixes emitted in `StandaloneDiagsMode` will likely result in malformed code if they are applied all together, conversely fixes currently emitted may result in malformed code if they are applied one at a time. For this reason invoking `clang-tidy` from the binary will always with `StandaloneDiagsMode` disabled, However using it as a library its possible to select the mode you wish to use, `clangd` always selects `StandaloneDiagsMode`. This is an example of the current behaviour failing ```lang=c++ struct Foo { int A, B; Foo(int D, int E) { A = D; B = E; // Fix Here } }; ``` Incorrectly transformed to: ```lang=c++ struct Foo { int A, B; Foo(int D, int E), B(E) { A = D; // Fix Here } }; ``` In `StandaloneDiagsMode`, it gets transformed to: ```lang=c++ struct Foo { int A, B; Foo(int D, int E) : B(E) { A = D; // Fix Here } }; ``` Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D97121 |
||
---|---|---|
.. | ||
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
.