mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:30:12 +01:00
Implement lsp/formatting for Carbon::LanguageServer (#7688)
Implements formatting support within LSP. Current implementation performs while file formatting, we just replace file with output of Carbon::Format() https://github.com/carbon-language/carbon-lang/pull/7687 independently improves formatting so that this output is somewhat decent. Assisted-With: Gemini / Antigravity
This commit is contained in:
@@ -102,6 +102,7 @@ cc_library(
|
||||
"//common:check",
|
||||
"//common:raw_string_ostream",
|
||||
"//toolchain/base:shared_value_stores",
|
||||
"//toolchain/format",
|
||||
"//toolchain/lex",
|
||||
"//toolchain/lex:token_index",
|
||||
"//toolchain/lex:token_kind",
|
||||
|
||||
@@ -44,6 +44,13 @@ auto HandleDocumentSymbol(
|
||||
auto(llvm::Expected<std::vector<clang::clangd::DocumentSymbol>>)->void>
|
||||
on_done) -> void;
|
||||
|
||||
// Formats a document.
|
||||
auto HandleFormatting(
|
||||
Context& context, const clang::clangd::DocumentFormattingParams& params,
|
||||
llvm::function_ref<
|
||||
auto(llvm::Expected<std::vector<clang::clangd::TextEdit>>)->void>
|
||||
on_done) -> void;
|
||||
|
||||
// Provides the type of the entity at a position.
|
||||
auto HandleHover(
|
||||
Context& context, const clang::clangd::TextDocumentPositionParams& params,
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "common/raw_string_ostream.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "toolchain/format/format.h"
|
||||
#include "toolchain/language_server/handle.h"
|
||||
|
||||
namespace Carbon::LanguageServer {
|
||||
|
||||
// Returns the range covering the entire document text.
|
||||
static auto GetFullDocumentRange(llvm::StringRef text) -> clang::clangd::Range {
|
||||
int line_count = llvm::count(text, '\n') + 1;
|
||||
return clang::clangd::Range{
|
||||
.start = {.line = 0, .character = 0},
|
||||
.end = {.line = line_count, .character = 0},
|
||||
};
|
||||
}
|
||||
|
||||
auto HandleFormatting(
|
||||
Context& context, const clang::clangd::DocumentFormattingParams& params,
|
||||
llvm::function_ref<
|
||||
auto(llvm::Expected<std::vector<clang::clangd::TextEdit>>)->void>
|
||||
on_done) -> void {
|
||||
auto* file = context.LookupFile(params.textDocument.uri.file());
|
||||
if (!file) {
|
||||
return;
|
||||
}
|
||||
|
||||
RawStringOstream out;
|
||||
if (!Format::Format(file->tokens(), out)) {
|
||||
out.clear();
|
||||
on_done(std::vector<clang::clangd::TextEdit>());
|
||||
return;
|
||||
}
|
||||
|
||||
std::string formatted_text = out.TakeStr();
|
||||
if (formatted_text == file->text()) {
|
||||
on_done(std::vector<clang::clangd::TextEdit>());
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<clang::clangd::TextEdit> edits;
|
||||
edits.push_back(clang::clangd::TextEdit{
|
||||
.range = GetFullDocumentRange(file->text()),
|
||||
.newText = std::move(formatted_text),
|
||||
});
|
||||
on_done(std::move(edits));
|
||||
}
|
||||
|
||||
} // namespace Carbon::LanguageServer
|
||||
@@ -32,6 +32,7 @@ auto HandleInitialize(
|
||||
|
||||
llvm::json::Object capabilities{{"declarationProvider", true},
|
||||
{"definitionProvider", true},
|
||||
{"documentFormattingProvider", true},
|
||||
{"documentSymbolProvider", true},
|
||||
{"hoverProvider", true},
|
||||
{"positionEncoding", encoding},
|
||||
|
||||
@@ -76,6 +76,7 @@ IncomingMessages::IncomingMessages(clang::clangd::Transport* transport,
|
||||
AddCallHandler("textDocument/declaration", &HandleDefinition);
|
||||
AddCallHandler("textDocument/definition", &HandleDefinition);
|
||||
AddCallHandler("textDocument/documentSymbol", &HandleDocumentSymbol);
|
||||
AddCallHandler("textDocument/formatting", &HandleFormatting);
|
||||
AddCallHandler("textDocument/hover", &HandleHover);
|
||||
AddCallHandler("textDocument/references", &HandleReferences);
|
||||
AddCallHandler("textDocument/typeDefinition", &HandleTypeDefinition);
|
||||
|
||||
+2
-1
@@ -15,7 +15,7 @@
|
||||
|
||||
// CHECK:STDERR: error: Input/output error [LanguageServerTransportError]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -24,6 +24,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 351{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 393{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -29,6 +29,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-8",
|
||||
@@ -37,7 +38,7 @@
|
||||
// CHECK:STDOUT: "typeDefinitionProvider": true
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: }Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 2,
|
||||
@@ -46,6 +47,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
@@ -54,7 +56,7 @@
|
||||
// CHECK:STDOUT: "typeDefinitionProvider": true
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: }Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 3,
|
||||
@@ -63,6 +65,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
// CHECK:STDERR: warning: -32602: in call to `textDocument/didOpen`, JSON parse failed: missing value at (root).textDocument [LanguageServerNotificationParseError]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -28,6 +28,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -45,6 +45,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -30,7 +30,7 @@ choice Colors {
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -39,6 +39,7 @@ choice Colors {
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
+2
-1
@@ -33,7 +33,7 @@ fn G() {}
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -42,6 +42,7 @@ fn G() {}
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -29,7 +29,7 @@ fn Builtin() = "int.make_type_32";
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -38,6 +38,7 @@ fn Builtin() = "int.make_type_32";
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -27,7 +27,7 @@ class Incomplete {
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -36,6 +36,7 @@ class Incomplete {
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
// CHECK:STDERR: /test.cpp: warning: non-Carbon file requested [LanguageServerFileUnsupported]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -29,6 +29,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -28,7 +28,7 @@ fn Bar() {}
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -37,6 +37,7 @@ fn Bar() {}
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
// CHECK:STDERR: /test.carbon: warning: unknown file requested [LanguageServerFileUnknown]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -29,6 +29,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/language_server/testdata/formatting/basic.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/language_server/testdata/formatting/basic.carbon
|
||||
|
||||
// --- STDIN
|
||||
[[@LSP-CALL:initialize:"capabilities": {}]]
|
||||
[[@LSP-NOTIFY:textDocument/didOpen:
|
||||
"textDocument": {"uri": "file:/unformatted.carbon", "languageId": "carbon",
|
||||
"text": "fn F( ) { return ; }"}
|
||||
]]
|
||||
[[@LSP-CALL:textDocument/formatting:
|
||||
"textDocument": {"uri": "file:/unformatted.carbon"},
|
||||
"options": {"tabSize": 2, "insertSpaces": true}
|
||||
]]
|
||||
[[@LSP-NOTIFY:textDocument/didOpen:
|
||||
"textDocument": {"uri": "file:/formatted.carbon", "languageId": "carbon",
|
||||
"text": "fn F() {\n return;\n}\n"}
|
||||
]]
|
||||
[[@LSP-CALL:textDocument/formatting:
|
||||
"textDocument": {"uri": "file:/formatted.carbon"},
|
||||
"options": {"tabSize": 2, "insertSpaces": true}
|
||||
]]
|
||||
[[@LSP-NOTIFY:textDocument/didOpen:
|
||||
"textDocument": {"uri": "file:/empty.carbon", "languageId": "carbon",
|
||||
"text": ""}
|
||||
]]
|
||||
[[@LSP-CALL:textDocument/formatting:
|
||||
"textDocument": {"uri": "file:/empty.carbon"},
|
||||
"options": {"tabSize": 2, "insertSpaces": true}
|
||||
]]
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": {
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
// CHECK:STDOUT: "referencesProvider": true,
|
||||
// CHECK:STDOUT: "textDocumentSync": 2,
|
||||
// CHECK:STDOUT: "typeDefinitionProvider": true
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 151{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "method": "textDocument/publishDiagnostics",
|
||||
// CHECK:STDOUT: "params": {
|
||||
// CHECK:STDOUT: "diagnostics": [],
|
||||
// CHECK:STDOUT: "uri": "file:///unformatted.carbon"
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 284{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 2,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": [
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "newText": "fn F () {\n return;\n}\n",
|
||||
// CHECK:STDOUT: "range": {
|
||||
// CHECK:STDOUT: "end": {
|
||||
// CHECK:STDOUT: "character": 0,
|
||||
// CHECK:STDOUT: "line": 1
|
||||
// CHECK:STDOUT: },
|
||||
// CHECK:STDOUT: "start": {
|
||||
// CHECK:STDOUT: "character": 0,
|
||||
// CHECK:STDOUT: "line": 0
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: }Content-Length: 149{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "method": "textDocument/publishDiagnostics",
|
||||
// CHECK:STDOUT: "params": {
|
||||
// CHECK:STDOUT: "diagnostics": [],
|
||||
// CHECK:STDOUT: "uri": "file:///formatted.carbon"
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 284{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 3,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": [
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "newText": "fn F () {\n return;\n}\n",
|
||||
// CHECK:STDOUT: "range": {
|
||||
// CHECK:STDOUT: "end": {
|
||||
// CHECK:STDOUT: "character": 0,
|
||||
// CHECK:STDOUT: "line": 4
|
||||
// CHECK:STDOUT: },
|
||||
// CHECK:STDOUT: "start": {
|
||||
// CHECK:STDOUT: "character": 0,
|
||||
// CHECK:STDOUT: "line": 0
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: }Content-Length: 145{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "method": "textDocument/publishDiagnostics",
|
||||
// CHECK:STDOUT: "params": {
|
||||
// CHECK:STDOUT: "diagnostics": [],
|
||||
// CHECK:STDOUT: "uri": "file:///empty.carbon"
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 49{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 4,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": []
|
||||
// CHECK:STDOUT: }Content-Length: 51{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 5,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": null
|
||||
// CHECK:STDOUT: }
|
||||
@@ -0,0 +1,79 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/language_server/testdata/formatting/errors.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/language_server/testdata/formatting/errors.carbon
|
||||
|
||||
// --- STDIN
|
||||
[[@LSP-CALL:initialize:"capabilities": {}]]
|
||||
[[@LSP-NOTIFY:textDocument/didOpen:
|
||||
"textDocument": {"uri": "file:/error.carbon", "languageId": "carbon",
|
||||
"text": "fn F() {"}
|
||||
]]
|
||||
[[@LSP-CALL:textDocument/formatting:
|
||||
"textDocument": {"uri": "file:/error.carbon"},
|
||||
"options": {"tabSize": 2, "insertSpaces": true}
|
||||
]]
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": {
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
// CHECK:STDOUT: "referencesProvider": true,
|
||||
// CHECK:STDOUT: "textDocumentSync": 2,
|
||||
// CHECK:STDOUT: "typeDefinitionProvider": true
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 487{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "method": "textDocument/publishDiagnostics",
|
||||
// CHECK:STDOUT: "params": {
|
||||
// CHECK:STDOUT: "diagnostics": [
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "message": "opening symbol without a corresponding closing symbol",
|
||||
// CHECK:STDOUT: "range": {
|
||||
// CHECK:STDOUT: "end": {
|
||||
// CHECK:STDOUT: "character": 8,
|
||||
// CHECK:STDOUT: "line": 0
|
||||
// CHECK:STDOUT: },
|
||||
// CHECK:STDOUT: "start": {
|
||||
// CHECK:STDOUT: "character": 7,
|
||||
// CHECK:STDOUT: "line": 0
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: },
|
||||
// CHECK:STDOUT: "severity": 1,
|
||||
// CHECK:STDOUT: "source": "carbon"
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: "uri": "file:///error.carbon"
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 49{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 2,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": []
|
||||
// CHECK:STDOUT: }Content-Length: 51{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 3,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": null
|
||||
// CHECK:STDOUT: }
|
||||
@@ -0,0 +1,46 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/language_server/testdata/formatting/unknown.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/language_server/testdata/formatting/unknown.carbon
|
||||
// CHECK:STDERR: /test.carbon: warning: unknown file requested [LanguageServerFileUnknown]
|
||||
// CHECK:STDERR:
|
||||
|
||||
// --- STDIN
|
||||
[[@LSP-CALL:initialize:"capabilities": {}]]
|
||||
[[@LSP-CALL:textDocument/formatting:
|
||||
"textDocument": {"uri": "file:/test.carbon"},
|
||||
"options": {"tabSize": 2, "insertSpaces": true}
|
||||
]]
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": {
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
// CHECK:STDOUT: "referencesProvider": true,
|
||||
// CHECK:STDOUT: "textDocumentSync": 2,
|
||||
// CHECK:STDOUT: "typeDefinitionProvider": true
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }Content-Length: 51{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 3,
|
||||
// CHECK:STDOUT: "jsonrpc": "2.0",
|
||||
// CHECK:STDOUT: "result": null
|
||||
// CHECK:STDOUT: }
|
||||
@@ -51,7 +51,7 @@
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -60,6 +60,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -59,7 +59,7 @@ fn Run() {
|
||||
[[@LSP-CALL:shutdown]]
|
||||
[[@LSP-NOTIFY:exit]]
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -68,6 +68,7 @@ fn Run() {
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
// CHECK:STDERR: /test.carbon: warning: unknown file requested [LanguageServerFileUnknown]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -30,6 +30,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
// CHECK:STDERR: /test.carbon: warning: tried closing unknown file; ignoring request [LanguageServerCloseUnknownFile]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -29,6 +29,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -35,6 +35,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -37,6 +37,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -116,6 +116,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
+2
-1
@@ -35,7 +35,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -44,6 +44,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -34,6 +34,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -35,6 +35,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
// CHECK:STDERR: /test.carbon: warning: duplicate open file request; updating content [LanguageServerOpenDuplicateFile]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -34,6 +34,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
+2
-1
@@ -22,7 +22,7 @@
|
||||
|
||||
// --- AUTOUPDATE-SPLIT
|
||||
|
||||
// CHECK:STDOUT: Content-Length: 352{{\r}}
|
||||
// CHECK:STDOUT: Content-Length: 394{{\r}}
|
||||
// CHECK:STDOUT: {{\r}}
|
||||
// CHECK:STDOUT: {
|
||||
// CHECK:STDOUT: "id": 1,
|
||||
@@ -31,6 +31,7 @@
|
||||
// CHECK:STDOUT: "capabilities": {
|
||||
// CHECK:STDOUT: "declarationProvider": true,
|
||||
// CHECK:STDOUT: "definitionProvider": true,
|
||||
// CHECK:STDOUT: "documentFormattingProvider": true,
|
||||
// CHECK:STDOUT: "documentSymbolProvider": true,
|
||||
// CHECK:STDOUT: "hoverProvider": true,
|
||||
// CHECK:STDOUT: "positionEncoding": "utf-16",
|
||||
|
||||
Reference in New Issue
Block a user