Skip to content

Commit

Permalink
Improve completion
Browse files Browse the repository at this point in the history
  • Loading branch information
angelozerr committed Jun 26, 2023
1 parent 3e86087 commit 8545800
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,11 @@ public class SupportedFeatures {
textDocumentClientCapabilities.setInlayHint(new InlayHintCapabilities());
// TODO : support textDocument/colorPresentation
// textDocumentClientCapabilities.setColorProvider(new ColorProviderCapabilities());
final var completionItemCapabilities = new CompletionItemCapabilities(Boolean.TRUE);
final var completionItemCapabilities = new CompletionItemCapabilities(Boolean.FALSE);
completionItemCapabilities
.setDocumentationFormat(Arrays.asList(MarkupKind.MARKDOWN, MarkupKind.PLAINTEXT));
completionItemCapabilities.setInsertTextModeSupport(new CompletionItemInsertTextModeSupportCapabilities(List.of(InsertTextMode.AsIs, InsertTextMode.AdjustIndentation)));
completionItemCapabilities.setResolveSupport(new CompletionItemResolveSupportCapabilities(List.of("documentation", "detail", "additionalTextEdits"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// completionItemCapabilities.setInsertTextModeSupport(new CompletionItemInsertTextModeSupportCapabilities(List.of(InsertTextMode.AsIs, InsertTextMode.AdjustIndentation)));
// completionItemCapabilities.setResolveSupport(new CompletionItemResolveSupportCapabilities(List.of("documentation", "detail", "additionalTextEdits"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
textDocumentClientCapabilities.setCompletion(new CompletionCapabilities(completionItemCapabilities));
final var definitionCapabilities = new DefinitionCapabilities();
definitionCapabilities.setLinkSupport(Boolean.TRUE);
Expand Down Expand Up @@ -115,11 +115,13 @@ public class SupportedFeatures {
textDocumentClientCapabilities.setOnTypeFormatting(null); // TODO
// TODO : support textDocument/rangeFormatting
// textDocumentClientCapabilities.setRangeFormatting(new RangeFormattingCapabilities());
textDocumentClientCapabilities.setReferences(new ReferencesCapabilities());
final var renameCapabilities = new RenameCapabilities();
renameCapabilities.setPrepareSupport(true);
textDocumentClientCapabilities.setRename(renameCapabilities);
// TODO
// TODO : support textDocument/references
// textDocumentClientCapabilities.setReferences(new ReferencesCapabilities());
// TODO : support textDocument/rename
//final var renameCapabilities = new RenameCapabilities();
//renameCapabilities.setPrepareSupport(true);
//textDocumentClientCapabilities.setRename(renameCapabilities);
// TODO : support textDocument/signatureHelp
// textDocumentClientCapabilities.setSignatureHelp(new SignatureHelpCapabilities());
textDocumentClientCapabilities
.setSynchronization(new SynchronizationCapabilities(Boolean.TRUE, Boolean.TRUE, Boolean.TRUE));
Expand Down Expand Up @@ -151,9 +153,9 @@ public class SupportedFeatures {

public static WindowClientCapabilities getWindowClientCapabilities() {
final var windowClientCapabilities = new WindowClientCapabilities();
windowClientCapabilities.setShowDocument(new ShowDocumentCapabilities(true));
windowClientCapabilities.setWorkDoneProgress(true);
windowClientCapabilities.setShowMessage(new WindowShowMessageRequestCapabilities());
//windowClientCapabilities.setShowDocument(new ShowDocumentCapabilities(true));
//windowClientCapabilities.setWorkDoneProgress(true);
//windowClientCapabilities.setShowMessage(new WindowShowMessageRequestCapabilities());
return windowClientCapabilities;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.redhat.devtools.intellij.lsp4ij.operations.completion;

import com.intellij.codeInsight.completion.CompletionConfidence;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.ThreeState;
import org.jetbrains.annotations.NotNull;

public class LSPCompletionConfidence extends CompletionConfidence {

@Override
public @NotNull ThreeState shouldSkipAutopopup(@NotNull PsiElement contextElement, @NotNull PsiFile psiFile, int offset) {
return ThreeState.NO;
}
}
152 changes: 106 additions & 46 deletions src/main/java/com/redhat/devtools/intellij/qute/lang/QuteLexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,89 +10,149 @@
******************************************************************************/
package com.redhat.devtools.intellij.qute.lang;

import com.intellij.lexer.Lexer;
import com.intellij.lexer.LexerPosition;
import com.intellij.lexer.LexerBase;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.psi.tree.IElementType;
import com.redhat.qute.parser.template.Node;
import com.redhat.qute.parser.template.Template;
import com.redhat.qute.parser.template.TemplateParser;
import com.redhat.qute.parser.template.scanner.ScannerState;
import com.redhat.qute.parser.template.scanner.TemplateScanner;
import com.redhat.qute.parser.template.scanner.TokenType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class QuteLexer extends Lexer {
Template template;
private CharSequence buffer;
private int endOffset;
public class QuteLexer extends LexerBase {

private int index;
private IElementType myTokenType;
private CharSequence myText;

private int myTokenStart;
private int myTokenEnd;

private int myBufferEnd;
private int myState;

private boolean myFailed;


private TemplateScanner scanner;

@Override
public void start(@NotNull CharSequence buffer, int startOffset, int endOffset, int initialState) {
this.buffer = buffer;
this.endOffset = endOffset;
template = TemplateParser.parse(buffer.subSequence(startOffset, endOffset).toString(), "");
this.index = initialState;
myText = buffer;
myTokenStart = myTokenEnd = startOffset;
myBufferEnd = endOffset;
//myFlex.reset(myText, startOffset, endOffset, initialState);
scanner = (TemplateScanner) TemplateScanner.createScanner(buffer.subSequence(startOffset,endOffset).toString(), 0);
myTokenType = null;
}


@Override
public int getState() {
return index;
locateToken();
return myState;
}

private Node getToken() {
return index< template.getChildCount()?template.getChild(index):null;
}
@Override
public @Nullable IElementType getTokenType() {
Node node = getToken();
return node!=null?QuteElementTypes.fromNode(node):null;
public IElementType getTokenType() {
locateToken();
return myTokenType;
}

@Override
public int getTokenStart() {
Node node = getToken();
return node!=null?node.getStart():-1;
locateToken();
return myTokenStart;
}

@Override
public int getTokenEnd() {
Node node = getToken();
return node!=null?node.getEnd():-1;

locateToken();
return myTokenEnd;
}

@Override
public void advance() {
++index;
locateToken();
myTokenType = null;
}

@NotNull
@Override
public @NotNull LexerPosition getCurrentPosition() {
return new LexerPosition() {
@Override
public int getOffset() {
return getTokenStart();
}
public CharSequence getBufferSequence() {
return myText;
}

@Override
public int getState() {
return getState();
@Override
public int getBufferEnd() {
return myBufferEnd;
}

protected void locateToken() {
if (myTokenType != null) return;

myTokenStart = myTokenEnd;
if (myFailed) return;

try {
TokenType tokenType = scanner.scan();
while(tokenType != TokenType.EOS) {
IElementType elementType = getTokenType(tokenType);
if(elementType != null) {
myState = getStateAsInt(scanner.getScannerState());
myTokenType = elementType;
myTokenEnd = scanner.getTokenEnd();
break;
}
tokenType = scanner.scan();
}
};
}
catch (ProcessCanceledException e) {
throw e;
}
catch (Throwable e) {
myFailed = true;
myTokenType = com.intellij.psi.TokenType.BAD_CHARACTER;
myTokenEnd = myBufferEnd;
//LOG.warn(myFlex.getClass().getName(), e);
}
}

@Override
public void restore(@NotNull LexerPosition position) {
index = position.getState();
private static IElementType getTokenType(TokenType tokenType) {
switch(tokenType) {
case StartParameterDeclaration:
return QuteTokenType.QUTE_START_PARAMETER_DECLARATION;
case EndParameterDeclaration:
return QuteTokenType.QUTE_END_PARAMETER_DECLARATION;
case StartExpression:
return QuteTokenType.QUTE_START_EXPRESSION;
case EndExpression:
return QuteTokenType.QUTE_END_EXPRESSION;
case StartTagOpen:
return QuteTokenType.QUTE_START_TAG_OPEN;
case StartTag:
return QuteTokenType.QUTE_START_TAG;
case EndTag:
return QuteTokenType.QUTE_END_TAG;
case EndTagSelfClose:
return QuteTokenType.QUTE_END_TAG_SELF_CLOSE;
case EndTagOpen:
return QuteTokenType.QUTE_END_TAG_OPEN;
case EndTagClose:
return QuteTokenType.QUTE_END_TAG_CLOSE;
case Whitespace:
return QuteTokenType.QUTE_WHITESPACE;
case ParameterTag:
return QuteTokenType.QUTE_PARAMETER_TAG;
}
return QuteElementTypes.QUTE_CONTENT;
}

@Override
public @NotNull CharSequence getBufferSequence() {
return buffer;
private static int getStateAsInt(ScannerState state) {
return state.ordinal();
}

@Override
public int getBufferEnd() {
return endOffset;
public String toString() {
return "QuteLexer for " + scanner.getClass().getName();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.redhat.devtools.intellij.qute.lang;

import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.xml.IXmlLeafElementType;

public interface QuteTokenType {

IElementType QUTE_CONTENT = new IXmlLeafElementType("QUTE_CONTENT");

IElementType QUTE_START_PARAMETER_DECLARATION = new QuteElementType("QUTE_START_PARAMETER_DECLARATION");

IElementType QUTE_END_PARAMETER_DECLARATION = new QuteElementType("QUTE_END_PARAMETER_DECLARATION");

IElementType QUTE_START_EXPRESSION = new QuteElementType("QUTE_START_EXPRESSION");

IElementType QUTE_END_EXPRESSION = new QuteElementType("QUTE_END_EXPRESSION");

IElementType QUTE_START_TAG = new QuteElementType("QUTE_START_TAG");
IElementType QUTE_END_TAG = new QuteElementType("QUTE_END_TAG");
IElementType QUTE_END_TAG_SELF_CLOSE = new QuteElementType("QUTE_END_TAG_SELF_CLOSE");
IElementType QUTE_END_TAG_OPEN = new QuteElementType("QUTE_END_TAG_OPEN");
IElementType QUTE_END_TAG_CLOSE = new QuteElementType("QUTE_END_TAG_CLOSE");
IElementType QUTE_START_TAG_OPEN = new QuteElementType("QUTE_START_TAG_OPEN");
IElementType QUTE_WHITESPACE = new QuteElementType("QUTE_WHITESPACE");
IElementType QUTE_PARAMETER_TAG = new QuteElementType("QUTE_PARAMETER_TAG");
}
1 change: 1 addition & 0 deletions src/main/resources/META-INF/lsp4ij-qute.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
implementationClass="com.redhat.devtools.intellij.lsp4ij.operations.diagnostics.LSPDiagnosticAnnotator"/>
<externalAnnotator language="Qute_"
implementationClass="com.redhat.devtools.intellij.lsp4ij.operations.documentLink.LSPDocumentLinkAnnotator"/>
<completion.confidence language="HTML" order="before htmlText" implementationClass="com.redhat.devtools.intellij.lsp4ij.operations.completion.LSPCompletionConfidence" />
</extensions>

</idea-plugin>

0 comments on commit 8545800

Please sign in to comment.