From a687a27d8d0713787330a2d0558c871734b7084d Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Mon, 8 May 2017 14:23:58 -0700 Subject: [PATCH] Avoid stray reconciler errors on language switch --- .../languageserver/util/SimpleTextDocumentService.java | 7 ++++++- .../ide/vscode/commons/util/text/LanguageId.java | 1 + .../manifest/yaml/ManifestYamlLanguageServer.java | 7 ++++++- vscode-extensions/vscode-manifest-yaml/lib/Main.ts | 10 +--------- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java index cb76ed2ab..82d4b0663 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java @@ -145,6 +145,7 @@ public class SimpleTextDocumentService implements TextDocumentService { public void didOpen(DidOpenTextDocumentParams params) { TextDocumentItem docId = params.getTextDocument(); String url = docId.getUri(); + //Log.info("didOpen: "+params.getTextDocument().getUri()); LanguageId languageId = LanguageId.of(docId.getLanguageId()); int version = docId.getVersion(); if (url!=null) { @@ -173,8 +174,12 @@ public class SimpleTextDocumentService implements TextDocumentService { @Override public void didClose(DidCloseTextDocumentParams params) { - //LOG.info("didClose: "+params.getTextDocument().getUri()); + //Log.info("didClose: "+params.getTextDocument().getUri()); String url = params.getTextDocument().getUri(); + //Clear diagnostics when a file is closed. This makes the errors disapear when the language is changed for + // a document (this resulst in a dicClose even as being sent to the language server if that changes make the + // document go 'out of scope'. + publishDiagnostics(params.getTextDocument(), ImmutableList.of()); if (url!=null) { documents.remove(url); } diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java index 55882accf..2f2adf3f1 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/text/LanguageId.java @@ -21,6 +21,7 @@ public class LanguageId { public static final LanguageId PLAINTEXT = of("plaintext"); public static final LanguageId CONCOURSE_TASK = of("concourse-task-yaml"); public static final LanguageId CONCOURSE_PIPELINE = of("concourse-pipeline-yaml"); + public static final LanguageId CF_MANIFEST = of("manifest-yaml"); public static final LanguageId JAVA = of("java"); public static final LanguageId YAML = of("yaml"); diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java index d965d87c9..4b716cbfd 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java @@ -27,6 +27,7 @@ import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEn import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; +import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.commons.yaml.ast.YamlASTProvider; import org.springframework.ide.vscode.commons.yaml.ast.YamlParser; @@ -75,7 +76,11 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { // SimpleWorkspaceService workspace = getWorkspaceService(); documents.onDidChangeContent(params -> { TextDocument doc = params.getDocument(); - validateWith(doc.getId(), engine); + if (LanguageId.CF_MANIFEST.equals(doc.getLanguageId())) { + validateWith(doc.getId(), engine); + } else { + validateWith(doc.getId(), IReconcileEngine.NULL); + } }); // workspace.onDidChangeConfiguraton(settings -> { diff --git a/vscode-extensions/vscode-manifest-yaml/lib/Main.ts b/vscode-extensions/vscode-manifest-yaml/lib/Main.ts index d4eb6cb7d..4c82439b3 100644 --- a/vscode-extensions/vscode-manifest-yaml/lib/Main.ts +++ b/vscode-extensions/vscode-manifest-yaml/lib/Main.ts @@ -29,19 +29,11 @@ function error(msg : string) { export function activate(context: VSCode.ExtensionContext) { let options : commons.ActivatorOptions = { DEBUG : false, - CONNECT_TO_LS: false, + CONNECT_TO_LS: true, extensionId: 'vscode-manifest-yaml', fatJarFile: 'jars/language-server.jar', jvmHeap: '64m', clientOptions: { - // HACK!!! documentSelector only takes string|string[] where string is language id, but DocumentFilter object is passed instead - // Reasons: - // 1. documentSelector is just passed over to functions like #registerHoverProvider(documentSelector, ...) that take documentSelector - // parameter in string | DocumentFilter | string[] | DocumentFilter[] format - // 2. Combination of non string|string[] documentSelector parameter and synchronize.textDocumentFilter function makes doc synchronization - // events pass on to Language Server only for documents for which function passed via textDocumentFilter property return true - - // TODO: Remove cast ones https://github.com/Microsoft/vscode-languageserver-node/issues/9 is resolved documentSelector: ["manifest-yaml"] } };