From f408e7c87faceccf11f0f4b9be314753e31d97b5 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 26 Jan 2017 14:52:21 -0800 Subject: [PATCH] Content assist working for task.yml files --- .../concourse/ConcourseLanguageServer.java | 77 ++++++++++++++----- .../vscode/concourse/ConcourseEditorTest.java | 32 ++++++++ 2 files changed, 88 insertions(+), 21 deletions(-) diff --git a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java index a377d5b57..f2348e734 100644 --- a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java +++ b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java @@ -10,6 +10,9 @@ *******************************************************************************/ package org.springframework.ide.vscode.concourse; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.lsp4j.CompletionList; import org.eclipse.lsp4j.CompletionOptions; import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.TextDocumentSyncKind; @@ -29,36 +32,54 @@ import org.springframework.ide.vscode.commons.yaml.completion.YamlAssistContextP import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngine; import org.springframework.ide.vscode.commons.yaml.hover.YamlHoverInfoProvider; import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaBasedReconcileEngine; +import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider; +import com.google.common.collect.ImmutableList; + public class ConcourseLanguageServer extends SimpleLanguageServer { + YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT; + SimpleTextDocumentService documents = getTextDocumentService(); + ConcourseModel models = new ConcourseModel(documents); + YamlASTProvider currentAsts = models.getAstProvider(false); + + private class SchemaSpecificPieces { + + final YamlSchema schema; + final VscodeCompletionEngine completionEngine; + final VscodeHoverEngineAdapter hoverEngine; + final YamlSchemaBasedReconcileEngine reconcileEngine; + + SchemaSpecificPieces(YamlSchema schema) { + this.schema = schema; + SchemaBasedYamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); + YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider); + this.completionEngine = new VscodeCompletionEngineAdapter(ConcourseLanguageServer.this, yamlCompletionEngine); + + HoverInfoProvider infoProvider = new YamlHoverInfoProvider(currentAsts, structureProvider, contextProvider); + this.hoverEngine = new VscodeHoverEngineAdapter(ConcourseLanguageServer.this, infoProvider); + + this.reconcileEngine = new YamlSchemaBasedReconcileEngine(currentAsts, schema); + reconcileEngine.setTypeCollector(models.getAstTypeCache()); + } + + } + public ConcourseLanguageServer() { - SimpleTextDocumentService documents = getTextDocumentService(); + PipelineYmlSchema pipelineSchema = new PipelineYmlSchema(models); - ConcourseModel models = new ConcourseModel(documents); - YamlASTProvider currentAsts = models.getAstProvider(false); - - YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT; - PipelineYmlSchema schema = new PipelineYmlSchema(models); - YamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); - YamlCompletionEngine yamlCompletionEngine = new YamlCompletionEngine(structureProvider, contextProvider); - VscodeCompletionEngine completionEngine = new VscodeCompletionEngineAdapter(this, yamlCompletionEngine); - HoverInfoProvider infoProvider = new YamlHoverInfoProvider(currentAsts, structureProvider, contextProvider); - VscodeHoverEngine hoverEngine = new VscodeHoverEngineAdapter(this, infoProvider); - - YamlSchemaBasedReconcileEngine pipelineReconcileEngine = new YamlSchemaBasedReconcileEngine(currentAsts, schema); - pipelineReconcileEngine.setTypeCollector(models.getAstTypeCache()); - YamlSchemaBasedReconcileEngine taskReconcileEngine = new YamlSchemaBasedReconcileEngine(currentAsts, schema.getTaskSchema()); - ConcourseDefinitionFinder definitionFinder = new ConcourseDefinitionFinder(this, models, schema); + SchemaSpecificPieces forPipelines = new SchemaSpecificPieces(pipelineSchema); + SchemaSpecificPieces forTasks = new SchemaSpecificPieces(pipelineSchema.getTaskSchema()); + ConcourseDefinitionFinder definitionFinder = new ConcourseDefinitionFinder(this, models, pipelineSchema); // SimpleWorkspaceService workspace = getWorkspaceService(); documents.onDidChangeContent(params -> { TextDocument doc = params.getDocument(); if (LanguageIds.CONCOURSE_PIPELINE.equals(doc.getLanguageId())) { - validateWith(doc, pipelineReconcileEngine); + validateWith(doc, forPipelines.reconcileEngine); } else if (LanguageIds.CONCOURSE_TASK.equals(doc.getLanguageId())) { - validateWith(doc, taskReconcileEngine); + validateWith(doc, forTasks.reconcileEngine); } else { validateWith(doc, IReconcileEngine.NULL); } @@ -75,9 +96,23 @@ public class ConcourseLanguageServer extends SimpleLanguageServer { // } // }); - documents.onCompletion(completionEngine::getCompletions); - documents.onCompletionResolve(completionEngine::resolveCompletion); - documents.onHover(hoverEngine::getHover); + documents.onCompletion(params -> { + TextDocument doc = documents.get(params); + if (doc!=null) { + if (LanguageIds.CONCOURSE_PIPELINE.equals(doc.getLanguageId())) { + return forPipelines.completionEngine.getCompletions(params); + } else if (LanguageIds.CONCOURSE_TASK.equals(doc.getLanguageId())) { + return forTasks.completionEngine.getCompletions(params); + } + } + return CompletableFuture.completedFuture(new CompletionList(false, ImmutableList.of())); + }); + documents.onCompletionResolve(params -> { + //this is a bogus implementation. But its not currently used. + throw new IllegalStateException("Not implemented"); + + }); + documents.onHover(forPipelines.hoverEngine::getHover); //TODO: dispatch based on language id documents.onDefinition(definitionFinder); } diff --git a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java index 9b7689531..fd5e579d8 100644 --- a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java +++ b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java @@ -1489,6 +1489,31 @@ public class ConcourseEditorTest { ); } + @Test public void contentAssistTaskFileToplevelProperties() throws Exception { + assertTaskCompletions( + "<*>" + , // ==> + "image: <*>" + , + "image_resource:\n" + + " <*>" + , + "inputs:\n" + + "- <*>" + , + "outputs:\n" + + "- <*>" + , + "params:\n" + + " <*>" + , + "platform: <*>" + , + "run:\n" + + " <*>" + ); + } + ////////////////////////////////////////////////////////////////////////////// private void assertContextualCompletions(String conText, String textBefore, String... textAfter) throws Exception { @@ -1504,4 +1529,11 @@ public class ConcourseEditorTest { Editor editor = harness.newEditor(textBefore); editor.assertCompletions(textAfter); } + + private void assertTaskCompletions(String textBefore, String... textAfter) throws Exception { + Editor editor = harness.newEditor(LanguageIds.CONCOURSE_TASK, textBefore); + editor.assertCompletions(textAfter); + } + + }