diff --git a/rascal-lsp/src/main/checkerframework/lsp4j.astub b/rascal-lsp/src/main/checkerframework/lsp4j.astub index ad2326e30..a1bd7470e 100644 --- a/rascal-lsp/src/main/checkerframework/lsp4j.astub +++ b/rascal-lsp/src/main/checkerframework/lsp4j.astub @@ -107,3 +107,347 @@ public class CallHierarchyItem { public void setDetail(@Nullable final String detail) { } public void setData(@Nullable final Object data) { } } + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class ClientCapabilities { + public @Nullable WorkspaceClientCapabilities getWorkspace() {} + public @Nullable TextDocumentClientCapabilities getTextDocument() {} + public @Nullable NotebookDocumentClientCapabilities getNotebookDocument() {} + public @Nullable WindowClientCapabilities getWindow() {} + public @Nullable GeneralClientCapabilities getGeneral() {} + public @Nullable Object getExperimental() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class WorkspaceClientCapabilities { + public @Nullable Boolean getApplyEdit() {} + public @Nullable WorkspaceEditCapabilities getWorkspaceEdit() {} + public @Nullable DidChangeConfigurationCapabilities getDidChangeConfiguration() {} + public @Nullable DidChangeWatchedFilesCapabilities getDidChangeWatchedFiles() {} + public @Nullable SymbolCapabilities getSymbol() {} + public @Nullable ExecuteCommandCapabilities getExecuteCommand() {} + public @Nullable Boolean getWorkspaceFolders() {} + public @Nullable Boolean getConfiguration() {} + public @Nullable SemanticTokensWorkspaceCapabilities getSemanticTokens() {} + public @Nullable CodeLensWorkspaceCapabilities getCodeLens() {} + public @Nullable FileOperationsWorkspaceCapabilities getFileOperations() {} + public @Nullable InlayHintWorkspaceCapabilities getInlayHint() {} + public @Nullable InlineValueWorkspaceCapabilities getInlineValue() {} + public @Nullable DiagnosticWorkspaceCapabilities getDiagnostics() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class TextDocumentClientCapabilities { + public @Nullable SynchronizationCapabilities getSynchronization() {} + public @Nullable CompletionCapabilities getCompletion() {} + public @Nullable HoverCapabilities getHover() {} + public @Nullable SignatureHelpCapabilities getSignatureHelp() {} + public @Nullable ReferencesCapabilities getReferences() {} + public @Nullable DocumentHighlightCapabilities getDocumentHighlight() {} + public @Nullable DocumentSymbolCapabilities getDocumentSymbol() {} + public @Nullable FormattingCapabilities getFormatting() {} + public @Nullable RangeFormattingCapabilities getRangeFormatting() {} + public @Nullable OnTypeFormattingCapabilities getOnTypeFormatting() {} + public @Nullable DeclarationCapabilities getDeclaration() {} + public @Nullable DefinitionCapabilities getDefinition() {} + public @Nullable TypeDefinitionCapabilities getTypeDefinition() {} + public @Nullable ImplementationCapabilities getImplementation() {} + public @Nullable CodeActionCapabilities getCodeAction() {} + public @Nullable CodeLensCapabilities getCodeLens() {} + public @Nullable DocumentLinkCapabilities getDocumentLink() {} + public @Nullable ColorProviderCapabilities getColorProvider() {} + public @Nullable RenameCapabilities getRename() {} + public @Nullable PublishDiagnosticsCapabilities getPublishDiagnostics() {} + public @Nullable FoldingRangeCapabilities getFoldingRange() {} + public @Nullable TypeHierarchyCapabilities getTypeHierarchy() {} + public @Nullable CallHierarchyCapabilities getCallHierarchy() {} + public @Nullable SelectionRangeCapabilities getSelectionRange() {} + public @Nullable SemanticTokensCapabilities getSemanticTokens() {} + public @Nullable MonikerCapabilities getMoniker() {} + public @Nullable LinkedEditingRangeCapabilities getLinkedEditingRange() {} + public @Nullable InlayHintCapabilities getInlayHint() {} + public @Nullable InlineValueCapabilities getInlineValue() {} + public @Nullable DiagnosticCapabilities getDiagnostic() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class WindowClientCapabilities { + public @Nullable Boolean getWorkDoneProgress() {} + public @Nullable WindowShowMessageRequestCapabilities getShowMessage() {} + public @Nullable ShowDocumentCapabilities getShowDocument() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class GeneralClientCapabilities { + public @Nullable RegularExpressionsCapabilities getRegularExpressions() {} + public @Nullable MarkdownCapabilities getMarkdown() {} + public @Nullable StaleRequestCapabilities getStaleRequestSupport() {} + public @Nullable List getPositionEncodings() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class WorkspaceEditCapabilities { + public @Nullable Boolean getDocumentChanges() {} + public @Nullable List getResourceOperations() {} + public @Nullable String getFailureHandling() {} + public @Nullable Boolean getNormalizesLineEndings() {} + public @Nullable WorkspaceEditChangeAnnotationSupportCapabilities getChangeAnnotationSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class DynamicRegistrationCapabilities { + public @Nullable Boolean getDynamicRegistration() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class DidChangeWatchedFilesCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getRelativePatternSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class SymbolCapabilities extends DynamicRegistrationCapabilities { + public @Nullable SymbolKindCapabilities getSymbolKind() {} + public @Nullable SymbolTagSupportCapabilities getTagSupport() {} + public @Nullable WorkspaceSymbolResolveSupportCapabilities getResolveSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class SemanticTokensWorkspaceCapabilities { + public @Nullable Boolean getRefreshSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class CodeLensWorkspaceCapabilities { + public @Nullable Boolean getRefreshSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class FileOperationsWorkspaceCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getDidCreate() {} + public @Nullable Boolean getWillCreate() {} + public @Nullable Boolean getDidRename() {} + public @Nullable Boolean getWillRename() {} + public @Nullable Boolean getDidDelete() {} + public @Nullable Boolean getWillDelete() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class InlayHintWorkspaceCapabilities { + public @Nullable Boolean getRefreshSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class InlineValueWorkspaceCapabilities { + public @Nullable Boolean getRefreshSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class DiagnosticWorkspaceCapabilities { + public @Nullable Boolean getRefreshSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class WorkspaceEditChangeAnnotationSupportCapabilities { + public @Nullable Boolean getGroupsOnLabel() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class SynchronizationCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getWillSave() {} + public @Nullable Boolean getWillSaveWaitUntil() {} + public @Nullable Boolean getDidSave() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class CompletionCapabilities extends DynamicRegistrationCapabilities { + public @Nullable CompletionItemCapabilities getCompletionItem() {} + public @Nullable CompletionItemKindCapabilities getCompletionItemKind() {} + public @Nullable Boolean getContextSupport() {} + public @Nullable InsertTextMode getInsertTextMode() {} + public @Nullable CompletionListCapabilities getCompletionList() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class HoverCapabilities extends DynamicRegistrationCapabilities { + public @Nullable List getContentFormat() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class SignatureHelpCapabilities extends DynamicRegistrationCapabilities { + public @Nullable SignatureInformationCapabilities getSignatureInformation() {} + public @Nullable Boolean getContextSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class DocumentSymbolCapabilities extends DynamicRegistrationCapabilities { + public @Nullable SymbolKindCapabilities getSymbolKind() {} + public @Nullable Boolean getHierarchicalDocumentSymbolSupport() {} + public @Nullable SymbolTagSupportCapabilities getTagSupport() {} + public @Nullable Boolean getLabelSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class DeclarationCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getLinkSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class DefinitionCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getLinkSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class TypeDefinitionCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getLinkSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class ImplementationCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getLinkSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class CodeActionCapabilities extends DynamicRegistrationCapabilities { + public @Nullable CodeActionLiteralSupportCapabilities getCodeActionLiteralSupport() {} + public @Nullable Boolean getIsPreferredSupport() {} + public @Nullable Boolean getDisabledSupport() {} + public @Nullable Boolean getDataSupport() {} + public @Nullable CodeActionResolveSupportCapabilities getResolveSupport() {} + public @Nullable Boolean getHonorsChangeAnnotations() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class DocumentLinkCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getTooltipSupport() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class RenameCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getPrepareSupport() {} + public @Nullable PrepareSupportDefaultBehavior getPrepareSupportDefaultBehavior() {} + public @Nullable Boolean getHonorsChangeAnnotations() {} +} + + +package org.eclipse.lsp4j; + +import org.checkerframework.checker.nullness.qual.*; + +public class SemanticTokensCapabilities extends DynamicRegistrationCapabilities { + public @Nullable Boolean getOverlappingTokenSupport() {} + public @Nullable Boolean getMultilineTokenSupport() {} + public @Nullable Boolean getServerCancelSupport() {} + public @Nullable Boolean getAugmentsSyntaxTokens() {} +} diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/BaseWorkspaceService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/BaseWorkspaceService.java index c0669dc8b..75afbb69a 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/BaseWorkspaceService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/BaseWorkspaceService.java @@ -47,12 +47,14 @@ import org.eclipse.lsp4j.FileDelete; import org.eclipse.lsp4j.RenameFilesParams; import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.WorkspaceClientCapabilities; import org.eclipse.lsp4j.WorkspaceFolder; import org.eclipse.lsp4j.WorkspaceFoldersOptions; import org.eclipse.lsp4j.WorkspaceServerCapabilities; import org.eclipse.lsp4j.services.LanguageClient; import org.eclipse.lsp4j.services.LanguageClientAware; import org.eclipse.lsp4j.services.WorkspaceService; +import org.rascalmpl.vscode.lsp.util.Nullables; import org.rascalmpl.vscode.lsp.util.concurrent.CompletableFutureUtils; import org.rascalmpl.vscode.lsp.util.locations.Locations; @@ -82,14 +84,12 @@ public void initialize(ClientCapabilities clientCap, @Nullable List The type of the containing object. + * @param a The nullable containing object. + * @param hasFunc The boolean getter. + * @return True if the objects are non-null and the boolean is true, false otherwise. + */ + public static boolean has(@Nullable A a, Function hasFunc) { + return get(a, hasFunc, false); + } + + /** + * Check a boolean value nested in a nullable object hierarchy. + * @param The type of the outer containing object. + * @param The type of the inner containing object, contained in {@link A}. + * @param a The nullable containing object. + * @param getFunc The getter for the inner object. + * @param hasFunc The boolean getter. + * @return True if both objects are non-null and the boolean is true, false otherwise. + */ + public static boolean has(@Nullable A a, Function getFunc, Function hasFunc) { + if (a == null) { + return false; + } + return has(getFunc.apply(a), hasFunc); + } + + /** + * Get a value from a nullable object. + * @param The type of the containing object. + * @param The type of the value. + * @param a The nullable containing object. + * @param getFunc The value getter. + * @param defaultVal The value to return when either `a` or the return value of the getter is `null`. + * @return The gotten value if everything is non-null, `defaultVal` otherwise. + */ + public static @PolyNull B get(@Nullable A a, Function getFunc, @PolyNull B defaultVal) { + if (a == null) { + return defaultVal; + } + var b = getFunc.apply(a); + if (b == null) { + return defaultVal; + } + return b; + } + + /** + * Get a value from a nullable object hierarchy. + * @param The type of the outer containing object. + * @param The type of the inner containing object. + * @param The type of the value to get. + * @param a The nullable outer containing object. + * @param getFunc1 The inner object getter. + * @param getFunc2 The value getter. + * @param defaultVal The value to return when the outer or inner object is null, or the value is null. + * @return The gotten value if everything is non-null, `defaultVal` otherwise. + */ + public static @PolyNull C get(@Nullable A a, Function getFunc1, Function getFunc2, @PolyNull C defaultVal) { + return get(get(a, getFunc1, null), getFunc2, defaultVal); + } + +}