forked from OSchip/llvm-project
parent
54511076d4
commit
12e194cbb7
|
@ -152,6 +152,9 @@ void ClangdServer::addDocument(PathRef File, llvm::StringRef Contents,
|
|||
Opts.ClangTidyOpts = tidy::ClangTidyOptions::getDefaults();
|
||||
if (ClangTidyOptProvider)
|
||||
Opts.ClangTidyOpts = ClangTidyOptProvider->getOptions(File);
|
||||
// FIXME: cache this.
|
||||
Opts.Style =
|
||||
getFormatStyleForFile(File, Contents, FSProvider.getFileSystem().get());
|
||||
Opts.SuggestMissingIncludes = SuggestMissingIncludes;
|
||||
// FIXME: some build systems like Bazel will take time to preparing
|
||||
// environment to build the file, it would be nice if we could emit a
|
||||
|
@ -372,8 +375,7 @@ void ClangdServer::applyTweak(PathRef File, Range Sel, StringRef TweakID,
|
|||
auto A = prepareTweak(TweakID, *Selection);
|
||||
if (!A)
|
||||
return CB(A.takeError());
|
||||
// FIXME: run formatter on top of resulting replacements.
|
||||
return CB((*A)->apply(*Selection));
|
||||
return CB((*A)->apply(*Selection, InpAST->Inputs.Opts.Style));
|
||||
};
|
||||
WorkScheduler.runWithAST(
|
||||
"ApplyTweak", File,
|
||||
|
|
|
@ -309,9 +309,8 @@ ParsedAST::build(std::unique_ptr<CompilerInvocation> CI,
|
|||
llvm::Optional<IncludeFixer> FixIncludes;
|
||||
auto BuildDir = VFS->getCurrentWorkingDirectory();
|
||||
if (Opts.SuggestMissingIncludes && Index && !BuildDir.getError()) {
|
||||
auto Style = getFormatStyleForFile(MainInput.getFile(), Content, VFS.get());
|
||||
auto Inserter = std::make_shared<IncludeInserter>(
|
||||
MainInput.getFile(), Content, Style, BuildDir.get(),
|
||||
MainInput.getFile(), Content, Opts.Style, BuildDir.get(),
|
||||
Clang->getPreprocessor().getHeaderSearchInfo());
|
||||
if (Preamble) {
|
||||
for (const auto &Inc : Preamble->Includes.MainFileIncludes)
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "../clang-tidy/ClangTidyOptions.h"
|
||||
#include "index/Index.h"
|
||||
#include "clang/Format/Format.h"
|
||||
#include "clang/Frontend/CompilerInstance.h"
|
||||
#include "clang/Frontend/CompilerInvocation.h"
|
||||
#include "clang/Frontend/PrecompiledPreamble.h"
|
||||
|
@ -38,6 +39,7 @@ public:
|
|||
struct ParseOptions {
|
||||
tidy::ClangTidyOptions ClangTidyOpts;
|
||||
bool SuggestMissingIncludes = false;
|
||||
format::FormatStyle Style;
|
||||
};
|
||||
|
||||
/// Information required to run clang, e.g. to parse AST or do code completion.
|
||||
|
|
|
@ -335,5 +335,14 @@ format::FormatStyle getFormatStyleForFile(llvm::StringRef File,
|
|||
return *Style;
|
||||
}
|
||||
|
||||
llvm::Expected<tooling::Replacements>
|
||||
cleanupAndFormat(StringRef Code, const tooling::Replacements &Replaces,
|
||||
const format::FormatStyle &Style) {
|
||||
auto CleanReplaces = cleanupAroundReplacements(Code, Replaces, Style);
|
||||
if (!CleanReplaces)
|
||||
return CleanReplaces;
|
||||
return formatReplacements(Code, std::move(*CleanReplaces), Style);
|
||||
}
|
||||
|
||||
} // namespace clangd
|
||||
} // namespace clang
|
||||
|
|
|
@ -144,6 +144,11 @@ format::FormatStyle getFormatStyleForFile(llvm::StringRef File,
|
|||
llvm::StringRef Content,
|
||||
llvm::vfs::FileSystem *FS);
|
||||
|
||||
// Cleanup and format the given replacements.
|
||||
llvm::Expected<tooling::Replacements>
|
||||
cleanupAndFormat(StringRef Code, const tooling::Replacements &Replaces,
|
||||
const format::FormatStyle &Style);
|
||||
|
||||
} // namespace clangd
|
||||
} // namespace clang
|
||||
#endif
|
||||
|
|
|
@ -46,6 +46,14 @@ Tweak::Selection::Selection(ParsedAST &AST, unsigned RangeBegin,
|
|||
Cursor = SM.getComposedLoc(SM.getMainFileID(), RangeBegin);
|
||||
}
|
||||
|
||||
Expected<tooling::Replacements> Tweak::apply(const Selection &Sel,
|
||||
const format::FormatStyle &Style) {
|
||||
auto RawReplacements = execute(Sel);
|
||||
if (!RawReplacements)
|
||||
return RawReplacements;
|
||||
return cleanupAndFormat(Sel.Code, *RawReplacements, Style);
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<Tweak>> prepareTweaks(const Tweak::Selection &S) {
|
||||
validateRegistry();
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "ClangdUnit.h"
|
||||
#include "Protocol.h"
|
||||
#include "Selection.h"
|
||||
#include "clang/Format/Format.h"
|
||||
#include "clang/Tooling/Core/Replacement.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
|
@ -47,7 +48,7 @@ public:
|
|||
ParsedAST &AST;
|
||||
/// A location of the cursor in the editor.
|
||||
SourceLocation Cursor;
|
||||
// The AST nodes that were selected.
|
||||
/// The AST nodes that were selected.
|
||||
SelectionTree ASTSelection;
|
||||
// FIXME: provide a way to get sources and ASTs for other files.
|
||||
};
|
||||
|
@ -63,13 +64,20 @@ public:
|
|||
/// should be moved into 'apply'.
|
||||
/// Returns true iff the action is available and apply() can be called on it.
|
||||
virtual bool prepare(const Selection &Sel) = 0;
|
||||
/// Run the second stage of the action that would produce the actual changes.
|
||||
/// Format and apply the actual changes generated from the second stage of the
|
||||
/// action.
|
||||
/// EXPECTS: prepare() was called and returned true.
|
||||
virtual Expected<tooling::Replacements> apply(const Selection &Sel) = 0;
|
||||
Expected<tooling::Replacements> apply(const Selection &Sel,
|
||||
const format::FormatStyle &Style);
|
||||
/// A one-line title of the action that should be shown to the users in the
|
||||
/// UI.
|
||||
/// EXPECTS: prepare() was called and returned true.
|
||||
virtual std::string title() const = 0;
|
||||
|
||||
protected:
|
||||
/// Run the second stage of the action that would produce the actual changes.
|
||||
/// EXPECTS: prepare() was called and returned true.
|
||||
virtual Expected<tooling::Replacements> execute(const Selection &Sel) = 0;
|
||||
};
|
||||
|
||||
// All tweaks must be registered in the .cpp file next to their definition.
|
||||
|
|
|
@ -37,9 +37,11 @@ public:
|
|||
const char *id() const override final;
|
||||
|
||||
bool prepare(const Selection &Inputs) override;
|
||||
Expected<tooling::Replacements> apply(const Selection &Inputs) override;
|
||||
std::string title() const override;
|
||||
|
||||
protected:
|
||||
Expected<tooling::Replacements> execute(const Selection &Inputs) override;
|
||||
|
||||
private:
|
||||
const IfStmt *If = nullptr;
|
||||
};
|
||||
|
@ -60,7 +62,8 @@ bool SwapIfBranches::prepare(const Selection &Inputs) {
|
|||
dyn_cast_or_null<CompoundStmt>(If->getElse());
|
||||
}
|
||||
|
||||
Expected<tooling::Replacements> SwapIfBranches::apply(const Selection &Inputs) {
|
||||
Expected<tooling::Replacements>
|
||||
SwapIfBranches::execute(const Selection &Inputs) {
|
||||
auto &Ctx = Inputs.AST.getASTContext();
|
||||
auto &SrcMgr = Ctx.getSourceManager();
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ llvm::Expected<std::string> apply(StringRef ID, llvm::StringRef Input) {
|
|||
auto T = prepareTweak(ID, S);
|
||||
if (!T)
|
||||
return T.takeError();
|
||||
auto Replacements = (*T)->apply(S);
|
||||
auto Replacements = (*T)->apply(S, clang::format::getLLVMStyle());
|
||||
if (!Replacements)
|
||||
return Replacements.takeError();
|
||||
return applyAllReplacements(Code.code(), *Replacements);
|
||||
|
@ -127,12 +127,40 @@ TEST(TweakTest, SwapIfBranches) {
|
|||
|
||||
llvm::StringLiteral Input = R"cpp(
|
||||
void test() {
|
||||
^if (true) { return 100; } else { continue; }
|
||||
^if (true) {
|
||||
return 100;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
)cpp";
|
||||
llvm::StringLiteral Output = R"cpp(
|
||||
void test() {
|
||||
if (true) { continue; } else { return 100; }
|
||||
if (true) {
|
||||
continue;
|
||||
} else {
|
||||
return 100;
|
||||
}
|
||||
}
|
||||
)cpp";
|
||||
checkTransform(ID, Input, Output);
|
||||
|
||||
Input = R"cpp(
|
||||
void test() {
|
||||
^if () {
|
||||
return 100;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
)cpp";
|
||||
Output = R"cpp(
|
||||
void test() {
|
||||
if () {
|
||||
continue;
|
||||
} else {
|
||||
return 100;
|
||||
}
|
||||
}
|
||||
)cpp";
|
||||
checkTransform(ID, Input, Output);
|
||||
|
@ -144,7 +172,11 @@ TEST(TweakTest, SwapIfBranches) {
|
|||
)cpp";
|
||||
Output = R"cpp(
|
||||
void test() {
|
||||
if () { continue; } else { return 100; }
|
||||
if () {
|
||||
continue;
|
||||
} else {
|
||||
return 100;
|
||||
}
|
||||
}
|
||||
)cpp";
|
||||
checkTransform(ID, Input, Output);
|
||||
|
|
Loading…
Reference in New Issue