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");