diff --git a/src/main/java/com/redhat/devtools/lsp4ij/LanguageServerWrapper.java b/src/main/java/com/redhat/devtools/lsp4ij/LanguageServerWrapper.java index e4931f236..f175359ff 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/LanguageServerWrapper.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/LanguageServerWrapper.java @@ -297,6 +297,7 @@ public synchronized void start() throws LanguageServerException { .thenAccept(res -> { serverError = null; serverCapabilities = res.getCapabilities(); + getClientFeatures().setServerCapabilities(serverCapabilities); this.initiallySupportsWorkspaceFolders = supportsWorkspaceFolders(serverCapabilities); }).thenRun(() -> this.languageServer.initialized(new InitializedParams())).thenRun(() -> { initializeFuture.thenRunAsync(() -> { @@ -311,7 +312,6 @@ public synchronized void start() throws LanguageServerException { fileOperationsManager = new FileOperationsManager(this); fileOperationsManager.setServerCapabilities(serverCapabilities); - getClientFeatures().setServerCapabilities(serverCapabilities); updateStatus(ServerStatus.started); getLanguageServerLifecycleManager().onStatusChanged(this); diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPClientFeatures.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPClientFeatures.java index 7a5e97f92..3b25333a8 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPClientFeatures.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPClientFeatures.java @@ -155,11 +155,18 @@ public boolean canStopServerByUser() { @NotNull public final LSPCodeActionFeature getCodeActionFeature() { if (codeActionFeature == null) { - setCodeActionFeature(new LSPCodeActionFeature()); + initCodeActionFeature(); } return codeActionFeature; } + private synchronized void initCodeActionFeature() { + if(codeActionFeature != null) { + return; + } + setCodeActionFeature(new LSPCodeActionFeature()); + } + /** * Initialize the LSP codeAction feature. * @@ -180,11 +187,18 @@ public final LSPClientFeatures setCodeActionFeature(@NotNull LSPCodeActionFeatur @NotNull public final LSPCodeLensFeature getCodeLensFeature() { if (codeLensFeature == null) { - setCodeLensFeature(new LSPCodeLensFeature()); + initCodeLensFeature(); } return codeLensFeature; } + private synchronized void initCodeLensFeature() { + if(codeLensFeature != null) { + return; + } + setCodeLensFeature(new LSPCodeLensFeature()); + } + /** * Initialize the LSP codeLens feature. * @@ -205,11 +219,18 @@ public final LSPClientFeatures setCodeLensFeature(@NotNull LSPCodeLensFeature co @NotNull public final LSPDocumentColorFeature getDocumentColorFeature() { if (documentColorFeature == null) { - setDocumentColorFeature(new LSPDocumentColorFeature()); + initDocumentColorFeature(); } return documentColorFeature; } + private synchronized void initDocumentColorFeature() { + if(documentColorFeature != null) { + return; + } + setDocumentColorFeature(new LSPDocumentColorFeature()); + } + /** * Initialize the LSP color feature. * @@ -230,11 +251,18 @@ public final LSPClientFeatures setDocumentColorFeature(@NotNull LSPDocumentColor @NotNull public final LSPCompletionFeature getCompletionFeature() { if (completionFeature == null) { - setCompletionFeature(new LSPCompletionFeature()); + initCompletionFeature(); } return completionFeature; } + private synchronized void initCompletionFeature() { + if(completionFeature != null) { + return; + } + setCompletionFeature(new LSPCompletionFeature()); + } + /** * Initialize the LSP completion feature. * @@ -255,11 +283,18 @@ public final LSPClientFeatures setCompletionFeature(@NotNull LSPCompletionFeatur @NotNull public final LSPDeclarationFeature getDeclarationFeature() { if (declarationFeature == null) { - setDeclarationFeature(new LSPDeclarationFeature()); + initDeclarationFeature(); } return declarationFeature; } + private synchronized void initDeclarationFeature() { + if(declarationFeature != null) { + return; + } + setDeclarationFeature(new LSPDeclarationFeature()); + } + /** * Initialize the LSP declaration feature. * @@ -280,11 +315,18 @@ public final LSPClientFeatures setDeclarationFeature(@NotNull LSPDeclarationFeat @NotNull public final LSPDefinitionFeature getDefinitionFeature() { if (definitionFeature == null) { - setDefinitionFeature(new LSPDefinitionFeature()); + initDefinitionFeature(); } return definitionFeature; } + private synchronized void initDefinitionFeature() { + if(definitionFeature != null) { + return; + } + setDefinitionFeature(new LSPDefinitionFeature()); + } + /** * Initialize the LSP definition feature. * @@ -305,11 +347,18 @@ public final LSPClientFeatures setDefinitionFeature(@NotNull LSPDefinitionFeatur @NotNull public final LSPDocumentHighlightFeature getDocumentHighlightFeature() { if (documentHighlightFeature == null) { - setDocumentHighlightFeature(new LSPDocumentHighlightFeature()); + initDocumentHighlightFeature(); } return documentHighlightFeature; } + private synchronized void initDocumentHighlightFeature() { + if(documentHighlightFeature != null) { + return; + } + setDocumentHighlightFeature(new LSPDocumentHighlightFeature()); + } + /** * Initialize the LSP documentHighlight feature. * @@ -330,11 +379,18 @@ public final LSPClientFeatures setDocumentHighlightFeature(@NotNull LSPDocumentH @NotNull public final LSPDocumentLinkFeature getDocumentLinkFeature() { if (documentLinkFeature == null) { - setDocumentLinkFeature(new LSPDocumentLinkFeature()); + initDocumentLinkFeature(); } return documentLinkFeature; } + private synchronized void initDocumentLinkFeature() { + if(documentLinkFeature != null) { + return; + } + setDocumentLinkFeature(new LSPDocumentLinkFeature()); + } + /** * Initialize the LSP documentLink feature. * @@ -355,11 +411,18 @@ public final LSPClientFeatures setDocumentLinkFeature(@NotNull LSPDocumentLinkFe @NotNull public final LSPDocumentSymbolFeature getDocumentSymbolFeature() { if (documentSymbolFeature == null) { - setDocumentSymbolFeature(new LSPDocumentSymbolFeature()); + initDocumentSymbolFeature(); } return documentSymbolFeature; } + private synchronized void initDocumentSymbolFeature() { + if(documentSymbolFeature != null) { + return; + } + setDocumentSymbolFeature(new LSPDocumentSymbolFeature()); + } + /** * Initialize the LSP documentSymbol feature. * @@ -380,11 +443,18 @@ public final LSPClientFeatures setDocumentSymbolFeature(@NotNull LSPDocumentSymb @NotNull public final LSPDiagnosticFeature getDiagnosticFeature() { if (diagnosticFeature == null) { - setDiagnosticFeature(new LSPDiagnosticFeature()); + initDiagnosticFeature(); } return diagnosticFeature; } + private synchronized void initDiagnosticFeature() { + if(diagnosticFeature != null) { + return; + } + setDiagnosticFeature(new LSPDiagnosticFeature()); + } + /** * Initialize the LSP diagnostic feature. * @@ -405,11 +475,18 @@ public LSPClientFeatures setDiagnosticFeature(@NotNull LSPDiagnosticFeature diag @NotNull public final LSPFoldingRangeFeature getFoldingRangeFeature() { if (foldingRangeFeature == null) { - setFoldingRangeFeature(new LSPFoldingRangeFeature()); + initFoldingRangeFeature(); } return foldingRangeFeature; } + private synchronized void initFoldingRangeFeature() { + if(foldingRangeFeature != null) { + return; + } + setFoldingRangeFeature(new LSPFoldingRangeFeature()); + } + /** * Initialize the LSP foldingRange feature. * @@ -430,11 +507,17 @@ public final LSPClientFeatures setFoldingRangeFeature(@NotNull LSPFoldingRangeFe @NotNull public final LSPFormattingFeature getFormattingFeature() { if (formattingFeature == null) { - setFormattingFeature(new LSPFormattingFeature()); + initFormattingFeature(); } return formattingFeature; } + private synchronized void initFormattingFeature() { + if(formattingFeature != null) { + return; + } + setFormattingFeature(new LSPFormattingFeature()); + } /** * Initialize the LSP formatting feature. * @@ -455,11 +538,18 @@ public final LSPClientFeatures setFormattingFeature(@NotNull LSPFormattingFeatur @NotNull public final LSPImplementationFeature getImplementationFeature() { if (implementationFeature == null) { - setImplementationFeature(new LSPImplementationFeature()); + initImplementationFeature(); } return implementationFeature; } + private synchronized void initImplementationFeature() { + if(implementationFeature != null) { + return; + } + setImplementationFeature(new LSPImplementationFeature()); + } + /** * Initialize the LSP implementation feature. * @@ -480,11 +570,18 @@ public final LSPClientFeatures setImplementationFeature(@NotNull LSPImplementati @NotNull public final LSPInlayHintFeature getInlayHintFeature() { if (inlayHintFeature == null) { - setInlayHintFeature(new LSPInlayHintFeature()); + initInlayHintFeature(); } return inlayHintFeature; } + private synchronized void initInlayHintFeature() { + if(inlayHintFeature != null) { + return; + } + setInlayHintFeature(new LSPInlayHintFeature()); + } + /** * Initialize the LSP inlayHint feature. * @@ -505,11 +602,18 @@ public final LSPClientFeatures setInlayHintFeature(@NotNull LSPInlayHintFeature @NotNull public final LSPHoverFeature getHoverFeature() { if (hoverFeature == null) { - setHoverFeature(new LSPHoverFeature()); + initHoverFeature(); } return hoverFeature; } + private synchronized void initHoverFeature() { + if(hoverFeature != null) { + return; + } + setHoverFeature(new LSPHoverFeature()); + } + /** * Initialize the LSP hover feature. * @@ -530,11 +634,18 @@ public final LSPClientFeatures setHoverFeature(@NotNull LSPHoverFeature hoverFea @NotNull public final LSPReferencesFeature getReferencesFeature() { if (referencesFeature == null) { - setReferencesFeature(new LSPReferencesFeature()); + initReferencesFeature(); } return referencesFeature; } + private synchronized void initReferencesFeature() { + if(referencesFeature != null) { + return; + } + setReferencesFeature(new LSPReferencesFeature()); + } + /** * Initialize the LSP references feature. * @@ -555,11 +666,18 @@ public final LSPClientFeatures setReferencesFeature(@NotNull LSPReferencesFeatur @NotNull public final LSPRenameFeature getRenameFeature() { if (renameFeature == null) { - setRenameFeature(new LSPRenameFeature()); + initRenameFeature(); } return renameFeature; } + private synchronized void initRenameFeature() { + if(renameFeature != null) { + return; + } + setRenameFeature(new LSPRenameFeature()); + } + /** * Initialize the LSP rename feature. * @@ -580,11 +698,18 @@ public final LSPClientFeatures setRenameFeature(@NotNull LSPRenameFeature rename @NotNull public final LSPSemanticTokensFeature getSemanticTokensFeature() { if (semanticTokensFeature == null) { - setSemanticTokensFeature(new LSPSemanticTokensFeature()); + initSemanticTokensFeature(); } return semanticTokensFeature; } + private synchronized void initSemanticTokensFeature() { + if(semanticTokensFeature != null) { + return; + } + setSemanticTokensFeature(new LSPSemanticTokensFeature()); + } + /** * Initialize the LSP semanticTokens feature. * @@ -605,11 +730,18 @@ public final LSPClientFeatures setSemanticTokensFeature(@NotNull LSPSemanticToke @NotNull public final LSPSignatureHelpFeature getSignatureHelpFeature() { if (signatureHelpFeature == null) { - setSignatureHelpFeature(new LSPSignatureHelpFeature()); + initSignatureHelpFeature(); } return signatureHelpFeature; } + private synchronized void initSignatureHelpFeature() { + if(signatureHelpFeature != null) { + return; + } + setSignatureHelpFeature(new LSPSignatureHelpFeature()); + } + /** * Initialize the LSP signatureHelp feature. * @@ -630,11 +762,18 @@ public final LSPClientFeatures setSignatureHelpFeature(@NotNull LSPSignatureHelp @NotNull public final LSPTypeDefinitionFeature getTypeDefinitionFeature() { if (typeDefinitionFeature == null) { - setTypeDefinitionFeature(new LSPTypeDefinitionFeature()); + initTypeDefinitionFeature(); } return typeDefinitionFeature; } + private synchronized void initTypeDefinitionFeature() { + if(typeDefinitionFeature != null) { + return; + } + setTypeDefinitionFeature(new LSPTypeDefinitionFeature()); + } + /** * Initialize the LSP typeDefinition feature. * @@ -655,11 +794,18 @@ public final LSPClientFeatures setTypeDefinitionFeature(@NotNull LSPTypeDefiniti @NotNull public final LSPUsageFeature getUsageFeature() { if (usageFeature == null) { - setUsageFeature(new LSPUsageFeature()); + initUsageFeature(); } return usageFeature; } + private synchronized void initUsageFeature() { + if(usageFeature != null) { + return; + } + setUsageFeature(new LSPUsageFeature()); + } + /** * Initialize the LSP usage feature. * @@ -680,11 +826,18 @@ public final LSPClientFeatures setUsageFeature(@NotNull LSPUsageFeature usageFea @NotNull public final LSPWorkspaceSymbolFeature getWorkspaceSymbolFeature() { if (workspaceSymbolFeature == null) { - setWorkspaceSymbolFeature(new LSPWorkspaceSymbolFeature()); + initWorkspaceSymbolFeature(); } return workspaceSymbolFeature; } + private synchronized void initWorkspaceSymbolFeature() { + if(workspaceSymbolFeature != null) { + return; + } + setWorkspaceSymbolFeature(new LSPWorkspaceSymbolFeature()); + } + /** * Initialize the LSP workspaceSymbol feature. * @@ -729,51 +882,45 @@ public void dispose() { if (codeLensFeature != null) { codeLensFeature.dispose(); } - if (documentColorFeature != null) { - documentColorFeature.dispose(); - } if (completionFeature != null) { completionFeature.dispose(); } - if (codeActionFeature != null) { - codeActionFeature.dispose(); - } - if (codeActionFeature != null) { - codeActionFeature.dispose(); - } if (declarationFeature != null) { declarationFeature.dispose(); } if (definitionFeature != null) { definitionFeature.dispose(); } - if (documentLinkFeature != null) { - documentLinkFeature.dispose(); + if (diagnosticFeature != null) { + diagnosticFeature.dispose(); + } + if (documentColorFeature != null) { + documentColorFeature.dispose(); } if (documentHighlightFeature != null) { documentHighlightFeature.dispose(); } + if (documentLinkFeature != null) { + documentLinkFeature.dispose(); + } if (documentSymbolFeature != null) { documentSymbolFeature.dispose(); } - if (diagnosticFeature != null) { - diagnosticFeature.dispose(); - } if (foldingRangeFeature != null) { foldingRangeFeature.dispose(); } if (formattingFeature != null) { formattingFeature.dispose(); } + if (hoverFeature != null) { + hoverFeature.dispose(); + } if (implementationFeature != null) { implementationFeature.dispose(); } if (inlayHintFeature != null) { inlayHintFeature.dispose(); } - if (hoverFeature != null) { - hoverFeature.dispose(); - } if (referencesFeature != null) { referencesFeature.dispose(); } @@ -807,48 +954,42 @@ public void setServerCapabilities(@NotNull ServerCapabilities serverCapabilities if (completionFeature != null) { completionFeature.setServerCapabilities(serverCapabilities); } - if (codeActionFeature != null) { - codeActionFeature.setServerCapabilities(serverCapabilities); - } - if (codeActionFeature != null) { - codeActionFeature.setServerCapabilities(serverCapabilities); - } if (declarationFeature != null) { declarationFeature.setServerCapabilities(serverCapabilities); } if (definitionFeature != null) { definitionFeature.setServerCapabilities(serverCapabilities); } + if (diagnosticFeature != null) { + diagnosticFeature.setServerCapabilities(serverCapabilities); + } if (documentColorFeature != null) { documentColorFeature.setServerCapabilities(serverCapabilities); } - if (documentLinkFeature != null) { - documentLinkFeature.setServerCapabilities(serverCapabilities); - } if (documentHighlightFeature != null) { documentHighlightFeature.setServerCapabilities(serverCapabilities); } + if (documentLinkFeature != null) { + documentLinkFeature.setServerCapabilities(serverCapabilities); + } if (documentSymbolFeature != null) { documentSymbolFeature.setServerCapabilities(serverCapabilities); } - if (diagnosticFeature != null) { - diagnosticFeature.setServerCapabilities(serverCapabilities); - } if (foldingRangeFeature != null) { foldingRangeFeature.setServerCapabilities(serverCapabilities); } if (formattingFeature != null) { formattingFeature.setServerCapabilities(serverCapabilities); } + if (hoverFeature != null) { + hoverFeature.setServerCapabilities(serverCapabilities); + } if (implementationFeature != null) { implementationFeature.setServerCapabilities(serverCapabilities); } if (inlayHintFeature != null) { inlayHintFeature.setServerCapabilities(serverCapabilities); } - if (hoverFeature != null) { - hoverFeature.setServerCapabilities(serverCapabilities); - } if (referencesFeature != null) { referencesFeature.setServerCapabilities(serverCapabilities); } diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeActionFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeActionFeature.java index 07db8121f..269468871 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeActionFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeActionFeature.java @@ -141,13 +141,20 @@ public String getFamilyName(@NotNull Command command) { public CodeActionCapabilityRegistry getCodeActionCapabilityRegistry() { if (codeActionCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - codeActionCapabilityRegistry = new CodeActionCapabilityRegistry(clientFeatures); - codeActionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initCodeActionCapabilityRegistry(); } return codeActionCapabilityRegistry; } + private synchronized void initCodeActionCapabilityRegistry() { + if(codeActionCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + codeActionCapabilityRegistry = new CodeActionCapabilityRegistry(clientFeatures); + codeActionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if(codeActionCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeLensFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeLensFeature.java index 14102efad..208b45f7a 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeLensFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCodeLensFeature.java @@ -151,13 +151,20 @@ public String getText(@NotNull CodeLens codeLens) { public CodeLensCapabilityRegistry getCodeLensCapabilityRegistry() { if (codeLensCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - codeLensCapabilityRegistry = new CodeLensCapabilityRegistry(clientFeatures); - codeLensCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initCodeLensCapabilityRegistry(); } return codeLensCapabilityRegistry; } + private synchronized void initCodeLensCapabilityRegistry() { + if (codeLensCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + codeLensCapabilityRegistry = new CodeLensCapabilityRegistry(clientFeatures); + codeLensCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if(codeLensCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCompletionFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCompletionFeature.java index 035f60746..3cc2cdf76 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCompletionFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPCompletionFeature.java @@ -245,13 +245,20 @@ public void addLookupItem(@NotNull CompletionPrefix completionPrefix, public CompletionCapabilityRegistry getCompletionCapabilityRegistry() { if (completionCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - completionCapabilityRegistry = new CompletionCapabilityRegistry(clientFeatures); - completionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initCompletionCapabilityRegistry(); } return completionCapabilityRegistry; } + private synchronized void initCompletionCapabilityRegistry() { + if (completionCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + completionCapabilityRegistry = new CompletionCapabilityRegistry(clientFeatures); + completionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if(completionCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDeclarationFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDeclarationFeature.java index 179da3de8..9ae6df0cb 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDeclarationFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDeclarationFeature.java @@ -42,13 +42,20 @@ public boolean isDeclarationSupported(@NotNull PsiFile file) { public DeclarationCapabilityRegistry getDeclarationCapabilityRegistry() { if (declarationCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - declarationCapabilityRegistry = new DeclarationCapabilityRegistry(clientFeatures); - declarationCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initDeclarationCapabilityRegistry(); } return declarationCapabilityRegistry; } + private synchronized void initDeclarationCapabilityRegistry() { + if (declarationCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + declarationCapabilityRegistry = new DeclarationCapabilityRegistry(clientFeatures); + declarationCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (declarationCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDefinitionFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDefinitionFeature.java index 6ea36abb6..ba2e6605d 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDefinitionFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDefinitionFeature.java @@ -42,13 +42,20 @@ public boolean isDefinitionSupported(@NotNull PsiFile file) { public DefinitionCapabilityRegistry getDefinitionCapabilityRegistry() { if (definitionCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - definitionCapabilityRegistry = new DefinitionCapabilityRegistry(clientFeatures); - definitionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initDefinitionCapabilityRegistry(); } return definitionCapabilityRegistry; } + private synchronized void initDefinitionCapabilityRegistry() { + if (definitionCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + definitionCapabilityRegistry = new DefinitionCapabilityRegistry(clientFeatures); + definitionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (definitionCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentColorFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentColorFeature.java index 5ebe7811e..2ab79e0c1 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentColorFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentColorFeature.java @@ -42,13 +42,20 @@ public boolean isDocumentColorSupported(@NotNull PsiFile file) { public DocumentColorCapabilityRegistry getDocumentColorCapabilityRegistry() { if (documentColorCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - documentColorCapabilityRegistry = new DocumentColorCapabilityRegistry(clientFeatures); - documentColorCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initDocumentColorCapabilityRegistry(); } return documentColorCapabilityRegistry; } + private synchronized void initDocumentColorCapabilityRegistry() { + if (documentColorCapabilityRegistry != null){ + return; + } + var clientFeatures = getClientFeatures(); + documentColorCapabilityRegistry = new DocumentColorCapabilityRegistry(clientFeatures); + documentColorCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (documentColorCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentHighlightFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentHighlightFeature.java index 41ee66ba5..3e9636b40 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentHighlightFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentHighlightFeature.java @@ -42,12 +42,20 @@ public boolean isDocumentHighlightSupported(@NotNull PsiFile file) { public DocumentHighlightCapabilityRegistry getDocumentHighlightCapabilityRegistry() { if (documentHighlightCapabilityRegistry == null) { - documentHighlightCapabilityRegistry = new DocumentHighlightCapabilityRegistry(getClientFeatures()); - documentHighlightCapabilityRegistry.setServerCapabilities(getClientFeatures().getServerWrapper().getServerCapabilitiesSync()); + initDocumentHighlightCapabilityRegistry(); } return documentHighlightCapabilityRegistry; } + private synchronized void initDocumentHighlightCapabilityRegistry() { + if (documentHighlightCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + documentHighlightCapabilityRegistry = new DocumentHighlightCapabilityRegistry(clientFeatures); + documentHighlightCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if(documentHighlightCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentLinkFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentLinkFeature.java index deb4a0173..5ad3d6d3d 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentLinkFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentLinkFeature.java @@ -42,13 +42,20 @@ public boolean isDocumentLinkSupported(@NotNull PsiFile file) { public DocumentLinkCapabilityRegistry getDocumentLinkCapabilityRegistry() { if (documentLinkCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - documentLinkCapabilityRegistry = new DocumentLinkCapabilityRegistry(clientFeatures); - documentLinkCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initDocumentLinkCapabilityRegistry(); } return documentLinkCapabilityRegistry; } + private synchronized void initDocumentLinkCapabilityRegistry() { + if (documentLinkCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + documentLinkCapabilityRegistry = new DocumentLinkCapabilityRegistry(clientFeatures); + documentLinkCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (documentLinkCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentSymbolFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentSymbolFeature.java index c9eed09d5..c3ea9a123 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentSymbolFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPDocumentSymbolFeature.java @@ -50,13 +50,20 @@ public boolean isDocumentSymbolSupported(@NotNull PsiFile file) { public DocumentSymbolCapabilityRegistry getDocumentSymbolCapabilityRegistry() { if (documentSymbolCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - documentSymbolCapabilityRegistry = new DocumentSymbolCapabilityRegistry(clientFeatures); - documentSymbolCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initDocumentSymbolCapabilityRegistry(); } return documentSymbolCapabilityRegistry; } + private synchronized void initDocumentSymbolCapabilityRegistry() { + if (documentSymbolCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + documentSymbolCapabilityRegistry = new DocumentSymbolCapabilityRegistry(clientFeatures); + documentSymbolCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (documentSymbolCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFoldingRangeFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFoldingRangeFeature.java index 898a980f0..2d75b1576 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFoldingRangeFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFoldingRangeFeature.java @@ -42,13 +42,20 @@ public boolean isFoldingRangeSupported(@NotNull PsiFile file) { public FoldingRangeCapabilityRegistry getFoldingRangeCapabilityRegistry() { if (foldingRangeCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - foldingRangeCapabilityRegistry = new FoldingRangeCapabilityRegistry(clientFeatures); - foldingRangeCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initFoldingRangeCapabilityRegistry(); } return foldingRangeCapabilityRegistry; } + private synchronized void initFoldingRangeCapabilityRegistry() { + if (foldingRangeCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + foldingRangeCapabilityRegistry = new FoldingRangeCapabilityRegistry(clientFeatures); + foldingRangeCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (foldingRangeCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFormattingFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFormattingFeature.java index 47646f02d..6a8c2d056 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFormattingFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPFormattingFeature.java @@ -95,22 +95,36 @@ public boolean isRangeFormattingSupported(@NotNull PsiFile file) { public DocumentFormattingCapabilityRegistry getFormattingCapabilityRegistry() { if (formattingCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - formattingCapabilityRegistry = new DocumentFormattingCapabilityRegistry(clientFeatures); - formattingCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initDocumentFormattingCapabilityRegistry(); } return formattingCapabilityRegistry; } + private synchronized void initDocumentFormattingCapabilityRegistry() { + if (formattingCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + formattingCapabilityRegistry = new DocumentFormattingCapabilityRegistry(clientFeatures); + formattingCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + public DocumentRangeFormattingCapabilityRegistry getRangeFormattingCapabilityRegistry() { if (rangeFormattingCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - rangeFormattingCapabilityRegistry = new DocumentRangeFormattingCapabilityRegistry(clientFeatures); - rangeFormattingCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initDocumentRangeFormattingCapabilityRegistry(); } return rangeFormattingCapabilityRegistry; } - + + private synchronized void initDocumentRangeFormattingCapabilityRegistry() { + if (rangeFormattingCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + rangeFormattingCapabilityRegistry = new DocumentRangeFormattingCapabilityRegistry(clientFeatures); + rangeFormattingCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (formattingCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPHoverFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPHoverFeature.java index 2661bb000..41393e62b 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPHoverFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPHoverFeature.java @@ -46,13 +46,20 @@ public boolean isHoverSupported(@NotNull PsiFile file) { public HoverCapabilityRegistry getHoverCapabilityRegistry() { if (hoverCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - hoverCapabilityRegistry = new HoverCapabilityRegistry(clientFeatures); - hoverCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initHoverCapabilityRegistry(); } return hoverCapabilityRegistry; } + private synchronized void initHoverCapabilityRegistry() { + if(hoverCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + hoverCapabilityRegistry = new HoverCapabilityRegistry(clientFeatures); + hoverCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (hoverCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPImplementationFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPImplementationFeature.java index e75a19fd3..6815f8871 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPImplementationFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPImplementationFeature.java @@ -42,13 +42,20 @@ public boolean isImplementationSupported(@NotNull PsiFile file) { public ImplementationCapabilityRegistry getImplementationCapabilityRegistry() { if (implementationCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - implementationCapabilityRegistry = new ImplementationCapabilityRegistry(clientFeatures); - implementationCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initImplementationCapabilityRegistry(); } return implementationCapabilityRegistry; } + private synchronized void initImplementationCapabilityRegistry() { + if (implementationCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + implementationCapabilityRegistry = new ImplementationCapabilityRegistry(clientFeatures); + implementationCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (implementationCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPInlayHintFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPInlayHintFeature.java index d12bc900c..ecba75b4f 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPInlayHintFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPInlayHintFeature.java @@ -52,13 +52,20 @@ public boolean isResolveInlayHintSupported(@NotNull PsiFile file) { public InlayHintCapabilityRegistry getInlayHintCapabilityRegistry() { if (inlayHintCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - inlayHintCapabilityRegistry = new InlayHintCapabilityRegistry(clientFeatures); - inlayHintCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initInlayHintCapabilityRegistry(); } return inlayHintCapabilityRegistry; } + private synchronized void initInlayHintCapabilityRegistry() { + if (inlayHintCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + inlayHintCapabilityRegistry = new InlayHintCapabilityRegistry(clientFeatures); + inlayHintCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (inlayHintCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPReferencesFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPReferencesFeature.java index 6742f8b7d..04aea24ae 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPReferencesFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPReferencesFeature.java @@ -42,13 +42,20 @@ public boolean isReferencesSupported(@NotNull PsiFile file) { public ReferencesCapabilityRegistry getReferencesCapabilityRegistry() { if (referencesCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - referencesCapabilityRegistry = new ReferencesCapabilityRegistry(clientFeatures); - referencesCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initReferencesCapabilityRegistry(); } return referencesCapabilityRegistry; } + private synchronized void initReferencesCapabilityRegistry() { + if (referencesCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + referencesCapabilityRegistry = new ReferencesCapabilityRegistry(clientFeatures); + referencesCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (referencesCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPRenameFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPRenameFeature.java index fd4cc78fb..52264ce6f 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPRenameFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPRenameFeature.java @@ -53,13 +53,20 @@ public boolean isPrepareRenameSupported(@NotNull PsiFile file) { public RenameCapabilityRegistry getRenameCapabilityRegistry() { if (renameCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - renameCapabilityRegistry = new RenameCapabilityRegistry(clientFeatures); - renameCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initRenameCapabilityRegistry(); } return renameCapabilityRegistry; } + private synchronized void initRenameCapabilityRegistry() { + if (renameCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + renameCapabilityRegistry = new RenameCapabilityRegistry(clientFeatures); + renameCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (renameCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPSignatureHelpFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPSignatureHelpFeature.java index 17cbedd1d..947f19eba 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPSignatureHelpFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPSignatureHelpFeature.java @@ -42,13 +42,20 @@ public boolean isSignatureHelpSupported(@NotNull PsiFile file) { public SignatureHelpCapabilityRegistry getSignatureHelpCapabilityRegistry() { if (signatureHelpCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - signatureHelpCapabilityRegistry = new SignatureHelpCapabilityRegistry(clientFeatures); - signatureHelpCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initSignatureHelpCapabilityRegistry(); } return signatureHelpCapabilityRegistry; } + private synchronized void initSignatureHelpCapabilityRegistry() { + if (signatureHelpCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + signatureHelpCapabilityRegistry = new SignatureHelpCapabilityRegistry(clientFeatures); + signatureHelpCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (signatureHelpCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPTypeDefinitionFeature.java b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPTypeDefinitionFeature.java index ad50e4d38..724fed5b3 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPTypeDefinitionFeature.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/features/LSPTypeDefinitionFeature.java @@ -42,13 +42,20 @@ public boolean isTypeDefinitionSupported(@NotNull PsiFile file) { public TypeDefinitionCapabilityRegistry getTypeDefinitionCapabilityRegistry() { if (typeDefinitionCapabilityRegistry == null) { - var clientFeatures = getClientFeatures(); - typeDefinitionCapabilityRegistry = new TypeDefinitionCapabilityRegistry(clientFeatures); - typeDefinitionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + initTypeDefinitionCapabilityRegistry(); } return typeDefinitionCapabilityRegistry; } + private synchronized void initTypeDefinitionCapabilityRegistry() { + if (typeDefinitionCapabilityRegistry != null) { + return; + } + var clientFeatures = getClientFeatures(); + typeDefinitionCapabilityRegistry = new TypeDefinitionCapabilityRegistry(clientFeatures); + typeDefinitionCapabilityRegistry.setServerCapabilities(clientFeatures.getServerWrapper().getServerCapabilitiesSync()); + } + @Override public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilities) { if (typeDefinitionCapabilityRegistry != null) { diff --git a/src/main/java/com/redhat/devtools/lsp4ij/server/capabilities/TextDocumentServerCapabilityRegistry.java b/src/main/java/com/redhat/devtools/lsp4ij/server/capabilities/TextDocumentServerCapabilityRegistry.java index 76d6cdbe1..4b6c32728 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/server/capabilities/TextDocumentServerCapabilityRegistry.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/server/capabilities/TextDocumentServerCapabilityRegistry.java @@ -42,7 +42,9 @@ public void setServerCapabilities(@Nullable ServerCapabilities serverCapabilitie public T registerCapability(@NotNull JsonObject registerOptions) { T t = create(registerOptions); if (t != null) { - dynamicCapabilities.add(t); + synchronized (dynamicCapabilities) { + dynamicCapabilities.add(t); + } } return t; }