diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java index 6aed7ba25..3c9b22a24 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java @@ -234,7 +234,7 @@ public class SchemaBasedYamlASTReconciler implements YamlASTReconciler { } else { message = "Properties "+missingProps+" are required for '"+type+"'"; } - problem(map, message, YamlSchemaProblems.MISSING_PROPERTY); + problems.accept(YamlSchemaProblems.missingProperty(message, map)); } //Check for other constraints attached to the type diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java index 3b4e4290f..209c944dd 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java @@ -19,6 +19,7 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.Reconcile import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.springframework.ide.vscode.commons.yaml.schema.YTypedProperty; +import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; import com.google.common.collect.ImmutableSet; @@ -90,4 +91,8 @@ public class YamlSchemaProblems { return new ReconcileProblemImpl(problemType, msg, start, end-start); } + public static ReconcileProblem missingProperty(String msg, MappingNode map) { + return problem(MISSING_PROPERTY, msg, map); + } + } diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java index b719fabce..bee7825a2 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java @@ -11,7 +11,7 @@ package org.springframework.ide.vscode.commons.yaml.schema.constraints; import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.EXTRA_PROPERTY; -import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.MISSING_PROPERTY; +import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.missingProperty; import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.problem; import java.util.Arrays; @@ -68,7 +68,7 @@ public class Constraints { .count(); if (foundPropsCount==0) { if (!allowFewer) { - problems.accept(problem(MISSING_PROPERTY, + problems.accept(missingProperty( "One of "+requiredProps+" is required for '"+type+"'", map)); } } else if (foundPropsCount>1) { diff --git a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java index e6b208864..abd5e0ac3 100644 --- a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java +++ b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java @@ -23,7 +23,6 @@ import org.springframework.ide.vscode.commons.yaml.ast.YamlFileAST; import org.springframework.ide.vscode.commons.yaml.path.YamlPath; import org.springframework.ide.vscode.commons.yaml.path.YamlPathSegment; import org.springframework.ide.vscode.commons.yaml.schema.DynamicSchemaContext; -import org.springframework.ide.vscode.commons.yaml.schema.SchemaContextAware; import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory; import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.AbstractType; @@ -31,12 +30,11 @@ import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.YAtomicTy import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.YBeanType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.YBeanUnionType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.YTypedPropertyImpl; -import org.springframework.ide.vscode.commons.yaml.schema.constraints.Constraint; -import org.springframework.ide.vscode.commons.yaml.schema.constraints.Constraints; import org.springframework.ide.vscode.commons.yaml.schema.YTypeUtil; import org.springframework.ide.vscode.commons.yaml.schema.YTypedProperty; import org.springframework.ide.vscode.commons.yaml.schema.YValueHint; import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema; +import org.springframework.ide.vscode.commons.yaml.schema.constraints.Constraints; import org.yaml.snakeyaml.nodes.Node; import reactor.core.publisher.Flux; 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 cc8f28ac1..6d9b3c085 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 @@ -583,6 +583,28 @@ public class ConcourseEditorTest { } } + @Test + public void underlineParentPropertyForMissingNode() throws Exception { + //See: https://www.pivotaltracker.com/story/show/140709005 + + Editor editor = harness.newEditor( + "jobs:\n" + + "- name: hello-world\n" + + " plan:\n" + + " - task: say-hello\n" + + " config:\n" + + " image_resource:\n" + + " type: docker-image\n" + + " source: {repository: ubuntu}\n" + + " run:\n" + + " path: echo\n" + + " args: [\"Hello, world!\"]" + ); + editor.assertProblems( + "config|something" + ); + } + @Test public void reconcileDuplicateJobNames() throws Exception { Editor editor = harness.newEditor(