I'm using a fork of tower-lsp for building my language server: GitHub - realhydroper/rustlsp: Language Server Protocol implementation written in Rust I have only made it local-threaded and changed the crate's name..
But it seems like something isn't going well, and I believe the issue is within my Visual Studio Code extension:
// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import path from 'path';
import * as vscode from 'vscode';
// Language client
import * as vscodelc from "vscode-languageclient/node";
const whackHome = process.env.WHACK_HOME;
// This method is called when your extension is activated
// Your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {
// Use the console to output diagnostic information (console.log) and errors (console.error)
// This line of code will only be executed once when your extension is activated
console.log('Congratulations, your extension "whack-engine" is now active!');
if (whackHome === undefined)
{
vscode.window.showErrorMessage("Environment variable WHACK_HOME must be set.");
}
// The command has been defined in the package.json file
// Now provide the implementation of the command with registerCommand
// The commandId parameter must match the command field in package.json
const disposable = vscode.commands.registerCommand('whack-engine.helloWorld', () => {
// The code you place here will be executed every time your command is executed
// Display a message box to the user
vscode.window.showInformationMessage('Hello World from Whack engine support!');
});
context.subscriptions.push(disposable);
// Setup language server
if (whackHome)
{
const underWindows = process.platform == "win32";
const server: vscodelc.Executable = {
command: path.resolve(whackHome, "bin/whacklangserver" + (underWindows ? ".exe" : "")),
args: [],
options: {},
};
const serverOptions: vscodelc.ServerOptions = server;
let clientOptions: vscodelc.LanguageClientOptions = {
// Register the server for AS3/MXML/CSS
documentSelector: [
{ scheme: "file", language: "as3" },
{ scheme: "file", language: "mxml" },
{ scheme: "file", language: "css" }
]
};
const client = new vscodelc.LanguageClient("ActionScript 3 & MXML language server", serverOptions, clientOptions);
client.start();
}
}
// This method is called when your extension is deactivated
export function deactivate() {}
Here are pieces of my language server in Rust:
#[realhydroper_lsp::async_trait(?Send)]
impl LanguageServer for Backend {
async fn initialize(&self, _: InitializeParams) -> Result<InitializeResult> {
Ok(InitializeResult {
capabilities: ServerCapabilities {
position_encoding: Some(PositionEncodingKind::UTF8),
hover_provider: Some(HoverProviderCapability::Simple(true)),
definition_provider: Some(OneOf::Left(true)),
..ServerCapabilities::default()
},
server_info: None,
..default()
})
}
async fn initialized(&self, _: InitializedParams) {
self.client
.log_message(MessageType::INFO, "server initialized!")
.await;
self.client
.register_capability(vec![
Registration {
id: "whack-watch".to_owned(),
method: "workspace/didChangeWatchedFiles".to_owned(),
register_options: Some(serde_json::json! ({
"watches": [
{ "globPattern": "**/*.{as,mxml,css}" },
{ "globPattern": "**/whack.toml" }
]
})),
}
]).await.unwrap();
}
// [ ... ]
}
#[tokio::main]
async fn main() {
let stdin = tokio::io::stdin();
let stdout = tokio::io::stdout();
let (service, socket) = LspService::new(|client| Backend {
client,
compiler_results: RefCell::new(vec![]),
opened_file_content: Rc::new(RefCell::new(hashmap! {})),
change_delay: Rc::new(RefCell::new(hashmap! {})),
});
Server::new(stdin, stdout, socket).serve(service).await;
}
Here's the log when running my Visual Studio Code extension:
Congratulations, your extension "whack-engine" is now active!
extensionHostProcess.js:178
rejected promise not handled within 1 second: Error: Client is not running and can't be stopped. It's current state is: starting
extensionHostProcess.js:178
stack trace: Error: Client is not running and can't be stopped. It's current state is: starting
at LanguageClient.shutdown (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:964:19)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:935:21)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\node\main.js:150:22)
at LanguageClient.doInitialize (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:917:27)
at async LanguageClient.start (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:772:13)
extensionHostProcess.js:178
rejected promise not handled within 1 second: Error: Unsupported position encoding (utf-8) received from server ActionScript 3 & MXML language server
extensionHostProcess.js:178
stack trace: Error: Unsupported position encoding (utf-8) received from server ActionScript 3 & MXML language server
at LanguageClient.doInitialize (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:836:23)
at async LanguageClient.start (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:772:13)
extensionHostProcess.js:178
rejected promise not handled within 1 second: Error: Client is not running and can't be stopped. It's current state is: starting
extensionHostProcess.js:178
stack trace: Error: Client is not running and can't be stopped. It's current state is: starting
at LanguageClient.shutdown (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:964:19)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:935:21)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\node\main.js:150:22)
at LanguageClient.doInitialize (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:917:27)
at async LanguageClient.start (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:772:13)
extensionHostProcess.js:178
rejected promise not handled within 1 second: Error: Client is not running and can't be stopped. It's current state is: starting
extensionHostProcess.js:178
stack trace: Error: Client is not running and can't be stopped. It's current state is: starting
at LanguageClient.shutdown (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:964:19)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:935:21)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\node\main.js:150:22)
at LanguageClient.doInitialize (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:917:27)
at async LanguageClient.start (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:772:13)
extensionHostProcess.js:178
rejected promise not handled within 1 second: Error: Client is not running and can't be stopped. It's current state is: starting
extensionHostProcess.js:178
stack trace: Error: Client is not running and can't be stopped. It's current state is: starting
at LanguageClient.shutdown (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:964:19)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:935:21)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\node\main.js:150:22)
at LanguageClient.doInitialize (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:917:27)
at async LanguageClient.start (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:772:13)
extensionHostProcess.js:178
rejected promise not handled within 1 second: Error: Client is not running and can't be stopped. It's current state is: starting
extensionHostProcess.js:178
stack trace: Error: Client is not running and can't be stopped. It's current state is: starting
at LanguageClient.shutdown (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:964:19)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:935:21)
at LanguageClient.stop (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\node\main.js:150:22)
at LanguageClient.doInitialize (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:917:27)
at async LanguageClient.start (c:\Users\Hydro\Repository Groups\Whack\vscode-extension\node_modules\vscode-languageclient\lib\common\client.js:772:13)