Reputation: 37
I want to make a language client which could get diagnostic, code completion and documentation on hover. I'm using LSP4J but its not well documented for client part ; I tried a code generated by chatGPT but its not working at all.
Here is the code I tried to get diagnose a typescript code using tsserver
but it didnt print anything at all
public class client {
public static void start() {
// Start the typescript-language-server as a subprocess
ProcessBuilder processBuilder = new ProcessBuilder("typescript-language-server.cmd", "--stdio","--log-level=4" );
processBuilder.redirectErrorStream(true);
Process serverProcess = null;
try {
serverProcess = processBuilder.start();
System.out.println("Server started");
} catch (IOException exception) {
System.err.println("Failed to create process :" + exception);
System.exit(1);
}
// Obtain InputStream and OutputStream from the server process
InputStream serverInput = serverProcess.getInputStream();
OutputStream serverOutput = serverProcess.getOutputStream();
LanguageClientImpl languageClient = new LanguageClientImpl();
// a launcher for the LSP client
Launcher<LanguageServer> launcher = Launcher.createLauncher(languageClient, LanguageServer.class,serverInput,serverOutput);
LanguageServer server = launcher.getRemoteProxy();
launcher.startListening();
InitializeParams params = new InitializeParams();
List<WorkspaceFolder> folders = new ArrayList<>();
folders.add(new WorkspaceFolder("file:///E:/languaug_server/LSP4jClient/app/src/main","resources"));
params.setWorkspaceFolders(folders);
params.setCapabilities(new ClientCapabilities());
CompletableFuture<InitializeResult> initialized = server.initialize(params);
try{
initialized.get();
// System.out.println("params initialized wait passed");
// Open the document
String fileUri = Paths.get("E:/languaug_server/LSP4jClient/app/src/main/resources/sample.ts").toAbsolutePath().toUri().toString();
DidOpenTextDocumentParams openParams = new DidOpenTextDocumentParams();
TextDocumentItem textDocumentItem = new TextDocumentItem(fileUri, "typescript", 1, "const num1 = 10;\n" +
"const num2 = 5;\n" +
"\n" +
"console.log(`${num1} + ${num2} = ${calculator.add(num1, num2)}`);\n" +
"console.log(`${num1} - ${num2} = ${calculator.subtract(num1, num2)}`);\n" +
"console.log(`${num1} * ${num2} = ${calculator.multiply(num1, num2)}`);\n" +
"console.log(`${num1} / ${num2} = ${calculator.divide(num1, num2)}`);");
openParams.setTextDocument(textDocumentItem);
server.getTextDocumentService().didOpen(openParams);
// Request diagnostics
CompletableFuture<List<Diagnostic>> diagnosticsFuture = new CompletableFuture<>();
languageClient.setDiagnosticsConsumer(diagnostics -> {
System.out.println("Received diagnostics: " + diagnostics);
diagnosticsFuture.complete(diagnostics);
});
// Wait for diagnostics
List<Diagnostic> diagnostics = diagnosticsFuture.get();
System.out.println("program passed diagnostics");
// Print diagnostics
System.out.println("Diagnostics for " + fileUri + ":");
for (Diagnostic diagnostic : diagnostics) {
System.out.println(diagnostic.getSeverity() + ": " + diagnostic.getMessage() + " at " + diagnostic.getRange());
}
}catch (Exception e){
System.out.println("Linting error :" + e.toString());
}
serverProcess.destroy();
}// end of start
private static class LanguageClientImpl implements LanguageClient, LanguageClientAware {
private Consumer<List<Diagnostic>> diagnosticsConsumer;
public void setDiagnosticsConsumer(Consumer<List<Diagnostic>> consumer) {
this.diagnosticsConsumer = consumer;
}
@Override
public void publishDiagnostics(PublishDiagnosticsParams diagnostics) {
System.out.println("Diagnostics received: " + diagnostics.getDiagnostics().size() + " diagnostics");
if (diagnosticsConsumer != null) {
diagnosticsConsumer.accept(diagnostics.getDiagnostics());
}
}
@Override
public void telemetryEvent(Object object) {
System.out.println("telemetry called:"+object.toString());
}
@Override
public void showMessage(MessageParams messageParams) {
System.out.println("Message received: " + messageParams.getMessage());
}
@Override
public void logMessage(MessageParams messageParams) {
System.out.println("Log received: " + messageParams.getMessage());
}
@Override
public CompletableFuture<MessageActionItem> showMessageRequest(ShowMessageRequestParams requestParams) {
System.out.println("showMessageRequest called:"+requestParams.getMessage());
// throw new UnsupportedOperationException("Unimplemented method 'showMessageRequest'");
return null;
}
@Override
public void connect(LanguageClient client) {
System.out.println("connect called");
}
}
}
Please help me any resources or any help will be appreciated.
Upvotes: 0
Views: 114