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 82d4b0663..b3a31ae63 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 @@ -79,6 +79,7 @@ public class SimpleTextDocumentService implements TextDocumentService { private ReferencesHandler referencesHandler; private DocumentSymbolHandler documentSymbolHandler; + private Consumer documentSaveListener; public SimpleTextDocumentService(SimpleLanguageServer server) { this.server = server; @@ -193,6 +194,10 @@ public class SimpleTextDocumentService implements TextDocumentService { documentChangeListeners.add(l); } + public void onDidSave(Consumer l) { + documentSaveListener=l; + } + public synchronized TextDocument getDocument(String url) { TrackedDocument doc = documents.get(url); if (doc==null) { @@ -329,6 +334,21 @@ public class SimpleTextDocumentService implements TextDocumentService { @Override public void didSave(DidSaveTextDocumentParams params) { + // Workaround for PT 147263283, where error markers in STS are lost on document save. + // STS 3.9.0 does not use the LSP4E editor for edit manifest.yml, which correctly retains error markers after save. + // Instead, because the LSP4E editor is missing support for hovers and completions, STS 3.9.0 uses its own manifest editor + // which extends the YEdit editor. This YEdit editor has a problem, where on save, all error markers are deleted. + // When STS uses the LSP4E editor and no longer needs its own YEdit-based editor, the issue with error markers disappearing + // on save should not be a problem anymore, and the workaround below will no longer be needed. + if (documentSaveListener != null) { + TextDocumentIdentifier docId = params.getTextDocument(); + String url = docId.getUri(); + Log.debug("didSave: "+url); + if (url!=null) { + TextDocument doc = getDocument(url); + documentSaveListener.accept(new TextDocumentSaveChange(doc)); + } + } } public void publishDiagnostics(TextDocumentIdentifier docId, Collection diagnostics) { diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocumentSaveChange.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocumentSaveChange.java new file mode 100644 index 000000000..6438c5020 --- /dev/null +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocumentSaveChange.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2017 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ + +package org.springframework.ide.vscode.commons.languageserver.util; + +import org.springframework.ide.vscode.commons.util.text.TextDocument; + +public class TextDocumentSaveChange { + + private final TextDocument document; + + public TextDocumentSaveChange(TextDocument doc) { + this.document = doc; + } + + public TextDocument getDocument() { + return document; + } + +} 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 f266e995d..943fc7cd5 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 @@ -33,6 +33,7 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcil import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService; +import org.springframework.ide.vscode.commons.languageserver.util.TextDocumentContentChange; 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; @@ -86,16 +87,17 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { IReconcileEngine engine = new YamlSchemaBasedReconcileEngine(parser, schema, quickfixes); documents.onDidChangeContent(params -> { - TextDocument doc = params.getDocument(); - if (LanguageId.CF_MANIFEST.equals(doc.getLanguageId()) - || FALLBACK_YML_ID.equals(doc.getLanguageId())) { - // - // this FALLBACK_YML_ID got introduced to workaround a limitation in LSP4E, which sets the file extension as language ID to the document - // - validateWith(doc.getId(), engine); - } else { - validateWith(doc.getId(), IReconcileEngine.NULL); - } + validateOnDocumentChange(engine, params.getDocument()); + }); + + // Workaround for PT 147263283, where error markers in STS are lost on document save. + // STS 3.9.0 does not use the LSP4E editor for edit manifest.yml, which correctly retains error markers after save. + // Instead, because the LSP4E editor is missing support for hovers and completions, STS 3.9.0 uses its own manifest editor + // which extends the YEdit editor. This YEdit editor has a problem, where on save, all error markers are deleted. + // When STS uses the LSP4E editor and no longer needs its own YEdit-based editor, the issue with error markers disappearing + // on save should not be a problem anymore, and the workaround below will no longer be needed. + documents.onDidSave(params -> { + validateOnDocumentChange(engine, params.getDocument()); }); // workspace.onDidChangeConfiguraton(settings -> { @@ -121,6 +123,18 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { }); } + private void validateOnDocumentChange(IReconcileEngine engine, TextDocument doc) { + if (LanguageId.CF_MANIFEST.equals(doc.getLanguageId()) + || FALLBACK_YML_ID.equals(doc.getLanguageId())) { + // + // this FALLBACK_YML_ID got introduced to workaround a limitation in LSP4E, which sets the file extension as language ID to the document + // + validateWith(doc.getId(), engine); + } else { + validateWith(doc.getId(), IReconcileEngine.NULL); + } + } + protected ManifestYmlHintProviders getHintProviders() { Callable> buildPacksProvider = new ManifestYamlCFBuildpacksProvider(getCfTargetCache()); Callable> servicesProvider = new ManifestYamlCFServicesProvider(getCfTargetCache());