Incremental Document sync support
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user