diff --git a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java index f88af74a6..07a602e44 100644 --- a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java +++ b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java @@ -1591,4 +1591,21 @@ public class BoshEditorTest { ); } + @Test public void bug_149769913() throws Exception { + Editor editor = harness.newEditor( + "releases:\n" + + "- name: learn-bosh\n" + + " url: file:///blah\n" + + " version:\n" + + "- name: blah-blah\n" + + " version:" + ); + editor.ignoreProblem(YamlSchemaProblems.MISSING_PROPERTY); + + editor.assertProblems( + "version:^^|cannot be blank", + "version:^^|cannot be blank" + ); + } + } diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/EnumValueParser.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/EnumValueParser.java index 52856e0d5..38f0f7638 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/EnumValueParser.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/EnumValueParser.java @@ -53,6 +53,10 @@ public class EnumValueParser implements ValueParser { this.values = values; } + public EnumValueParser(String name, PartialCollection values) { + this(name, () -> values); + } + @Override public Object parse(String str) throws Exception { // IMPORTANT: check the text FIRST before fetching values diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/PartialCollection.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/PartialCollection.java index 3b0ddc065..93efa7477 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/PartialCollection.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/PartialCollection.java @@ -68,6 +68,20 @@ public class PartialCollection { return new PartialCollection<>(ImmutableSet.of(), e); } } + + /** + * Create a {@link PartialCollection} by executing some computation that returs a collectioon. + * If the computation throws the resulting collection will be completely unknown, otherwise + * it will be completely known. + */ + public static PartialCollection fromCallable(Callable> computer) { + try { + return computer.call(); + } catch (Exception e) { + return new PartialCollection<>(ImmutableSet.of(), e); + } + } + /** * @return All the known elements of this partial collection. diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeFactory.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeFactory.java index dec12c1c9..54227bd14 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeFactory.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeFactory.java @@ -859,21 +859,17 @@ public class YTypeFactory { YAtomicType t = yatomic(name); t.setHintProvider(values); t.parseWith((DynamicSchemaContext dc) -> { - PartialCollection hints = values.withContext(dc); - if (hints.isComplete()) { - Collection strings = values(hints.getElements()); - return new EnumValueParser(name, strings) { - @Override - protected String createErrorMessage(String parseString, Collection values) { - try { - return errorMessageFormatter.withContext(dc).apply(parseString, values); - } catch (Exception e) { - return super.createErrorMessage(parseString, values); - } + PartialCollection hints = PartialCollection.fromCallable(() -> values.withContext(dc)); + return new EnumValueParser(name, hints.map(h -> h.getValue())) { + @Override + protected String createErrorMessage(String parseString, Collection values) { + try { + return errorMessageFormatter.withContext(dc).apply(parseString, values); + } catch (Exception e) { + return super.createErrorMessage(parseString, values); } - }; - } - return null; + } + }; }); return t; }