From 237ec550e49f2abb71f3cd08c0be582a12cdd44a Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Tue, 11 Jul 2017 08:47:57 -0700 Subject: [PATCH] Flesh out schema for `stemcells` block --- .../bosh/BoshDeploymentManifestSchema.java | 10 ++++-- .../ide/vscode/concourse/BoshEditorTest.java | 30 +++++++++++++++- .../yaml/completion/YTypeAssistContext.java | 34 +++++++++++-------- .../commons/yaml/schema/YTypeFactory.java | 14 ++++++++ .../vscode/commons/yaml/schema/YTypeUtil.java | 7 ++++ 5 files changed, 77 insertions(+), 18 deletions(-) diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java index 72b07f063..0361631f6 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java @@ -32,7 +32,8 @@ public class BoshDeploymentManifestSchema implements YamlSchema { private final AbstractType TOPLEVEL_TYPE; private final YTypeUtil TYPE_UTIL; - public final YTypeFactory f = new YTypeFactory(); + public final YTypeFactory f = new YTypeFactory() + .enableTieredProposals(false); public final YType t_string = f.yatomic("String"); public final YType t_ne_string = f.yatomic("String") .parseWith(ValueParsers.NE_STRING); @@ -66,7 +67,12 @@ public class BoshDeploymentManifestSchema implements YamlSchema { addProp(t_release, "version", t_version).isRequired(true); addProp(TOPLEVEL_TYPE, "releases", f.yseq(t_release)).isRequired(true); - YType t_stemcell = t_params; //TODO: https://www.pivotaltracker.com/story/show/148627093 + YBeanType t_stemcell = f.ybean("Stemcell"); + addProp(t_stemcell, "alias", t_ne_string).isRequired(true); + addProp(t_stemcell, "version", t_ne_string).isRequired(true); + addProp(t_stemcell, "name", t_ne_string); + addProp(t_stemcell, "os", t_ne_string); + t_stemcell.requireOneOf("name", "os"); addProp(TOPLEVEL_TYPE, "stemcells", f.yseq(t_stemcell)).isRequired(true); YType t_update = t_params; //TODO: https://www.pivotaltracker.com/story/show/148627121 diff --git a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/concourse/BoshEditorTest.java b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/concourse/BoshEditorTest.java index 3e1cef3e8..5ed875d31 100644 --- a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/concourse/BoshEditorTest.java +++ b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/concourse/BoshEditorTest.java @@ -121,7 +121,35 @@ public class BoshEditorTest { "name: <*>", "releases:\n- <*>", "stemcells:\n- <*>", - "update:\n <*>" + "tags:\n <*>", + "update:\n <*>", + "variables:\n- <*>", + "properties:\n <*>" + ); + } + + @Test public void stemcellCompletions() throws Exception { + Editor editor = harness.newEditor( + "stemcells:\n" + + "- <*>" + ); + editor.assertCompletions( + "stemcells:\n" + + "- alias: <*>" + , // ========== + "stemcells:\n" + + "- name: <*>" + , // ========== + "stemcells:\n" + + "- os: <*>" + , // ========== + "stemcells:\n" + + "- version: <*>" + ); + + editor = harness.newEditor( + "stemcells:\n" + + "- alias<*>" ); } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java index d77b9d87b..7a12d9761 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YTypeAssistContext.java @@ -162,23 +162,27 @@ public class YTypeAssistContext extends AbstractYamlAssistContext { * in theory they would be free to define the properties in any order they want. */ protected List> sortIntoTiers(List properties) { - if (properties.isEmpty()) { - //Nothing to sort - return ImmutableList.of(); - } else { - ImmutableList.Builder primary = ImmutableList.builder(); - ImmutableList.Builder required = ImmutableList.builder(); - ImmutableList.Builder other = ImmutableList.builder(); - for (YTypedProperty p : properties) { - if (p.isPrimary()) { - primary.add(p); - } else if (p.isRequired()) { - required.add(p); - } else { - other.add(p); + if (typeUtil.isEnabledTieredProposals()) { + if (properties.isEmpty()) { + //Nothing to sort + return ImmutableList.of(); + } else { + ImmutableList.Builder primary = ImmutableList.builder(); + ImmutableList.Builder required = ImmutableList.builder(); + ImmutableList.Builder other = ImmutableList.builder(); + for (YTypedProperty p : properties) { + if (p.isPrimary()) { + primary.add(p); + } else if (p.isRequired()) { + required.add(p); + } else { + other.add(p); + } } + return ImmutableList.of(primary.build(), required.build(), other.build()); } - return ImmutableList.of(primary.build(), required.build(), other.build()); + } else { + return ImmutableList.of(properties); } } 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 e00c634ae..2d3841d07 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 @@ -52,6 +52,11 @@ import reactor.core.publisher.Flux; */ public class YTypeFactory { + /** + * Configuration option for the type-based completion engine. + */ + private boolean enableTieredProposals = true; + private static class Deprecation { final String errorMsg; final String replacement; @@ -154,6 +159,11 @@ public class YTypeFactory { */ public final YTypeUtil TYPE_UTIL = new YTypeUtil() { + @Override + public boolean isEnabledTieredProposals() { + return enableTieredProposals; + } + @Override public boolean isSequencable(YType type) { return ((AbstractType)type).isSequenceable(); @@ -901,5 +911,9 @@ public class YTypeFactory { return null; } + public YTypeFactory enableTieredProposals(boolean enable) { + this.enableTieredProposals = enable; + return this; + } } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeUtil.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeUtil.java index b6c10556b..ef5e04249 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeUtil.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YTypeUtil.java @@ -49,4 +49,11 @@ public interface YTypeUtil { List getConstraints(YType type); ISubCompletionEngine getCustomContentAssistant(YType type); + + /** + * Config option for type-based completion engine. This enables the + * 'tiered' proposals feature (so that optional properties are not + * suggested until required ones are all defined) + */ + boolean isEnabledTieredProposals(); }