public JavaClientConnection getClientConnection() { if (protocol != null) { return protocol.getClientConnection(); } return null; }
@Override public CompletableFuture<List<Either<Command, CodeAction>>> codeAction(CodeActionParams params) { logInfo(">> document/codeAction"); CodeActionHandler handler = new CodeActionHandler(this.preferenceManager); return computeAsync((monitor) -> { waitForLifecycleJobs(monitor); return handler.getCodeActionCommands(params, monitor); }); }
public WorkingCopyOwner getWorkingCopyOwner() { return this.protocol.getWorkingCopyOwner(); }
JobHelpers.waitForInitializeJobs(); if (preferenceManager.getClientPreferences().isCompletionDynamicRegistered()) { registerCapability(Preferences.COMPLETION_ID, Preferences.COMPLETION, CompletionHandler.DEFAULT_COMPLETION_OPTIONS); registerCapability(Preferences.WORKSPACE_SYMBOL_ID, Preferences.WORKSPACE_SYMBOL); registerCapability(Preferences.DOCUMENT_SYMBOL_ID, Preferences.DOCUMENT_SYMBOL); registerCapability(Preferences.CODE_ACTION_ID, Preferences.CODE_ACTION, getCodeActionOptions()); registerCapability(Preferences.DEFINITION_ID, Preferences.DEFINITION); registerCapability(Preferences.TYPEDEFINITION_ID, Preferences.TYPEDEFINITION); registerCapability(Preferences.HOVER_ID, Preferences.HOVER); registerCapability(Preferences.REFERENCES_ID, Preferences.REFERENCES); registerCapability(Preferences.DOCUMENT_HIGHLIGHT_ID, Preferences.DOCUMENT_HIGHLIGHT); registerCapability(Preferences.WORKSPACE_CHANGE_FOLDERS_ID, Preferences.WORKSPACE_CHANGE_FOLDERS); registerCapability(Preferences.IMPLEMENTATION_ID, Preferences.IMPLEMENTATION); syncCapabilitiesToSettings(); computeAsync((monitor) -> { try { workspaceDiagnosticsHandler.publishDiagnostics(monitor);
@Override public CompletableFuture<BuildWorkspaceStatus> buildWorkspace(boolean forceReBuild) { logInfo(">> java/buildWorkspace (" + (forceReBuild ? "full)" : "incremental)")); BuildWorkspaceHandler handler = new BuildWorkspaceHandler(client, pm); return computeAsync((monitor) -> handler.buildWorkspace(forceReBuild, monitor)); }
preferenceManager.getPreferences().setRootPaths(rootPaths); syncCapabilitiesToSettings(); boolean jvmChanged = false; try { jvmChanged = configureVM(); } catch (Exception e) { JavaLanguageServerPlugin.logException(e.getMessage(), e); boolean autoBuildChanged = pm.setAutoBuilding(preferenceManager.getPreferences().isAutobuildEnabled()); if (jvmChanged) { buildWorkspace(true); } else if (autoBuildChanged) { buildWorkspace(false);
toggleCapability(preferenceManager.getPreferences().isCompletionEnabled(), Preferences.COMPLETION_ID, Preferences.COMPLETION, CompletionHandler.DEFAULT_COMPLETION_OPTIONS); toggleCapability(preferenceManager.getPreferences().isJavaFormatEnabled(), Preferences.FORMATTING_ID, Preferences.TEXT_DOCUMENT_FORMATTING, null); toggleCapability(preferenceManager.getPreferences().isJavaFormatEnabled(), Preferences.FORMATTING_RANGE_ID, Preferences.TEXT_DOCUMENT_RANGE_FORMATTING, null); toggleCapability(preferenceManager.getPreferences().isJavaFormatOnTypeEnabled(), Preferences.FORMATTING_ON_TYPE_ID, Preferences.TEXT_DOCUMENT_ON_TYPE_FORMATTING, new DocumentOnTypeFormattingOptions(";", Arrays.asList("\n", "}"))); toggleCapability(preferenceManager.getPreferences().isCodeLensEnabled(), Preferences.CODE_LENS_ID, Preferences.TEXT_DOCUMENT_CODE_LENS, new CodeLensOptions(true)); toggleCapability(preferenceManager.getPreferences().isSignatureHelpEnabled(), Preferences.SIGNATURE_HELP_ID, Preferences.TEXT_DOCUMENT_SIGNATURE_HELP, SignatureHelpHandler.createOptions()); toggleCapability(preferenceManager.getPreferences().isRenameEnabled(), Preferences.RENAME_ID, Preferences.TEXT_DOCUMENT_RENAME, RenameHandler.createOptions()); toggleCapability(preferenceManager.getPreferences().isExecuteCommandEnabled(), Preferences.EXECUTE_COMMAND_ID, Preferences.WORKSPACE_EXECUTE_COMMAND, new ExecuteCommandOptions(new ArrayList<>(WorkspaceExecuteCommandHandler.getCommands()))); toggleCapability(preferenceManager.getClientPreferences().isCodeActionDynamicRegistered(), Preferences.CODE_ACTION_ID, Preferences.CODE_ACTION, getCodeActionOptions());
private void startConnection() throws IOException { Launcher<JavaLanguageClient> launcher; ExecutorService executorService = Executors.newCachedThreadPool(); protocol = new JDTLanguageServer(projectsManager, preferenceManager); if (JDTEnvironmentUtils.inSocketStreamDebugMode()) { String host = JDTEnvironmentUtils.getClientHost(); Integer port = JDTEnvironmentUtils.getClientPort(); InetSocketAddress inetSocketAddress = new InetSocketAddress(host, port); AsynchronousServerSocketChannel serverSocket = AsynchronousServerSocketChannel.open().bind(inetSocketAddress); try { AsynchronousSocketChannel socketChannel = serverSocket.accept().get(); InputStream in = Channels.newInputStream(socketChannel); OutputStream out = Channels.newOutputStream(socketChannel); Function<MessageConsumer, MessageConsumer> messageConsumer = it -> it; launcher = Launcher.createIoLauncher(protocol, JavaLanguageClient.class, in, out, executorService, messageConsumer); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException("Error when opening a socket channel at " + host + ":" + port + ".", e); } } else { ConnectionStreamFactory connectionFactory = new ConnectionStreamFactory(); InputStream in = connectionFactory.getInputStream(); OutputStream out = connectionFactory.getOutputStream(); Function<MessageConsumer, MessageConsumer> wrapper = new ParentProcessWatcher(this.languageServer); launcher = Launcher.createLauncher(protocol, JavaLanguageClient.class, in, out, executorService, wrapper); } protocol.connectClient(launcher.getRemoteProxy()); launcher.startListening(); }
@Override public CompletableFuture<List<? extends Location>> implementation(TextDocumentPositionParams position) { logInfo(">> document/implementation"); return computeAsyncWithClientProgress((monitor) -> new ImplementationsHandler(preferenceManager).findImplementations(position, monitor)); }
public boolean configureVM() throws CoreException { String javaHome = preferenceManager.getPreferences().getJavaHome(); if (javaHome != null) { File jvmHome = new File(javaHome); if (jvmHome.isDirectory()) { IVMInstall defaultVM = JavaRuntime.getDefaultVMInstall(); File location = defaultVM.getInstallLocation(); if (!location.equals(jvmHome)) { IVMInstall vm = findVM(jvmHome); if (vm == null) { IVMInstallType installType = JavaRuntime.getVMInstallType(StandardVMType.ID_STANDARD_VM_TYPE); long unique = System.currentTimeMillis(); while (installType.findVMInstall(String.valueOf(unique)) != null) { unique++; } String vmId = String.valueOf(unique); VMStandin vmStandin = new VMStandin(installType, vmId); String name = StringUtils.defaultIfBlank(jvmHome.getName(), "JRE"); vmStandin.setName(name); vmStandin.setInstallLocation(jvmHome); vm = vmStandin.convertToRealVM(); } JavaRuntime.setDefaultVMInstall(vm, new NullProgressMonitor()); JDTUtils.setCompatibleVMs(vm.getId()); return true; } } } return false; }
@Override public CompletableFuture<List<? extends Location>> references(ReferenceParams params) { logInfo(">> document/references"); ReferencesHandler handler = new ReferencesHandler(this.preferenceManager); return computeAsync((monitor) -> handler.findReferences(params, monitor)); }
@Override public CompletableFuture<List<? extends Location>> typeDefinition(TextDocumentPositionParams position) { logInfo(">> document/typeDefinition"); NavigateToTypeDefinitionHandler handler = new NavigateToTypeDefinitionHandler(); return computeAsync((monitor) -> { waitForLifecycleJobs(monitor); return handler.typeDefinition(position, monitor); }); }
@Override public CompletableFuture<List<? extends TextEdit>> rangeFormatting(DocumentRangeFormattingParams params) { logInfo(">> document/rangeFormatting"); FormatterHandler handler = new FormatterHandler(preferenceManager); return computeAsync((monitor) -> handler.rangeFormatting(params, monitor)); }
@Override public void elementChanged(ElementChangedEvent event) { final Set<IProject> projects = getAffectedProjects(event.getDelta(), new HashSet<IProject>()); if (projects.isEmpty()) { return; } try { final Set<String> projectLocations = new HashSet<String>(); for (final IProject project : projects) { projectLocations.add(ResourceUtils.fixURI(project.getLocationURI())); } final JDTLanguageServer ls = JavaLanguageServerPlugin.getInstance().getProtocol(); ls.getClientConnection().sendNotification(CLIENT_UPDATE_CLASSPATH, (Object[]) projectLocations.toArray(new String[projectLocations.size()])); } catch (final Exception e) { // Ignore. JavaLanguageServerPlugin.logException("An exception occured while reporting project CLASSPATH change", e); } }
@Override public CompletableFuture<CodeLens> resolveCodeLens(CodeLens unresolved) { logInfo(">> codeLens/resolve"); CodeLensHandler handler = new CodeLensHandler(preferenceManager); return computeAsync((monitor) -> { waitForLifecycleJobs(monitor); return handler.resolve(unresolved, monitor); }); }
@Override public CompletableFuture<List<? extends TextEdit>> onTypeFormatting(DocumentOnTypeFormattingParams params) { logInfo(">> document/onTypeFormatting"); FormatterHandler handler = new FormatterHandler(preferenceManager); return computeAsync((monitor) -> handler.onTypeFormatting(params, monitor)); }
@Override public CompletableFuture<List<? extends Location>> definition(TextDocumentPositionParams position) { logInfo(">> document/definition"); NavigateToDefinitionHandler handler = new NavigateToDefinitionHandler(this.preferenceManager); return computeAsync((monitor) -> { waitForLifecycleJobs(monitor); return handler.definition(position, monitor); }); }
@Override public CompletableFuture<Either<Range, PrepareRenameResult>> prepareRename(TextDocumentPositionParams params) { logInfo(">> document/prepareRename"); PrepareRenameHandler handler = new PrepareRenameHandler(); return computeAsync((monitor) -> handler.prepareRename(params, monitor)); }
@Override public CompletableFuture<Either<List<CompletionItem>, CompletionList>> completion(CompletionParams position) { logInfo(">> document/completion"); CompletionHandler handler = new CompletionHandler(); final IProgressMonitor[] monitors = new IProgressMonitor[1]; CompletableFuture<Either<List<CompletionItem>, CompletionList>> result = computeAsync((monitor) -> { monitors[0] = monitor; if (Boolean.getBoolean(JAVA_LSP_JOIN_ON_COMPLETION)) { waitForLifecycleJobs(monitor); } return handler.completion(position, monitor); }); result.join(); if (monitors[0].isCanceled()) { result.cancel(true); } return result; }
@Override public CompletableFuture<SignatureHelp> signatureHelp(TextDocumentPositionParams position) { logInfo(">> document/signatureHelp"); SignatureHelpHandler handler = new SignatureHelpHandler(preferenceManager); return computeAsync((monitor) -> handler.signatureHelp(position, monitor)); }