diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java index 99a764ef2..59cd06a54 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java @@ -56,8 +56,9 @@ public class TextDocument implements IDocument { //full sync mode setText(change.getText()); } else { - //incremental sync mode - throw new IllegalStateException("Incremental sync not yet implemented"); + int start = toOffset(rng.getStart()); + int end = toOffset(rng.getEnd()); + replace(start, end-start, change.getText()); } } @@ -230,8 +231,8 @@ public class TextDocument implements IDocument { } @Override - public void replace(int start, int len, String ins) { - text = text.substring(0, start) + ins + text.substring(start+len); + public synchronized void replace(int start, int len, String ins) { + setText(text.substring(0, start) + ins + text.substring(start+len)); } public synchronized TextDocument copy() { diff --git a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java index aa7784686..9680d024f 100644 --- a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java +++ b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java @@ -164,6 +164,10 @@ public class Editor { return document.getText(); } + private void replaceText(int start, int end, String newText) { + document = harness.changeDocument(document.getUri(), start, end, newText); + } + public void setRawText(String newContent) throws Exception { document = harness.changeDocument(document.getUri(), newContent); } @@ -252,8 +256,7 @@ public class Editor { Range rng = edit.getRange(); int start = document.toOffset(rng.getStart()); int end = document.toOffset(rng.getEnd()); - String newText = docText.substring(0, start) + replaceWith + docText.substring(end); - setRawText(newText); + replaceText(start, end, replaceWith); selectionStart = selectionEnd = start+cursorReplaceOffset; } else { String insertText = getInsertText(completion); diff --git a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index 524698a4e..6f2daf2de 100644 --- a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -167,6 +167,42 @@ public class LanguageServerHarness { return openDocument(getOrReadFile(file)); } + public synchronized TextDocumentInfo changeDocument(String uri, int start, int end, String replaceText) { + TextDocumentInfo oldDoc = documents.get(uri); + String oldContent = oldDoc.getText(); + String newContent = oldContent.substring(0, start) + replaceText + oldContent.substring(end); + TextDocumentItem textDocument = setDocumentContent(uri, newContent); + DidChangeTextDocumentParams didChange = new DidChangeTextDocumentParams(); + VersionedTextDocumentIdentifier version = new VersionedTextDocumentIdentifier(); + version.setUri(uri); + version.setVersion(textDocument.getVersion()); + didChange.setTextDocument(version); + switch (getDocumentSyncMode()) { + case None: + break; //nothing todo + case Incremental: { + TextDocumentContentChangeEvent change = new TextDocumentContentChangeEvent(); + change.setRange(new Range(oldDoc.toPosition(start), oldDoc.toPosition(end))); + change.setRangeLength(end-start); + change.setText(replaceText); + didChange.setContentChanges(Collections.singletonList(change)); + break; + } + case Full: { + TextDocumentContentChangeEvent change = new TextDocumentContentChangeEvent(); + change.setText(newContent); + didChange.setContentChanges(Collections.singletonList(change)); + break; + } + default: + throw new IllegalStateException("Unkown SYNC mode: "+getDocumentSyncMode()); + } + if (server!=null) { + server.getTextDocumentService().didChange(didChange); + } + return documents.get(uri); + } + public TextDocumentInfo changeDocument(String uri, String newContent) throws Exception { TextDocumentItem textDocument = setDocumentContent(uri, newContent); DidChangeTextDocumentParams didChange = new DidChangeTextDocumentParams(); @@ -178,7 +214,6 @@ public class LanguageServerHarness { case None: break; //nothing todo case Incremental: - throw new IllegalStateException("Incremental sync not yet supported by this test harness"); case Full: TextDocumentContentChangeEvent change = new TextDocumentContentChangeEvent(); change.setText(newContent); @@ -323,4 +358,5 @@ public class LanguageServerHarness { CompletionItem completion = editor.getFirstCompletion(); assertEquals(expected, completion.getLabel()); } + } diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java index 8bb363197..e64b21fa7 100644 --- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java +++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java @@ -151,7 +151,7 @@ public class BootPropertiesLanguageServer extends SimpleLanguageServer { protected ServerCapabilities getServerCapabilities() { ServerCapabilities c = new ServerCapabilities(); - c.setTextDocumentSync(TextDocumentSyncKind.Full); + c.setTextDocumentSync(TextDocumentSyncKind.Incremental); CompletionOptions completionProvider = new CompletionOptions(); completionProvider.setResolveProvider(false); c.setCompletionProvider(completionProvider); diff --git a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/BootPropertiesLanguageServerTest.java b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/BootPropertiesLanguageServerTest.java index f939fdcb6..801fb1e96 100644 --- a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/BootPropertiesLanguageServerTest.java +++ b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/BootPropertiesLanguageServerTest.java @@ -56,7 +56,7 @@ public class BootPropertiesLanguageServerTest { } private void assertExpectedInitResult(InitializeResult initResult) { - assertThat(initResult.getCapabilities().getTextDocumentSync()).isEqualTo(TextDocumentSyncKind.Full); + assertThat(initResult.getCapabilities().getTextDocumentSync()).isEqualTo(TextDocumentSyncKind.Incremental); } } diff --git a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java index d4a193960..178fc4ca9 100644 --- a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java +++ b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java @@ -78,7 +78,7 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { protected ServerCapabilities getServerCapabilities() { ServerCapabilities c = new ServerCapabilities(); - c.setTextDocumentSync(TextDocumentSyncKind.Full); + c.setTextDocumentSync(TextDocumentSyncKind.Incremental); c.setHoverProvider(true); CompletionOptions completionProvider = new CompletionOptions(); diff --git a/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java b/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java index bcbb7d475..7d9d3aeb7 100644 --- a/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java +++ b/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java @@ -61,7 +61,7 @@ public class ManifestYamlLanguageServerTest { private void assertExpectedInitResult(InitializeResult initResult) { assertThat(initResult.getCapabilities().getCompletionProvider().getResolveProvider()).isFalse(); - assertThat(initResult.getCapabilities().getTextDocumentSync()).isEqualTo(TextDocumentSyncKind.Full); + assertThat(initResult.getCapabilities().getTextDocumentSync()).isEqualTo(TextDocumentSyncKind.Incremental); } }