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:
DavidLoftus
2026-08-31 16:38:38 +00:00
committed by GitHub
parent f519cccaf2
commit dc2ee5bd5e
31 changed files with 379 additions and 25 deletions
+1
View File
@@ -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",
+7
View File
@@ -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);
@@ -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",
@@ -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",
@@ -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",
@@ -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",