diff --git a/jvm/src/main/scala/kiama/util/Server.scala b/jvm/src/main/scala/kiama/util/Server.scala index 23e39b0..8a385b2 100644 --- a/jvm/src/main/scala/kiama/util/Server.scala +++ b/jvm/src/main/scala/kiama/util/Server.scala @@ -411,6 +411,13 @@ trait LanguageService[N] { def getSymbols(source: Source): Option[Vector[DocumentSymbol]] = None + /** + * Return the corresponding completion items of the symbol at the + * given position (if any). + */ + def getCompletion(position: Position): Option[Vector[CompletionItem]] = + None + /** * The parameters are passed as an array, potentially containing gson.Json objects or primitives. * The first argument is required to be { uri: String } and used to obtain the source. @@ -454,6 +461,7 @@ class Services[N, C <: Config, M <: Message]( serverCapabilities.setDocumentSymbolProvider(true) serverCapabilities.setHoverProvider(true) serverCapabilities.setReferencesProvider(true) + serverCapabilities.setCompletionProvider(new CompletionOptions) serverCapabilities.setTextDocumentSync(TextDocumentSyncKind.Full) new InitializeResult(serverCapabilities) } @@ -608,6 +616,18 @@ class Services[N, C <: Config, M <: Message]( ) yield locations.toArray ).getOrElse(null) ) + + @JsonNotification("textDocument/completion") + def completion(params: CompletionParams): CompletableFuture[Array[CompletionItem]] = + CompletableFutures.computeAsync( + (_: CancelChecker) => + ( + for ( + position <- positionOfNotification(params.getTextDocument, params.getPosition); + completion <- server.getCompletion(position) + ) yield completion.toArray + ).getOrElse(null) + ) @JsonNotification("workspace/executeCommand") def commands(params: ExecuteCommandParams): CompletableFuture[Any] =