Incremental Document sync support

This commit is contained in:
Kris De Volder
2016-12-07 09:59:23 -08:00
parent b019a21c41
commit 878b1c04d8
7 changed files with 51 additions and 11 deletions

View File

@@ -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() {

View File

@@ -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);

View File

@@ -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());
}
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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);
}
}