diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/SchemaContextAware.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/SchemaContextAware.java index aa989c42e..ff225c61f 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/SchemaContextAware.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/SchemaContextAware.java @@ -17,6 +17,7 @@ package org.springframework.ide.vscode.commons.yaml.schema; * * @author Kris De Volder */ +@FunctionalInterface public interface SchemaContextAware { T withContext(DynamicSchemaContext dc); diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDefinitionFinder.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDefinitionFinder.java index e32131fdf..77133bc36 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDefinitionFinder.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDefinitionFinder.java @@ -44,6 +44,7 @@ public class ConcourseDefinitionFinder extends SimpleDefinitionFinder definitionTypes = new ArrayList<>(); + public PipelineYmlSchema(ConcourseModel models) { this.models = models; models.setResourceTypeRegistry(resourceTypes); @@ -179,6 +184,14 @@ public class PipelineYmlSchema implements YamlSchema { return (models.getResourceNames(dc)); } ); + t_maybe_resource_name = f.yatomic("ResourceName | TaskOutput"); + t_maybe_resource_name.addHintProvider((DynamicSchemaContext dc) -> { + //Putting the Callable into a local variable is strange, but the compiler doesn't like it if + // we return it directly. Too much complexity for Java type-inference? + Callable> callable = () -> YTypeFactory.hints(models.getResourceNames(dc)); + return callable; + }); + t_maybe_resource_name.parseWith(ValueParsers.NE_STRING); t_job_name = f.yenum("Job Name", (parseString, validValues) -> { @@ -311,7 +324,7 @@ public class PipelineYmlSchema implements YamlSchema { addProp(taskStep, "privileged", t_boolean); addProp(taskStep, "params", t_params); addProp(taskStep, "image", t_resource_name); - addProp(taskStep, "input_mapping", f.ymap(t_ne_string, t_resource_name)); + addProp(taskStep, "input_mapping", f.ymap(t_ne_string, t_maybe_resource_name)); addProp(taskStep, "output_mapping", t_string_params); taskStep.requireOneOf("config", "file"); diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchemaProblems.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchemaProblems.java index 089eba39c..f4e3569dc 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchemaProblems.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchemaProblems.java @@ -16,5 +16,5 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTy import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.*; public class PipelineYmlSchemaProblems { - protected static final ProblemType UNUSED_RESOURCE = problemType("PipelineYamlUnusedResource", ProblemSeverity.WARNING); + protected static final ProblemType UNUSED_RESOURCE = problemType("PipelineYamlUnusedResource", ProblemSeverity.ERROR); } diff --git a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java index dbd600951..8f9b2d79e 100644 --- a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java +++ b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java @@ -585,14 +585,14 @@ public class ConcourseEditorTest { editor.assertProblems( "bogus-get|resource does not exist", "bogus-image|resource does not exist", - "bogus-input|resource does not exist", +// "bogus-input|resource does not exist", //Not checked anymore. See: https://www.pivotaltracker.com/story/show/145024233 "bogus-put|resource does not exist" ); editor.assertProblems( "bogus-get|[sts4]", "bogus-image|[sts4]", - "bogus-input|[sts4]", +// "bogus-input|[sts4]", //Not checked anymore. See: https://www.pivotaltracker.com/story/show/145024233 "bogus-put|[sts4]" ); } @@ -744,6 +744,24 @@ public class ConcourseEditorTest { , // => "repo-a<*>", "repo-b<*>" ); + + assertContextualCompletions( + "resources:\n" + + "- name: sts4\n" + + "- name: repo-a\n" + + "- name: repo-b\n" + + "jobs:\n" + + "- name: job1\n" + + " plan:\n" + + " - task: do-it\n" + + " input_mapping:\n" + + " remapped: <*>\n" + , //////////////////// + "<*>" + , // => + "repo-a<*>", "repo-b<*>", "sts4<*>" + ); + } @Test @@ -3695,7 +3713,7 @@ public class ConcourseEditorTest { " - get: version\n" ); Diagnostic p = editor.assertProblems("source-repo|Unused 'Resource'").get(0); - assertEquals(DiagnosticSeverity.Warning, p.getSeverity()); + assertEquals(DiagnosticSeverity.Error, p.getSeverity()); editor = harness.newEditor( "resources:\n" + diff --git a/vscode-extensions/.project b/vscode-extensions/.project new file mode 100644 index 000000000..731951e4c --- /dev/null +++ b/vscode-extensions/.project @@ -0,0 +1,11 @@ + + + vscode-extensions + + + + + + + +