diff --git a/headless-services/bosh-language-server/.classpath b/headless-services/bosh-language-server/.classpath
index 002ad570e..0ca1374d8 100644
--- a/headless-services/bosh-language-server/.classpath
+++ b/headless-services/bosh-language-server/.classpath
@@ -34,5 +34,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerBootApp.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerBootApp.java
index 61ca414ef..a81aa9a5f 100644
--- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerBootApp.java
+++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerBootApp.java
@@ -18,6 +18,7 @@ import org.springframework.ide.vscode.bosh.models.BoshCommandCloudConfigProvider
import org.springframework.ide.vscode.bosh.models.BoshCommandReleasesProvider;
import org.springframework.ide.vscode.bosh.models.BoshCommandStemcellsProvider;
import org.springframework.ide.vscode.commons.util.LogRedirect;
+import org.springframework.ide.vscode.commons.yaml.reconcile.ASTTypeCache;
@SpringBootApplication
public class BoshLanguageServerBootApp {
@@ -29,6 +30,10 @@ public class BoshLanguageServerBootApp {
SpringApplication.run(BoshLanguageServerBootApp.class, args);
}
+ @Bean public ASTTypeCache astTypeCache() {
+ return new ASTTypeCache();
+ }
+
@Bean public String serverName() {
return SERVER_NAME;
}
diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java
index 2aaf28568..5a05c47ea 100644
--- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java
+++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServerInitializer.java
@@ -12,6 +12,7 @@ package org.springframework.ide.vscode.bosh;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
import org.springframework.ide.vscode.bosh.models.BoshModels;
import org.springframework.ide.vscode.bosh.models.CloudConfigModel;
import org.springframework.ide.vscode.bosh.models.DynamicModelProvider;
@@ -49,6 +50,8 @@ public class BoshLanguageServerInitializer implements InitializingBean {
private DynamicModelProvider releasesProvider;
@Autowired private SimpleLanguageServer server;
+ @Autowired private ApplicationContext appContext;
+ @Autowired private ASTTypeCache astTypeCache;
private BoshSchemas schema;
private VscodeCompletionEngineAdapter completionEngine;
@@ -66,11 +69,10 @@ public class BoshLanguageServerInitializer implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
- BoshModels models = new BoshModels(cloudConfigProvider, stemcellsProvider, releasesProvider);
+ BoshModels models = new BoshModels(cloudConfigProvider, stemcellsProvider, releasesProvider, astTypeCache);
SimpleTextDocumentService documents = server.getTextDocumentService();
schema = new BoshSchemas(models);
YamlAstCache asts = models.asts;
- ASTTypeCache astTypeCache = models.astTypes;
YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT;
YamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema);
@@ -80,8 +82,7 @@ public class BoshLanguageServerInitializer implements InitializingBean {
HoverInfoProvider infoProvider = new YamlHoverInfoProvider(asts.getAstProvider(true), structureProvider, contextProvider);
VscodeHoverEngineAdapter hoverEngine = new VscodeHoverEngineAdapter(server, infoProvider);
YamlQuickfixes quickfixes = new YamlQuickfixes(server.getQuickfixRegistry(), server.getTextDocumentService(), structureProvider);
- YamlSchemaBasedReconcileEngine engine = new YamlSchemaBasedReconcileEngine(asts.getAstProvider(false), schema, quickfixes);
- engine.setTypeCollector(astTypeCache);
+ YamlSchemaBasedReconcileEngine engine = new YamlSchemaBasedReconcileEngine(asts.getAstProvider(false), schema, quickfixes, appContext);
documents.onDocumentSymbol(new TypeBasedYamlSymbolHandler(documents, astTypeCache, schema.getDefinitionTypes()));
documents.onDidChangeContent(params -> {
diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshModels.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshModels.java
index 258b8c800..ca34b1bdf 100644
--- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshModels.java
+++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshModels.java
@@ -18,17 +18,20 @@ import org.springframework.ide.vscode.commons.yaml.schema.DynamicSchemaContext;
public class BoshModels {
public final YamlAstCache asts = new YamlAstCache();
- public final ASTTypeCache astTypes = new ASTTypeCache();
+ public final ASTTypeCache astTypes;
public final DynamicModelProvider cloudConfigProvider;
public final DynamicModelProvider stemcellsProvider;
public final DynamicModelProvider releasesProvider;
public BoshModels(DynamicModelProvider cloudConfigProvider,
DynamicModelProvider stemcellsProvider,
- DynamicModelProvider releasesProvider) {
+ DynamicModelProvider releasesProvider,
+ ASTTypeCache astTypes
+ ) {
this.cloudConfigProvider = cloudConfigProvider;
this.stemcellsProvider = stemcellsProvider;
this.releasesProvider = releasesProvider;
+ this.astTypes = astTypes;
}
public String getTypeTag(DynamicSchemaContext dc) {
diff --git a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java
index afdfcb212..ad3608102 100644
--- a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java
+++ b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java
@@ -15,6 +15,7 @@ import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.springframework.ide.vscode.bosh.models.BoshModels;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
+import org.springframework.ide.vscode.commons.yaml.reconcile.ASTTypeCache;
import org.springframework.ide.vscode.commons.yaml.schema.DynamicSchemaContext;
import org.springframework.ide.vscode.commons.yaml.schema.YType;
import org.springframework.ide.vscode.commons.yaml.schema.YTypeUtil;
@@ -22,7 +23,7 @@ import org.springframework.ide.vscode.commons.yaml.snippet.SchemaBasedSnippetGen
public class SchemaBasedSnippetGeneratorTest {
- private BoshDeploymentManifestSchema schema = new BoshSchemas(new BoshModels((dc) -> null, (dc) -> null, (dc) -> null)).getDeploymentSchema();
+ private BoshDeploymentManifestSchema schema = new BoshSchemas(new BoshModels((dc) -> null, (dc) -> null, (dc) -> null, new ASTTypeCache())).getDeploymentSchema();
private YTypeUtil typeUtil = schema.getTypeUtil();
private SchemaBasedSnippetGenerator generator = new SchemaBasedSnippetGenerator(typeUtil, SnippetBuilder::new);
diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java
index 80ed39206..f109e38b8 100644
--- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java
+++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java
@@ -226,6 +226,12 @@ public class LanguageServerHarness {
}
}
+ public void ensureInitialized() throws Exception {
+ if (initResult==null) {
+ intialize(null);
+ }
+ }
+
public InitializeResult intialize(File workspaceRoot) throws Exception {
int parentPid = random.nextInt(40000)+1000;
InitializeParams initParams = new InitializeParams();
@@ -552,7 +558,6 @@ public class LanguageServerHarness {
}
public Hover getHover(TextDocumentInfo document, Position cursor) throws Exception {
-
TextDocumentPositionParams params = new TextDocumentPositionParams();
params.setPosition(cursor);
params.setTextDocument(document.getId());
@@ -587,16 +592,19 @@ public class LanguageServerHarness {
* Create editor with 'default' language id.
*/
public Editor newEditor(String contents) throws Exception {
+ ensureInitialized();
return newEditor(getDefaultLanguageId(), contents);
}
public synchronized Editor newEditorWithExt(LanguageId languageId, String extension, String contents) throws Exception {
+ ensureInitialized();
Editor editor = new Editor(this, contents, languageId, extension);
activeEditors.add(editor);
return editor;
}
public synchronized Editor newEditor(LanguageId languageId, String contents) throws Exception {
+ ensureInitialized();
Editor editor = new Editor(this, contents, languageId);
activeEditors.add(editor);
return editor;
@@ -604,6 +612,7 @@ public class LanguageServerHarness {
public synchronized Editor newEditor(LanguageId languageId, String contents, String resourceUri) throws Exception {
+ ensureInitialized();
TextDocumentInfo doc = docFromResource(contents, resourceUri, languageId);
Editor editor = new Editor(this, doc, contents, languageId);
activeEditors.add(editor);
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 9d0ab1994..98fe774bd 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
@@ -66,7 +66,6 @@ public class ConcourseEditorTest {
@Before public void setup() throws Exception {
serverInitializer.setMaxCompletions(100);
- harness.intialize(null);
}
@Test public void addSingleRequiredPropertiesQuickfix() throws Exception {
@@ -3695,6 +3694,33 @@ public class ConcourseEditorTest {
);
}
+ @Test public void hiearhicalDocumentSymbolsInPipeline() throws Exception {
+
+ Editor editor = harness.newEditor(
+ "resource_types:\n" +
+ "- name: some-resource-type\n" +
+ "resources:\n" +
+ "- name: foo-resource\n" +
+ "- name: bar-resource\n" +
+ "jobs:\n" +
+ "- name: do-some-stuff\n" +
+ "- name: do-more-stuff\n" +
+ "groups:\n" +
+ "- name: group-one\n" +
+ "- name: group-two\n"
+ );
+
+ editor.assertDocumentSymbols(
+ "some-resource-type|ResourceType",
+ "foo-resource|Resource",
+ "bar-resource|Resource",
+ "do-some-stuff|Job",
+ "do-more-stuff|Job",
+ "group-one|Group",
+ "group-two|Group"
+ );
+ }
+
@Test public void reconcilerRaceCondition() throws Exception {
SynchronizationPoint reconcilerThreadStart = harness.reconcilerThreadStart();
Editor editor = harness.newEditor("garbage");