diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java index b447ae1cf..41be1c788 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -92,7 +92,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { projectFinder = serverParams.projectFinder; projectObserver = serverParams.projectObserver; - cuCache = new CompilationUnitCache(projectFinder, getWorkspaceService().getFileObserver(), projectObserver); + cuCache = new CompilationUnitCache(projectFinder, getTextDocumentService(), projectObserver); propertyIndexProvider = serverParams.indexProvider; diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java index 86b170f07..4be7e4429 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java @@ -12,7 +12,6 @@ package org.springframework.ide.vscode.boot.java.utils; import java.net.URI; import java.nio.file.Path; -import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -29,8 +28,8 @@ import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; import org.springframework.ide.vscode.commons.util.BadLocationException; -import org.springframework.ide.vscode.commons.util.FileObserver; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.cache.Cache; @@ -38,32 +37,26 @@ import com.google.common.cache.CacheBuilder; public final class CompilationUnitCache { - private static final String GLOB_ALL_JAVA_FILES = "**/*.java"; - private JavaProjectFinder projectFinder; - private FileObserver fileObserver; private ProjectObserver projectObserver; private Cache uriToCu; private Cache> projectToDocs; - private String fileChangeSubscription; - private String fileDeletedSubscription; private ProjectObserver.Listener projectListener; private ReadLock readLock; private WriteLock writeLock; - public CompilationUnitCache(JavaProjectFinder projectFinder, FileObserver fileObserver, ProjectObserver projectObserver) { + public CompilationUnitCache(JavaProjectFinder projectFinder, SimpleTextDocumentService documentService, ProjectObserver projectObserver) { this.projectFinder = projectFinder; - this.fileObserver = fileObserver; this.projectObserver = projectObserver; projectListener = new CUProjectListener(); uriToCu = CacheBuilder.newBuilder().build(); projectToDocs = CacheBuilder.newBuilder().build(); - if (this.fileObserver != null) { - fileChangeSubscription = this.fileObserver.onFileChanged(Collections.singletonList(GLOB_ALL_JAVA_FILES), (uri) -> invalidateCuForJavaFile(uri)); - fileDeletedSubscription = this.fileObserver.onFileDeleted(Collections.singletonList(GLOB_ALL_JAVA_FILES), (uri) -> invalidateCuForJavaFile(uri)); + if (documentService != null) { + documentService.onDidChangeContent(doc -> invalidateCuForJavaFile(doc.getDocument().getId().getUri())); + documentService.onDidClose(doc -> invalidateCuForJavaFile(doc.getId().getUri())); } if (this.projectObserver != null) { @@ -76,10 +69,6 @@ public final class CompilationUnitCache { } public void dispose() { - if (fileObserver != null) { - fileObserver.unsubscribe(fileChangeSubscription); - fileObserver.unsubscribe(fileDeletedSubscription); - } if (projectObserver != null) { projectObserver.removeListener(projectListener); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java index e5977bb92..db3f0fbfa 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java @@ -63,7 +63,7 @@ public class CompilationUnitCacheTest { } @Test - public void cu_cache_invalidated_by_file_change() throws Exception { + public void cu_cache_invalidated_by_doc_change() throws Exception { harness.intialize(null); TextDocument doc = new TextDocument(harness.createTempUri(), LanguageId.JAVA, 0, "package my.package\n" + @@ -71,10 +71,12 @@ public class CompilationUnitCacheTest { "public class SomeClass {\n" + "\n" + "}\n"); + + harness.newEditorFromFileUri(doc.getUri(), doc.getLanguageId()); CompilationUnit cu = harness.getServer().getCompilationUnitCache().getCompilationUnit(doc); assertNotNull(cu); - harness.changeFile(doc.getUri()); + harness.changeDocument(doc.getUri(), 0, 0, " "); CompilationUnit cuAnother = harness.getServer().getCompilationUnitCache().getCompilationUnit(doc); assertNotNull(cuAnother); assertFalse(cu == cuAnother); @@ -84,7 +86,7 @@ public class CompilationUnitCacheTest { } @Test - public void cu_cache_invalidated_by_file_removal() throws Exception { + public void cu_cache_invalidated_by_doc_close() throws Exception { harness.intialize(null); TextDocument doc = new TextDocument(harness.createTempUri(), LanguageId.JAVA, 0, "package my.package\n" + @@ -92,10 +94,12 @@ public class CompilationUnitCacheTest { "public class SomeClass {\n" + "\n" + "}\n"); + + harness.newEditorFromFileUri(doc.getUri(), doc.getLanguageId()); CompilationUnit cu = harness.getServer().getCompilationUnitCache().getCompilationUnit(doc); assertNotNull(cu); - harness.deleteFile(doc.getUri()); + harness.closeDocument(doc.getId()); CompilationUnit cuAnother = harness.getServer().getCompilationUnitCache().getCompilationUnit(doc); assertNotNull(cuAnother); assertFalse(cu == cuAnother); 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 4bffd7afc..0d13fb6be 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 @@ -58,6 +58,7 @@ import org.eclipse.lsp4j.DiagnosticSeverity; import org.eclipse.lsp4j.DidChangeConfigurationParams; import org.eclipse.lsp4j.DidChangeTextDocumentParams; import org.eclipse.lsp4j.DidChangeWatchedFilesParams; +import org.eclipse.lsp4j.DidCloseTextDocumentParams; import org.eclipse.lsp4j.DidOpenTextDocumentParams; import org.eclipse.lsp4j.DocumentSymbolParams; import org.eclipse.lsp4j.ExecuteCommandCapabilities; @@ -78,6 +79,7 @@ import org.eclipse.lsp4j.ShowMessageRequestParams; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.TextDocumentClientCapabilities; import org.eclipse.lsp4j.TextDocumentContentChangeEvent; +import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextDocumentItem; import org.eclipse.lsp4j.TextDocumentPositionParams; import org.eclipse.lsp4j.TextDocumentSyncKind; @@ -300,6 +302,13 @@ public class LanguageServerHarness { return documentInfo; } + public void closeDocument(TextDocumentIdentifier id) { + DidCloseTextDocumentParams didClose = new DidCloseTextDocumentParams(id); + if (getServer() != null) { + getServer().getTextDocumentService().didClose(didClose); + } + } + public TextDocumentInfo openDocument(File file, String languageId) throws Exception { return openDocument(getOrReadFile(file, languageId)); }