forked from eclipse-wildwebdeveloper/wildwebdeveloper
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixes eclipse-wildwebdeveloper#143 Signed-off-by: azerr <azerr@redhat.com>
- Loading branch information
1 parent
adf04ab
commit 8ef3c0b
Showing
6 changed files
with
288 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
...dwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XMLLanguageServerAPI.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package org.eclipse.wildwebdeveloper.xml.internal; | ||
|
||
import java.util.concurrent.CompletableFuture; | ||
|
||
import org.eclipse.lsp4j.TextDocumentPositionParams; | ||
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; | ||
import org.eclipse.lsp4j.services.LanguageServer; | ||
import org.eclipse.wildwebdeveloper.xml.internal.lsp.AutoCloseTagResponse; | ||
|
||
public interface XMLLanguageServerAPI extends LanguageServer { | ||
|
||
@JsonRequest("xml/closeTag") | ||
CompletableFuture<AutoCloseTagResponse> closeTag(TextDocumentPositionParams params); | ||
|
||
} |
17 changes: 17 additions & 0 deletions
17
...developer.xml/src/org/eclipse/wildwebdeveloper/xml/internal/lsp/AutoCloseTagResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package org.eclipse.wildwebdeveloper.xml.internal.lsp; | ||
|
||
import org.eclipse.lsp4j.Range; | ||
|
||
public class AutoCloseTagResponse { | ||
public String snippet; | ||
public Range range; | ||
|
||
public AutoCloseTagResponse(String snippet, Range range) { | ||
this.snippet = snippet; | ||
this.range = range; | ||
} | ||
|
||
public AutoCloseTagResponse(String snippet) { | ||
this.snippet = snippet; | ||
} | ||
} |
22 changes: 22 additions & 0 deletions
22
...developer.xml/src/org/eclipse/wildwebdeveloper/xml/internal/lsp/ClosingTagReconciler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package org.eclipse.wildwebdeveloper.xml.internal.lsp; | ||
|
||
import org.eclipse.jface.text.DocumentEvent; | ||
import org.eclipse.jface.text.ITextViewer; | ||
|
||
public class ClosingTagReconciler extends NoThreadReconciler { | ||
|
||
public ClosingTagReconciler() { | ||
super(new ClosingTagReconcilingStrategy()); | ||
} | ||
|
||
@Override | ||
public void install(ITextViewer textViewer) { | ||
super.install(textViewer); | ||
((ClosingTagReconcilingStrategy)getReconcilingStrategy(null)).install(textViewer); | ||
} | ||
|
||
@Override | ||
protected void documentChanged(DocumentEvent e) { | ||
((ClosingTagReconcilingStrategy)getReconcilingStrategy(null)).documentChanged(e); | ||
} | ||
} |
111 changes: 111 additions & 0 deletions
111
....xml/src/org/eclipse/wildwebdeveloper/xml/internal/lsp/ClosingTagReconcilingStrategy.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
package org.eclipse.wildwebdeveloper.xml.internal.lsp; | ||
|
||
import java.net.URI; | ||
import java.util.Optional; | ||
import java.util.concurrent.CompletableFuture; | ||
|
||
import org.eclipse.jface.text.BadLocationException; | ||
import org.eclipse.jface.text.DocumentEvent; | ||
import org.eclipse.jface.text.IDocument; | ||
import org.eclipse.jface.text.IRegion; | ||
import org.eclipse.jface.text.ITextViewer; | ||
import org.eclipse.jface.text.reconciler.DirtyRegion; | ||
import org.eclipse.jface.text.reconciler.IReconcilingStrategy; | ||
import org.eclipse.lsp4e.LSPEclipseUtils; | ||
import org.eclipse.lsp4e.LanguageServiceAccessor; | ||
import org.eclipse.lsp4e.LanguageServiceAccessor.LSPDocumentInfo; | ||
import org.eclipse.lsp4j.TextDocumentIdentifier; | ||
import org.eclipse.lsp4j.TextDocumentPositionParams; | ||
import org.eclipse.swt.widgets.Display; | ||
import org.eclipse.wildwebdeveloper.xml.internal.XMLLanguageServerAPI; | ||
|
||
public class ClosingTagReconcilingStrategy implements IReconcilingStrategy { | ||
|
||
|
||
private ITextViewer viewer; | ||
|
||
@Override | ||
public void reconcile(IRegion region) { | ||
|
||
} | ||
|
||
public void update(DocumentEvent event) { | ||
if (event == null || viewer == null) { | ||
return; | ||
} | ||
IDocument document = event.getDocument(); | ||
if (document == null || event == null || event.getLength() != 0 || event.getText().length() != 1) { | ||
return; | ||
} | ||
|
||
int offset = event.getOffset() + 1; | ||
char c = event.getText().charAt(0); | ||
if (c != '>' && c != '/') { | ||
return; | ||
} | ||
URI uri = LSPEclipseUtils.toUri(document); | ||
if (uri == null) { | ||
return; | ||
} | ||
|
||
TextDocumentIdentifier identifier = new TextDocumentIdentifier(uri.toString()); | ||
Optional<LSPDocumentInfo> info = LanguageServiceAccessor | ||
.getLSPDocumentInfosFor(document, (capabilities) -> true).stream() | ||
.filter(doc -> (doc.getLanguageClient() instanceof XMLLanguageServerAPI)).findAny(); | ||
if (!info.isEmpty()) { | ||
final Display display = viewer.getTextWidget().getShell().getDisplay(); | ||
CompletableFuture.supplyAsync(() -> { | ||
try { | ||
Thread.sleep(200); | ||
} catch (InterruptedException e1) { | ||
// TODO Auto-generated catch block | ||
e1.printStackTrace(); | ||
} | ||
try { | ||
TextDocumentPositionParams params = LSPEclipseUtils.toTextDocumentPosistionParams(uri, offset, | ||
document); | ||
((XMLLanguageServerAPI) info.get().getLanguageClient()).closeTag(params).thenAccept(r -> { | ||
if (r != null) { | ||
display.asyncExec(() -> { | ||
try { | ||
String text = r.snippet.replace("$0", ""); | ||
document.replace(offset, 0, text); | ||
} catch (BadLocationException e) { | ||
// TODO Auto-generated catch block | ||
e.printStackTrace(); | ||
} | ||
}); | ||
|
||
} | ||
}); | ||
} catch (BadLocationException e) { | ||
// TODO Auto-generated catch block | ||
e.printStackTrace(); | ||
} | ||
return null; | ||
}); | ||
} | ||
} | ||
|
||
@Override | ||
public void reconcile(DirtyRegion arg0, IRegion arg1) { | ||
|
||
} | ||
|
||
@Override | ||
public void setDocument(IDocument document) { | ||
} | ||
|
||
public void install(ITextViewer viewer) { | ||
this.viewer = viewer; | ||
} | ||
|
||
public void uninstall() { | ||
|
||
} | ||
|
||
public void documentChanged(DocumentEvent e) { | ||
update(e); | ||
} | ||
|
||
} |
115 changes: 115 additions & 0 deletions
115
...ebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/lsp/NoThreadReconciler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
package org.eclipse.wildwebdeveloper.xml.internal.lsp; | ||
|
||
import org.eclipse.jface.text.DocumentEvent; | ||
import org.eclipse.jface.text.IDocument; | ||
import org.eclipse.jface.text.IDocumentListener; | ||
import org.eclipse.jface.text.ITextInputListener; | ||
import org.eclipse.jface.text.ITextViewer; | ||
import org.eclipse.jface.text.reconciler.IReconciler; | ||
import org.eclipse.jface.text.reconciler.IReconcilingStrategy; | ||
import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension; | ||
|
||
public class NoThreadReconciler implements IReconciler { | ||
|
||
/** The text viewer's document */ | ||
private IDocument document; | ||
/** The text viewer */ | ||
private ITextViewer textViewer; | ||
|
||
private IReconcilingStrategy strategy; | ||
private Listener fListener; | ||
|
||
public NoThreadReconciler(IReconcilingStrategy strategy) { | ||
this.strategy = strategy; | ||
} | ||
|
||
/** | ||
* Internal document listener and text input listener. | ||
*/ | ||
class Listener implements IDocumentListener, ITextInputListener { | ||
|
||
/* | ||
* @see IDocumentListener#documentAboutToBeChanged(DocumentEvent) | ||
*/ | ||
@Override | ||
public void documentAboutToBeChanged(DocumentEvent e) { | ||
} | ||
|
||
/* | ||
* @see IDocumentListener#documentChanged(DocumentEvent) | ||
*/ | ||
@Override | ||
public void documentChanged(DocumentEvent e) { | ||
NoThreadReconciler.this.documentChanged(e); | ||
} | ||
|
||
/* | ||
* @see ITextInputListener#inputDocumentAboutToBeChanged(IDocument, IDocument) | ||
*/ | ||
@Override | ||
public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) { | ||
|
||
if (oldInput == document) { | ||
|
||
if (document != null) | ||
document.removeDocumentListener(this); | ||
document = null; | ||
} | ||
} | ||
|
||
/* | ||
* @see ITextInputListener#inputDocumentChanged(IDocument, IDocument) | ||
*/ | ||
@Override | ||
public void inputDocumentChanged(IDocument oldInput, IDocument newInput) { | ||
|
||
document = newInput; | ||
if (document == null) | ||
return; | ||
reconcilerDocumentChanged(document); | ||
|
||
document.addDocumentListener(this); | ||
initialProcess(); | ||
} | ||
|
||
} | ||
|
||
@Override | ||
public void install(ITextViewer textViewer) { | ||
this.textViewer = textViewer; | ||
fListener = new Listener(); | ||
textViewer.addTextInputListener(fListener); | ||
} | ||
|
||
protected void documentChanged(DocumentEvent e) { | ||
// TODO Auto-generated method stub | ||
|
||
} | ||
|
||
@Override | ||
public void uninstall() { | ||
if (fListener != null) { | ||
textViewer.removeTextInputListener(fListener); | ||
if (document != null) | ||
document.removeDocumentListener(fListener); | ||
fListener = null; | ||
} | ||
this.textViewer = null; | ||
} | ||
|
||
protected void reconcilerDocumentChanged(IDocument document) { | ||
strategy.setDocument(document); | ||
} | ||
|
||
@Override | ||
public IReconcilingStrategy getReconcilingStrategy(String contentType) { | ||
return strategy; | ||
} | ||
|
||
protected void initialProcess() { | ||
if (strategy instanceof IReconcilingStrategyExtension) { | ||
IReconcilingStrategyExtension extension = (IReconcilingStrategyExtension) strategy; | ||
extension.initialReconcile(); | ||
} | ||
} | ||
} |