This is an automated email from the ASF dual-hosted git repository.
skygo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 468757d [NETBEANS-3749][NETBEANS-3757]: fixing behavior of LSP-based
code completion w.r.t. trigger characters and printing text
new 5b7ae9e Merge pull request #1902 from
jlahoda/lsp-completion-fixes-jan-2020
468757d is described below
commit 468757dfa0cfac4fb92b60fce368dfbd2d903b8f
Author: Jan Lahoda <[email protected]>
AuthorDate: Tue Jan 28 07:25:42 2020 +0100
[NETBEANS-3749][NETBEANS-3757]: fixing behavior of LSP-based code
completion w.r.t. trigger characters and printing text
---
.../client/bindings/CompletionProviderImpl.java | 75 ++++++++++++++++------
1 file changed, 55 insertions(+), 20 deletions(-)
diff --git
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
index 3161c6a..e2c25d7 100644
---
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
+++
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
@@ -25,6 +25,7 @@ import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.net.URL;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
@@ -41,6 +42,7 @@ import org.eclipse.lsp4j.CompletionItemKind;
import org.eclipse.lsp4j.CompletionList;
import org.eclipse.lsp4j.CompletionOptions;
import org.eclipse.lsp4j.CompletionParams;
+import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.MarkupContent;
import org.eclipse.lsp4j.ParameterInformation;
import org.eclipse.lsp4j.ServerCapabilities;
@@ -50,6 +52,7 @@ import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.eclipse.lsp4j.TextDocumentPositionParams;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.netbeans.api.editor.completion.Completion;
import org.netbeans.api.editor.mimelookup.MimeRegistration;
import org.netbeans.editor.BaseDocument;
import org.netbeans.editor.Utilities;
@@ -184,36 +187,51 @@ public class CompletionProviderImpl implements
CompletionProvider {
resultSet.addItem(new
org.netbeans.spi.editor.completion.CompletionItem() {
@Override
public void defaultAction(JTextComponent jtc) {
- Document doc = jtc.getDocument();
+ commit("");
+ }
+ private void commit(String appendText) {
TextEdit te = i.getTextEdit();
- if (te != null) {
- int start = Utils.getOffset(doc,
te.getRange().getStart());
- int end = Utils.getOffset(doc,
te.getRange().getEnd());
- NbDocument.runAtomic((StyledDocument) doc,
() -> {
- try {
+ NbDocument.runAtomic((StyledDocument) doc, ()
-> {
+ try {
+ int endPos;
+ if (te != null) {
+ int start = Utils.getOffset(doc,
te.getRange().getStart());
+ int end = Utils.getOffset(doc,
te.getRange().getEnd());
doc.remove(start, end - start);
doc.insertString(start,
te.getNewText(), null);
- } catch (BadLocationException ex) {
- Exceptions.printStackTrace(ex);
+ endPos = start +
te.getNewText().length();
+ } else {
+ String toAdd = i.getInsertText();
+ if (toAdd == null) {
+ toAdd = i.getLabel();
+ }
+ int[] identSpan =
Utilities.getIdentifierBlock((BaseDocument) doc, caretOffset);
+ String printSuffix =
toAdd.substring(identSpan != null ? caretOffset - identSpan[0] : 0);
+ doc.insertString(caretOffset,
printSuffix, null);
+ endPos = caretOffset +
printSuffix.length();
}
- });
- } else {
- String toAdd = i.getInsertText();
- if (toAdd == null) {
- toAdd = i.getLabel();
- }
- try {
- int offset = jtc.getCaretPosition();
- String ident =
Utilities.getIdentifier((BaseDocument) doc, offset);
- doc.insertString(offset,
toAdd.substring(ident != null ? ident.length() : 0), null);
+ doc.insertString(endPos, appendText,
null);
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
- }
+ });
+ Completion.get().hideDocumentation();
+ Completion.get().hideCompletion();
}
@Override
public void processKeyEvent(KeyEvent ke) {
+ if (ke.getID() == KeyEvent.KEY_TYPED) {
+ String commitText =
String.valueOf(ke.getKeyChar());
+
+ if
(i.getCommitCharacters().contains(commitText)) {
+ commit(commitText);
+ ke.consume();
+ if (isTriggerCharacter(server,
commitText)) {
+ Completion.get().showCompletion();
+ }
+ }
+ }
}
@Override
@@ -352,7 +370,24 @@ public class CompletionProviderImpl implements
CompletionProvider {
@Override
public int getAutoQueryTypes(JTextComponent component, String typedText) {
- return 0; //TODO: implement trigger characters, if any?
+ FileObject file =
NbEditorUtilities.getFileObject(component.getDocument());
+ if (file == null) {
+ return 0;
+ }
+ LSPBindings server = LSPBindings.getBindings(file);
+ if (server == null) {
+ return 0;
+ }
+ return isTriggerCharacter(server, typedText) ? COMPLETION_QUERY_TYPE :
0;
}
+ private boolean isTriggerCharacter(LSPBindings server, String text) {
+ InitializeResult init = server.getInitResult();
+ if (init == null) return false;
+ ServerCapabilities capabilities = init.getCapabilities();
+ if (capabilities == null) return false;
+ CompletionOptions completionOptions =
capabilities.getCompletionProvider();
+ if (completionOptions == null) return false;
+ return
completionOptions.getTriggerCharacters().stream().anyMatch(trigger ->
text.endsWith(trigger));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists