subham009
subham009

Reputation: 37

How to implement LSP client in Java using LSP4J

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

Answers (0)

Related Questions