rwols created this revision. Look up in parent directories for a .clang-format file. Use "LLVM" as fallback style.
https://reviews.llvm.org/D39430 Files: clangd/ClangdLSPServer.cpp clangd/ClangdLSPServer.h clangd/ClangdServer.cpp clangd/ClangdServer.h
Index: clangd/ClangdServer.h =================================================================== --- clangd/ClangdServer.h +++ clangd/ClangdServer.h @@ -285,11 +285,15 @@ llvm::Optional<Path> switchSourceHeader(PathRef Path); /// Run formatting for \p Rng inside \p File. - std::vector<tooling::Replacement> formatRange(PathRef File, Range Rng); + llvm::Expected<std::vector<tooling::Replacement>> formatRange(PathRef File, + Range Rng); + /// Run formatting for the whole \p File. - std::vector<tooling::Replacement> formatFile(PathRef File); + llvm::Expected<std::vector<tooling::Replacement>> formatFile(PathRef File); + /// Run formatting after a character was typed at \p Pos in \p File. - std::vector<tooling::Replacement> formatOnType(PathRef File, Position Pos); + llvm::Expected<std::vector<tooling::Replacement>> formatOnType(PathRef File, + Position Pos); /// Gets current document contents for \p File. \p File must point to a /// currently tracked file. Index: clangd/ClangdServer.cpp =================================================================== --- clangd/ClangdServer.cpp +++ clangd/ClangdServer.cpp @@ -34,13 +34,14 @@ std::promise<void> &Promise; }; -std::vector<tooling::Replacement> formatCode(StringRef Code, StringRef Filename, - ArrayRef<tooling::Range> Ranges) { +llvm::Expected<std::vector<tooling::Replacement>> +formatCode(StringRef Code, StringRef Filename, + ArrayRef<tooling::Range> Ranges) { // Call clang-format. - // FIXME: Don't ignore style. - format::FormatStyle Style = format::getLLVMStyle(); - auto Result = format::reformat(Style, Code, Ranges, Filename); - + auto StyleOrError = format::getStyle("file", Filename, "LLVM"); + if (!StyleOrError) + return StyleOrError.takeError(); + auto Result = format::reformat(StyleOrError.get(), Code, Ranges, Filename); return std::vector<tooling::Replacement>(Result.begin(), Result.end()); } @@ -301,23 +302,24 @@ return make_tagged(std::move(Result), TaggedFS.Tag); } -std::vector<tooling::Replacement> ClangdServer::formatRange(PathRef File, - Range Rng) { +llvm::Expected<std::vector<tooling::Replacement>> +ClangdServer::formatRange(PathRef File, Range Rng) { std::string Code = getDocument(File); size_t Begin = positionToOffset(Code, Rng.start); size_t Len = positionToOffset(Code, Rng.end) - Begin; return formatCode(Code, File, {tooling::Range(Begin, Len)}); } -std::vector<tooling::Replacement> ClangdServer::formatFile(PathRef File) { +llvm::Expected<std::vector<tooling::Replacement>> +ClangdServer::formatFile(PathRef File) { // Format everything. std::string Code = getDocument(File); return formatCode(Code, File, {tooling::Range(0, Code.size())}); } -std::vector<tooling::Replacement> ClangdServer::formatOnType(PathRef File, - Position Pos) { +llvm::Expected<std::vector<tooling::Replacement>> +ClangdServer::formatOnType(PathRef File, Position Pos) { // Look for the previous opening brace from the character position and // format starting from there. std::string Code = getDocument(File); Index: clangd/ClangdLSPServer.h =================================================================== --- clangd/ClangdLSPServer.h +++ clangd/ClangdLSPServer.h @@ -73,6 +73,12 @@ std::vector<clang::tooling::Replacement> getFixIts(StringRef File, const clangd::Diagnostic &D); + void replyWithTextEditsOrError( + Ctx C, std::string Code, + llvm::Expected<std::vector<clang::tooling::Replacement>> + ReplacementsOrError, + llvm::StringRef MessageInCaseError) const; + JSONOutput &Out; /// Used to indicate that the 'shutdown' request was received from the /// Language Server client. Index: clangd/ClangdLSPServer.cpp =================================================================== --- clangd/ClangdLSPServer.cpp +++ clangd/ClangdLSPServer.cpp @@ -9,6 +9,7 @@ #include "ClangdLSPServer.h" #include "JSONRPCDispatcher.h" +#include <llvm/Support/Error.h> using namespace clang::clangd; using namespace clang; @@ -89,30 +90,40 @@ Server.removeDocument(Params.textDocument.uri.file); } +void ClangdLSPServer::replyWithTextEditsOrError( + Ctx C, std::string Code, + llvm::Expected<std::vector<clang::tooling::Replacement>> + ReplacementsOrError, + llvm::StringRef MessageInCaseError) const { + if (!ReplacementsOrError) { + C.replyError(/*UnknownErrorCode*/ -32001, MessageInCaseError); + } else { + C.reply("[" + replacementsToEdits(Code, ReplacementsOrError.get()) + "]"); + } +} + void ClangdLSPServer::onDocumentOnTypeFormatting( Ctx C, DocumentOnTypeFormattingParams &Params) { - auto File = Params.textDocument.uri.file; - std::string Code = Server.getDocument(File); - std::string Edits = - replacementsToEdits(Code, Server.formatOnType(File, Params.position)); - C.reply("[" + Edits + "]"); + const auto File = Params.textDocument.uri.file; + replyWithTextEditsOrError(std::move(C), Server.getDocument(File), + Server.formatOnType(File, Params.position), + "Could not find .clang-format file!"); } void ClangdLSPServer::onDocumentRangeFormatting( Ctx C, DocumentRangeFormattingParams &Params) { - auto File = Params.textDocument.uri.file; - std::string Code = Server.getDocument(File); - std::string Edits = - replacementsToEdits(Code, Server.formatRange(File, Params.range)); - C.reply("[" + Edits + "]"); + const auto File = Params.textDocument.uri.file; + replyWithTextEditsOrError(std::move(C), Server.getDocument(File), + Server.formatRange(File, Params.range), + "Could not find .clang-format file!"); } void ClangdLSPServer::onDocumentFormatting(Ctx C, DocumentFormattingParams &Params) { - auto File = Params.textDocument.uri.file; - std::string Code = Server.getDocument(File); - std::string Edits = replacementsToEdits(Code, Server.formatFile(File)); - C.reply("[" + Edits + "]"); + const auto File = Params.textDocument.uri.file; + replyWithTextEditsOrError(std::move(C), Server.getDocument(File), + Server.formatFile(File), + "Could not find .clang-format file!"); } void ClangdLSPServer::onCodeAction(Ctx C, CodeActionParams &Params) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits