Author: hokein Date: Wed Feb 6 07:24:50 2019 New Revision: 353306 URL: http://llvm.org/viewvc/llvm-project?rev=353306&view=rev Log: [clangd] Format tweak's replacements.
Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp clang-tools-extra/trunk/clangd/ClangdUnit.cpp clang-tools-extra/trunk/clangd/Compiler.h clang-tools-extra/trunk/clangd/SourceCode.cpp clang-tools-extra/trunk/clangd/SourceCode.h clang-tools-extra/trunk/clangd/refactor/Tweak.cpp clang-tools-extra/trunk/clangd/refactor/Tweak.h clang-tools-extra/trunk/clangd/refactor/tweaks/SwapIfBranches.cpp clang-tools-extra/trunk/unittests/clangd/TweakTests.cpp Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original) +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Wed Feb 6 07:24:50 2019 @@ -152,6 +152,9 @@ void ClangdServer::addDocument(PathRef F 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 Fi 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, Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.cpp?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original) +++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Wed Feb 6 07:24:50 2019 @@ -309,9 +309,8 @@ ParsedAST::build(std::unique_ptr<Compile 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) Modified: clang-tools-extra/trunk/clangd/Compiler.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Compiler.h?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Compiler.h (original) +++ clang-tools-extra/trunk/clangd/Compiler.h Wed Feb 6 07:24:50 2019 @@ -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. Modified: clang-tools-extra/trunk/clangd/SourceCode.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SourceCode.cpp?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/SourceCode.cpp (original) +++ clang-tools-extra/trunk/clangd/SourceCode.cpp Wed Feb 6 07:24:50 2019 @@ -335,5 +335,14 @@ format::FormatStyle getFormatStyleForFil 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 Modified: clang-tools-extra/trunk/clangd/SourceCode.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SourceCode.h?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/SourceCode.h (original) +++ clang-tools-extra/trunk/clangd/SourceCode.h Wed Feb 6 07:24:50 2019 @@ -144,6 +144,11 @@ format::FormatStyle getFormatStyleForFil 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 Modified: clang-tools-extra/trunk/clangd/refactor/Tweak.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/refactor/Tweak.cpp?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/refactor/Tweak.cpp (original) +++ clang-tools-extra/trunk/clangd/refactor/Tweak.cpp Wed Feb 6 07:24:50 2019 @@ -46,6 +46,14 @@ Tweak::Selection::Selection(ParsedAST &A 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(); Modified: clang-tools-extra/trunk/clangd/refactor/Tweak.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/refactor/Tweak.h?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/refactor/Tweak.h (original) +++ clang-tools-extra/trunk/clangd/refactor/Tweak.h Wed Feb 6 07:24:50 2019 @@ -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. Modified: clang-tools-extra/trunk/clangd/refactor/tweaks/SwapIfBranches.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/refactor/tweaks/SwapIfBranches.cpp?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/refactor/tweaks/SwapIfBranches.cpp (original) +++ clang-tools-extra/trunk/clangd/refactor/tweaks/SwapIfBranches.cpp Wed Feb 6 07:24:50 2019 @@ -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 Selec 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(); Modified: clang-tools-extra/trunk/unittests/clangd/TweakTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/TweakTests.cpp?rev=353306&r1=353305&r2=353306&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/TweakTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/TweakTests.cpp Wed Feb 6 07:24:50 2019 @@ -98,7 +98,7 @@ llvm::Expected<std::string> apply(String 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); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits