Validate non-saved docs on close
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2016, 2023 VMware Inc.
|
* Copyright (c) 2016, 2024 VMware Inc.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -111,6 +111,7 @@ import org.springframework.ide.vscode.commons.util.Assert;
|
|||||||
import org.springframework.ide.vscode.commons.util.AsyncRunner;
|
import org.springframework.ide.vscode.commons.util.AsyncRunner;
|
||||||
import org.springframework.ide.vscode.commons.util.BadLocationException;
|
import org.springframework.ide.vscode.commons.util.BadLocationException;
|
||||||
import org.springframework.ide.vscode.commons.util.CollectionUtil;
|
import org.springframework.ide.vscode.commons.util.CollectionUtil;
|
||||||
|
import org.springframework.ide.vscode.commons.util.text.LazyTextDocument;
|
||||||
import org.springframework.ide.vscode.commons.util.text.TextDocument;
|
import org.springframework.ide.vscode.commons.util.text.TextDocument;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
@@ -760,8 +761,15 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, SpringInd
|
|||||||
TextDocument doc = documents.getLatestSnapshot(docId.getUri());
|
TextDocument doc = documents.getLatestSnapshot(docId.getUri());
|
||||||
|
|
||||||
if (doc == null) {
|
if (doc == null) {
|
||||||
//Do not bother reconciling if document doesn't exist anymore (got closed in the meantime)
|
// If document doesn't exist anymore it likely got closed in the meantime. Still needs validation.
|
||||||
return;
|
LanguageComputer languageDetector = appContext.getBean(LanguageComputer.class);
|
||||||
|
if (languageDetector != null) {
|
||||||
|
doc = new LazyTextDocument(uri.toASCIIString(), languageDetector.computeLanguage(uri));
|
||||||
|
} else {
|
||||||
|
// Cannot determine the language? Give up.
|
||||||
|
log.warn("Cannot determine the language for document: " + uri);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (testListener != null) {
|
if (testListener != null) {
|
||||||
|
|||||||
@@ -640,6 +640,7 @@ public class SimpleTextDocumentService implements TextDocumentService, DocumentE
|
|||||||
if (url != null) {
|
if (url != null) {
|
||||||
TextDocument doc = getLatestSnapshot(url);
|
TextDocument doc = getLatestSnapshot(url);
|
||||||
if (doc != null) {
|
if (doc != null) {
|
||||||
|
doc.saved();
|
||||||
for (Consumer<TextDocumentSaveChange> l : documentSaveListeners) {
|
for (Consumer<TextDocumentSaveChange> l : documentSaveListeners) {
|
||||||
l.accept(new TextDocumentSaveChange(doc));
|
l.accept(new TextDocumentSaveChange(doc));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class LazyTextDocument extends TextDocument {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public LazyTextDocument(String uri, LanguageId languageId) {
|
public LazyTextDocument(String uri, LanguageId languageId) {
|
||||||
this(uri, LanguageId.JAVA, () -> {
|
this(uri, languageId, () -> {
|
||||||
try {
|
try {
|
||||||
InputStream stream = URI.create(uri).toURL().openStream();
|
InputStream stream = URI.create(uri).toURL().openStream();
|
||||||
return IOUtil.toString(stream);
|
return IOUtil.toString(stream);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2016, 2021 Pivotal, Inc.
|
* Copyright (c) 2016, 2024 Pivotal, Inc.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
@@ -37,6 +37,7 @@ public class TextDocument implements IDocument {
|
|||||||
private final String uri;
|
private final String uri;
|
||||||
private Text text = new Text("");
|
private Text text = new Text("");
|
||||||
private int version;
|
private int version;
|
||||||
|
private boolean changedSinceLastSave = false;
|
||||||
|
|
||||||
public TextDocument(String uri, LanguageId languageId) {
|
public TextDocument(String uri, LanguageId languageId) {
|
||||||
this(uri, languageId, 0, "");
|
this(uri, languageId, 0, "");
|
||||||
@@ -48,6 +49,7 @@ public class TextDocument implements IDocument {
|
|||||||
this.text = other.text;
|
this.text = other.text;
|
||||||
this.lineTracker.set(text.toString());
|
this.lineTracker.set(text.toString());
|
||||||
this.version = other.version;
|
this.version = other.version;
|
||||||
|
this.changedSinceLastSave = other.changedSinceLastSave;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextDocument(String uri, LanguageId languageId, int version, String text) {
|
public TextDocument(String uri, LanguageId languageId, int version, String text) {
|
||||||
@@ -95,6 +97,7 @@ public class TextDocument implements IDocument {
|
|||||||
apply(change);
|
apply(change);
|
||||||
}
|
}
|
||||||
this.version = newVersion;
|
this.version = newVersion;
|
||||||
|
this.changedSinceLastSave = true;
|
||||||
} else {
|
} else {
|
||||||
log.warn("Change event with bad version ignored");
|
log.warn("Change event with bad version ignored");
|
||||||
}
|
}
|
||||||
@@ -298,4 +301,12 @@ public class TextDocument implements IDocument {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void saved() {
|
||||||
|
this.changedSinceLastSave = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChangedSinceLastSave() {
|
||||||
|
return this.changedSinceLastSave;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -190,7 +190,16 @@ public class BootLanguageServerInitializer implements InitializingBean {
|
|||||||
TextDocument doc = params.getDocument();
|
TextDocument doc = params.getDocument();
|
||||||
server.validateWith(doc.getId(), reconcileEngine);
|
server.validateWith(doc.getId(), reconcileEngine);
|
||||||
});
|
});
|
||||||
|
server.getTextDocumentService().onDidClose(doc -> {
|
||||||
|
if (doc.hasChangedSinceLastSave()) {
|
||||||
|
/*
|
||||||
|
* If doc is changed since last save closing it would ignore the latest changes.
|
||||||
|
* Therefore the file requires to be validated again.
|
||||||
|
*/
|
||||||
|
server.validateWith(doc.getId(), reconcileEngine);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
// ServerUtils.listenToClassFileChanges(server.getWorkspaceService().getFileObserver(), projectFinder, project -> validateAll(components, server, project));
|
// ServerUtils.listenToClassFileChanges(server.getWorkspaceService().getFileObserver(), projectFinder, project -> validateAll(components, server, project));
|
||||||
});
|
});
|
||||||
config.addListener(evt -> {
|
config.addListener(evt -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user