ace-linters
ace-linters copied to clipboard
Can´t establish a success session with gopls
Expected Behavior
We want to establish a new WebSocket connection to gopls
with the ace-linter
client.
Actual Behavior
Establish the connection with the WebSocket using a custom implementation or goplsws
and the session is wrongly established and the linting for example not work properly.
Steps to Reproduce the Problem
- Try to connect to
gopls
(WebSocket):
import {LanguageClientConfig} from "ace-linters/types/types/language-service";
import {servFeatures} from "./config";
export let servers: LanguageClientConfig[] = [
{
module: () => import("ace-linters/build/language-client"),
modes: "golang",
type: "socket",
socket: new WebSocket("ws://localhost:3030"),
features: servFeatures,
initializationOptions: {}
},
]
export var golangContent = `
// You can edit this code!
// Click here and start typing.
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")ssss
}
`;
import "ace-code/esm-resolver";
import {AceLanguageClient} from "ace-linters/build/ace-language-client";
import {addFormatCommand, createEditorWithLSP} from "../../editor/creation";
import {golangContent} from "../../content-examples/golang-example";
import {LanguageProvider} from "ace-linters";
import {servers} from "./servers";
let modes = [
{
name: "golang",
mode: "ace/mode/golang",
content: golangContent
},
]
let languageProviders: LanguageProvider = AceLanguageClient.for(servers);
let i = 0;
for (let mode of modes) {
createEditorWithLSP(mode, i, languageProviders);
i++;
}
addFormatCommand(languageProviders);
import * as ace from "ace-code";
import "ace-code/src/ext/language_tools";
import event from "ace-code/src/lib/event";
import {HashHandler} from "ace-code/src/keyboard/hash_handler";
import keyUtil from "ace-code/src/lib/keys";
import * as theme from "ace-code/src/theme/textmate";
import type {LanguageProvider} from "ace-linters";
export function createEditorWithLSP(mode: any, i: number, languageProvider: LanguageProvider): ace.Ace.Editor {
let el: HTMLDivElement = document.createElement("div");
let modeName: HTMLParagraphElement = createModeNameText(el, mode.name);
let closeButton: HTMLSpanElement = createCloseButton(el);
let editorContainer: HTMLDivElement = document.createElement("div");
editorContainer.setAttribute("id", "container" + i);
editorContainer.style.height = "600px";
el.appendChild(editorContainer);
el.style.width = "90%";
el.style.float = "left";
document.body.appendChild(el);
let editor: ace.Ace.Editor = ace.edit("container" + i, {
mode: mode.mode,
value: mode.content,
relativeLineNumbers: false,
enableAutoIndent: true,
enableBasicAutocompletion: true,
enableLiveAutocompletion: true,
enableSnippets: true,
theme: theme,
customScrollbar: true,
});
editor.setTheme("ace/theme/cloud_editor_dark");
languageProvider.registerEditor(editor);
let options = mode.options ?? {};
languageProvider.setSessionOptions(editor.session, options);
closeButton.onclick = (): void => {
languageProvider.closeDocument(editor.session);
editor.destroy();
editor.container.remove();
modeName.remove();
closeButton.remove();
}
return editor;
}
export function createCloseButton(el: HTMLDivElement): HTMLSpanElement {
let closeButton: HTMLSpanElement = document.createElement("span");
closeButton.innerText = "\u00D7";
closeButton.style.cursor = "pointer";
el.appendChild(closeButton);
return closeButton;
}
export function createModeNameText(el: HTMLDivElement, name: string): HTMLParagraphElement {
let modeName: HTMLParagraphElement = document.createElement("p");
modeName.innerText = name;
modeName.style.margin = "0";
modeName.style.paddingRight = "10px";
modeName.style.float = "left";
el.appendChild(modeName);
return modeName;
}
export function addFormatCommand(languageProvider: LanguageProvider): void {
let menuKb = new HashHandler([
{
bindKey: "Ctrl-Shift-B",
name: "format",
exec: function (): void {
languageProvider.format();
}
}
]);
event.addCommandKeyListener(window, function (e, hashId, keyCode): void {
let keyString = keyUtil.keyCodeToString(keyCode);
let command = menuKb.findKeyCommand(hashId, keyString);
if (command) {
command.exec();
e.preventDefault();
}
});
}
- Connection to
gopls
established. - Start to change/edit the file in the browser with the ace client.
- Start to see errors when the ace client sends those changes:
- The main error:
JSON Server: [Error - Received] 10:03:37.907 AM #1 JSON RPC parse error: DocumentURI scheme is not 'file': session1.golang
{"jsonrpc":"2.0","error":{"code":-32700,"message":"JSON RPC parse error: DocumentURI scheme is not 'file': session1.golang"},"id":1}
- Full log:
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 0,
_buffers: [],
_compressed: false,
_payloadLength: 1088,
_mask: <Buffer 52 b8 9a f9>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"capabilities":{"textDocument":{"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"synchronization":{"dynamicRegistration":true,"willSave":false,"didSave":false,"willSaveWaitUntil":false},"formatting":{"dynamicRegistration":true},"completion":{"dynamicRegistration":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":false,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":false,"preselectSupport":false},"contextSupport":false},"signatureHelp":{"signatureInformation":{"documentationFormat":["markdown","plaintext"],"activeParameterSupport":true}},"documentHighlight":{"dynamicRegistration":true},"semanticTokens":{"multilineTokenSupport":false,"overlappingTokenSupport":false,"tokenTypes":[],"tokenModifiers":[],"formats":["relative"],"requests":{"full":{"delta":false},"range":true},"augmentsSyntaxTokens":true}},"workspace":{"didChangeConfiguration":{"dynamicRegistration":true}}},"initializationOptions":{},"processId":null,"rootUri":"","workspaceFolders":null}}'
}
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 712,
_buffers: [Array],
_compressed: false,
_payloadLength: 86,
_mask: <Buffer 2d e0 7e 1c>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{}}}'
}
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 404,
_buffers: [Array],
_compressed: false,
_payloadLength: 300,
_mask: <Buffer c5 46 97 54>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"session1.golang","version":1,"languageId":"golang","text":"\\n// You can edit this code!\\n// Click here and start typing.\\npackage main\\n\\nimport \\"fmt\\"\\n\\nfunc main() {\\n fmt.Println(\\"Hello, 世界\\")ssss\\n\n\\n"}}}'
}
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 296,
_buffers: [Array],
_compressed: false,
_payloadLength: 102,
_mask: <Buffer 07 c0 2a 94>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","method":"textDocument/didClose","params":{"textDocument":{"uri":"session1.golang"}}}'
}
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 0,
_buffers: [],
_compressed: false,
_payloadLength: 288,
_mask: <Buffer 7c c9 a5 53>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"session1.golang","languageId":"golang","text":"\\n// You can edit this code!\\n// Click here and start typing.\\npackage main\\n\\nimport \\"fmt\\"\\n\\nfunc main() {\\n fmt.Println(\\"Hello, 世界\\")ssss\\n}\\n\\n"}}}'
}
JSON Server: [Trace - 10:03:36.462 AM] Sending request 'initialize - (0)'.
Params: {"capabilities":{"textDocument":{"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"synchronization":{"dynamicRegistration":true,"willSave":false,"didSave":false,"willSaveWaitUntil":false},"formatting":{"dynamicRegistration":true},"completion":{"dynamicRegistration":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":false,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":false,"preselectSupport":false},"contextSupport":false},"signatureHelp":{"signatureInformation":{"documentationFormat":["markdown","plaintext"],"activeParameterSupport":true}},"documentHighlight":{"dynamicRegistration":true},"semanticTokens":{"multilineTokenSupport":false,"overlappingTokenSupport":false,"tokenTypes":[],"tokenModifiers":[],"formats":["relative"],"requests":{"full":{"delta":false},"range":true},"augmentsSyntaxTokens":true}},"workspace":{"didChangeConfiguration":{"dynamicRegistration":true}}},"initializationOptions":{},"processId":274438,"rootUri":"","workspaceFolders":null}
[Trace - 10:03:36.464 AM] Received response 'initialize - (0)' in 2ms.
Result: {"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"completionProvider":{"triggerCharacters":["."]},"hoverProvider":true,"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"typeDefinitionProvider":true,"implementationProvider":true,"referencesProvider":true,"documentHighlightProvider":true,"documentSymbolProvider":true,"codeActionProvider":true,"codeLensProvider":{},"documentLinkProvider":{},"workspaceSymbolProvider":true,"documentFormattingProvider":true,"renameProvider":true,"foldingRangeProvider":true,"selectionRangeProvider":true,"executeCommandProvider":{"commands":["gopls.add_dependency","gopls.add_import","gopls.add_telemetry_counters","gopls.apply_fix","gopls.change_signature","gopls.check_upgrades","gopls.diagnose_files","gopls.edit_go_directive","gopls.fetch_vulncheck_result","gopls.gc_details","gopls.generate","gopls.go_get_package","gopls.list_imports","gopls.list_known_packages","gopls.maybe_prompt_for_telemetry","gopls.mem_stats","gopls.regenerate_cgo","gopls.remove_dependency","gopls.reset_go_mod_diagnostics","gopls.run_go_work_command","gopls.run_govulncheck","gopls.run_tests","gopls.start_debugging","gopls.start_profile","gopls.stop_profile","gopls.test","gopls.tidy","gopls.toggle_gc_details","gopls.update_go_sum","gopls.upgrade_dependency","gopls.vendor","gopls.views","gopls.workspace_stats"]},"callHierarchyProvider":true,"semanticTokensProvider":{"legend":{"tokenTypes":[],"tokenModifiers":[]},"range":true,"full":true},"inlayHintProvider":{},"workspace":{"workspaceFolders":{"supported":true,"changeNotifications":"workspace/didChangeWorkspaceFolders"}}},"serverInfo":{"name":"gopls","version":"{\"GoVersion\":\"go1.22.2\",\"Path\":\"golang.org/x/tools/gopls\",\"Main\":{\"Path\":\"golang.org/x/tools/gopls\",\"Version\":\"v0.15.2\",\"Sum\":\"h1:4JKt4inO8JaFW3l/Fh9X1k/5JQn+iUOpdc4/Lpi0mOs=\",\"Replace\":null},\"Deps\":[{\"Path\":\"github.com/BurntSushi/toml\",\"Version\":\"v1.2.1\",\"Sum\":\"h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=\",\"Replace\":null},{\"Path\":\"github.com/google/go-cmp\",\"Version\":\"v0.6.0\",\"Sum\":\"h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\",\"Replace\":null},{\"Path\":\"golang.org/x/exp/typeparams\",\"Version\":\"v0.0.0-20221212164502-fae10dda9338\",\"Sum\":\"h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=\",\"Replace\":null},{\"Path\":\"golang.org/x/mod\",\"Version\":\"v0.15.0\",\"Sum\":\"h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=\",\"Replace\":null},{\"Path\":\"golang.org/x/sync\",\"Version\":\"v0.6.0\",\"Sum\":\"h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=\",\"Replace\":null},{\"Path\":\"golang.org/x/telemetry\",\"Version\":\"v0.0.0-20240209200032-7b892fcb8a78\",\"Sum\":\"h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4=\",\"Replace\":null},{\"Path\":\"golang.org/x/text\",\"Version\":\"v0.14.0\",\"Sum\":\"h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=\",\"Replace\":null},{\"Path\":\"golang.org/x/tools\",\"Version\":\"v0.18.1-0.20240311201521-78fbdeb61842\",\"Sum\":\"h1:No0LMXYFkp3j4oEsPdtY8LUQz33gu79Rm9DE+izMeGQ=\",\"Replace\":null},{\"Path\":\"golang.org/x/vuln\",\"Version\":\"v1.0.1\",\"Sum\":\"h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU=\",\"Replace\":null},{\"Path\":\"honnef.co/go/tools\",\"Version\":\"v0.4.6\",\"Sum\":\"h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8=\",\"Replace\":null},{\"Path\":\"mvdan.cc/gofumpt\",\"Version\":\"v0.6.0\",\"Sum\":\"h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=\",\"Replace\":null},{\"Path\":\"mvdan.cc/xurls/v2\",\"Version\":\"v2.5.0\",\"Sum\":\"h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=\",\"Replace\":null}],\"Settings\":[{\"Key\":\"-buildmode\",\"Value\":\"exe\"},{\"Key\":\"-compiler\",\"Value\":\"gc\"},{\"Key\":\"DefaultGODEBUG\",\"Value\":\"httplaxcontentlength=1,httpmuxgo121=1,panicnil=1,tls10server=1,tlsrsakex=1,tlsunsafeekm=1\"},{\"Key\":\"CGO_ENABLED\",\"Value\":\"1\"},{\"Key\":\"CGO_CFLAGS\",\"Value\":\"-I/opt/altair-libs -O0 -g\"},{\"Key\":\"CGO_CPPFLAGS\",\"Value\":\"\"},{\"Key\":\"CGO_CXXFLAGS\",\"Value\":\"\"},{\"Key\":\"CGO_LDFLAGS\",\"Value\":\"-L/opt/altair-libs -llmx-altair -laljdk\"},{\"Key\":\"GOARCH\",\"Value\":\"amd64\"},{\"Key\":\"GOOS\",\"Value\":\"linux\"},{\"Key\":\"GOAMD64\",\"Value\":\"v1\"}],\"Version\":\"v0.15.2\"}"}}
[Trace - 10:03:36.464 AM] Sending notification 'workspace/didChangeConfiguration'.
Params: {"settings":{}}
[Trace - 10:03:36.464 AM] Sending notification 'textDocument/didOpen'.
Params: {"textDocument":{"uri":"session1.golang","version":1,"languageId":"golang","text":"\n// You can edit this code!\n// Click here and start typing.\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n fmt.Println(\"Hello, 世界\")ssss\n}\n\n"}}
[Trace - 10:03:36.465 AM] Sending notification 'textDocument/didClose'.
Params: {"textDocument":{"uri":"session1.golang"}}
[Trace - 10:03:36.465 AM] Sending notification 'textDocument/didOpen'.
Params: {"textDocument":{"uri":"session1.golang","languageId":"golang","text":"\n// You can edit this code!\n// Click here and start typing.\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n fmt.Println(\"Hello, 世界\")ssss\n}\n\n"}}
{"jsonrpc":"2.0","result":{"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"completionProvider":{"triggerCharacters":["."]},"hoverProvider":true,"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"typeDefinitionProvider":true,"implementationProvider":true,"referencesProvider":true,"documentHighlightProvider":true,"documentSymbolProvider":true,"codeActionProvider":true,"codeLensProvider":{},"documentLinkProvider":{},"workspaceSymbolProvider":true,"documentFormattingProvider":true,"renameProvider":true,"foldingRangeProvider":true,"selectionRangeProvider":true,"executeCommandProvider":{"commands":["gopls.add_dependency","gopls.add_import","gopls.add_telemetry_counters","gopls.apply_fix","gopls.change_signature","gopls.check_upgrades","gopls.diagnose_files","gopls.edit_go_directive","gopls.fetch_vulncheck_result","gopls.gc_details","gopls.generate","gopls.go_get_package","gopls.list_imports","gopls.list_known_packages","gopls.maybe_prompt_for_telemetry","gopls.mem_stats","gopls.regenerate_cgo","gopls.remove_dependency","gopls.reset_go_mod_diagnostics","gopls.run_go_work_command","gopls.run_govulncheck","gopls.run_tests","gopls.start_debugging","gopls.start_profile","gopls.stop_profile","gopls.test","gopls.tidy","gopls.toggle_gc_details","gopls.update_go_sum","gopls.upgrade_dependency","gopls.vendor","gopls.views","gopls.workspace_stats"]},"callHierarchyProvider":true,"semanticTokensProvider":{"legend":{"tokenTypes":[],"tokenModifiers":[]},"range":true,"full":true},"inlayHintProvider":{},"workspace":{"workspaceFolders":{"supported":true,"changeNotifications":"workspace/didChangeWorkspaceFolders"}}},"serverInfo":{"name":"gopls","version":"{\"GoVersion\":\"go1.22.2\",\"Path\":\"golang.org/x/tools/gopls\",\"Main\":{\"Path\":\"golang.org/x/tools/gopls\",\"Version\":\"v0.15.2\",\"Sum\":\"h1:4JKt4inO8JaFW3l/Fh9X1k/5JQn+iUOpdc4/Lpi0mOs=\",\"Replace\":null},\"Deps\":[{\"Path\":\"github.com/BurntSushi/toml\",\"Version\":\"v1.2.1\",\"Sum\":\"h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=\",\"Replace\":null},{\"Path\":\"github.com/google/go-cmp\",\"Version\":\"v0.6.0\",\"Sum\":\"h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\",\"Replace\":null},{\"Path\":\"golang.org/x/exp/typeparams\",\"Version\":\"v0.0.0-20221212164502-fae10dda9338\",\"Sum\":\"h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=\",\"Replace\":null},{\"Path\":\"golang.org/x/mod\",\"Version\":\"v0.15.0\",\"Sum\":\"h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=\",\"Replace\":null},{\"Path\":\"golang.org/x/sync\",\"Version\":\"v0.6.0\",\"Sum\":\"h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=\",\"Replace\":null},{\"Path\":\"golang.org/x/telemetry\",\"Version\":\"v0.0.0-20240209200032-7b892fcb8a78\",\"Sum\":\"h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4=\",\"Replace\":null},{\"Path\":\"golang.org/x/text\",\"Version\":\"v0.14.0\",\"Sum\":\"h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=\",\"Replace\":null},{\"Path\":\"golang.org/x/tools\",\"Version\":\"v0.18.1-0.20240311201521-78fbdeb61842\",\"Sum\":\"h1:No0LMXYFkp3j4oEsPdtY8LUQz33gu79Rm9DE+izMeGQ=\",\"Replace\":null},{\"Path\":\"golang.org/x/vuln\",\"Version\":\"v1.0.1\",\"Sum\":\"h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU=\",\"Replace\":null},{\"Path\":\"honnef.co/go/tools\",\"Version\":\"v0.4.6\",\"Sum\":\"h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8=\",\"Replace\":null},{\"Path\":\"mvdan.cc/gofumpt\",\"Version\":\"v0.6.0\",\"Sum\":\"h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=\",\"Replace\":null},{\"Path\":\"mvdan.cc/xurls/v2\",\"Version\":\"v2.5.0\",\"Sum\":\"h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=\",\"Replace\":null}],\"Settings\":[{\"Key\":\"-buildmode\",\"Value\":\"exe\"},{\"Key\":\"-compiler\",\"Value\":\"gc\"},{\"Key\":\"DefaultGODEBUG\",\"Value\":\"httplaxcontentlength=1,httpmuxgo121=1,panicnil=1,tls10server=1,tlsrsakex=1,tlsunsafeekm=1\"},{\"Key\":\"CGO_ENABLED\",\"Value\":\"1\"},{\"Key\":\"CGO_CFLAGS\",\"Value\":\"-I/opt/altair-libs -O0 -g\"},{\"Key\":\"CGO_CPPFLAGS\",\"Value\":\"\"},{\"Key\":\"CGO_CXXFLAGS\",\"Value\":\"\"},{\"Key\":\"CGO_LDFLAGS\",\"Value\":\"-L/opt/altair-libs -llmx-altair -laljdk\"},{\"Key\":\"GOARCH\",\"Value\":\"amd64\"},{\"Key\":\"GOOS\",\"Value\":\"linux\"},{\"Key\":\"GOAMD64\",\"Value\":\"v1\"}],\"Version\":\"v0.15.2\"}"}},"id":0}
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 0,
_buffers: [],
_compressed: false,
_payloadLength: 52,
_mask: <Buffer 81 0c 0a 55>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","method":"initialized","params":{}}'
}
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 0,
_buffers: [],
_compressed: false,
_payloadLength: 86,
_mask: <Buffer d7 82 8c 0f>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{}}}'
}
JSON Server: [Trace - 10:03:36.580 AM] Sending notification 'initialized'.
Params: {}
JSON Server: [Trace - 10:03:36.581 AM] Sending notification 'workspace/didChangeConfiguration'.
Params: {"settings":{}}
MessageEvent {
[Symbol(kTarget)]: <ref *1> WebSocket {
_events: [Object: null prototype] {
close: [Array],
message: [Function],
error: [Function]
},
_eventsCount: 3,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: <Buffer >,
_closeTimer: null,
_extensions: {},
_paused: false,
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_events: [Object],
_writableState: [WritableState],
_maxListeners: undefined,
_allowSynchronousEvents: false,
_binaryType: 'nodebuffer',
_extensions: {},
_isServer: true,
_maxPayload: 104857600,
_skipUTF8Validation: false,
_bufferedBytes: 0,
_buffers: [],
_compressed: false,
_payloadLength: 155,
_mask: <Buffer 53 79 0e 4d>,
_fragmented: 0,
_masked: true,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_errored: false,
_loop: false,
_state: 6,
_eventsCount: 6,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: {},
_socket: [Socket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: null,
_closeAfterHandlingError: false,
_events: [Object],
_readableState: [ReadableState],
_writableState: [WritableState],
allowHalfOpen: true,
_maxListeners: undefined,
_eventsCount: 4,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: [Server],
_server: [Server],
parser: null,
on: [Function (anonymous)],
addListener: [Function (anonymous)],
prependListener: [Function: prependListener],
setEncoding: [Function: socketSetEncoding],
_paused: false,
timeout: 0,
[Symbol(async_id_symbol)]: 75,
[Symbol(kHandle)]: [TCP],
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false,
[Symbol(kSetNoDelay)]: true,
[Symbol(kSetKeepAlive)]: false,
[Symbol(kSetKeepAliveInitialDelay)]: 0,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(websocket)]: [Circular *1]
},
_autoPong: true,
_isServer: true,
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false
},
[Symbol(kType)]: 'message',
[Symbol(kData)]: '{"jsonrpc":"2.0","id":1,"method":"textDocument/documentHighlight","params":{"textDocument":{"uri":"session1.golang"},"position":{"line":8,"character":30}}}'
}
JSON Server: [Trace - 10:03:37.907 AM] Sending request 'textDocument/documentHighlight - (1)'.
Params: {"textDocument":{"uri":"session1.golang"},"position":{"line":8,"character":30}}
JSON Server: [Error - Received] 10:03:37.907 AM #1 JSON RPC parse error: DocumentURI scheme is not 'file': session1.golang
{"jsonrpc":"2.0","error":{"code":-32700,"message":"JSON RPC parse error: DocumentURI scheme is not 'file': session1.golang"},"id":1}
Specifications
- Versions:
- ace-code: v1.33.0
- ace-linters: v1.2.0
- vscode-ws-jsonrpc: v3.3.1,
- node.js: v20.12.2
- npm: v10.5.0
- gopls: v0.15.2
- Platform:
- OS: Kubuntu 23.10 - Kernel v6.5.0
Can be a misconfiguration or bad server connection establishment?
@Kortivex, right... My goplsws
repo was a bit outdated, so I've updated it now. Also, I have written a small guide for using gopls with ace-linters. It should work now, but I can't promise it will work perfectly, especially since I don't have a good configuration for the Go server. In the future, I plan to provide a way to set normal paths for documents in linters itself, so it will work with any WebSocket server/bridge.
Thanks so much for your help, I will wait impatiently for the way to set normal paths for documents in linters.