Skip to content

Commit

Permalink
Improve completion
Browse files Browse the repository at this point in the history
Signed-off-by: azerr <[email protected]>
  • Loading branch information
angelozerr committed Jul 2, 2023
1 parent 561ae2d commit 932a89f
Show file tree
Hide file tree
Showing 25 changed files with 684 additions and 153 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
package com.redhat.devtools.intellij.qute.lang;

import com.intellij.psi.impl.source.tree.CompositeElement;
import com.intellij.psi.impl.source.tree.LeafPsiElement;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.templateLanguages.OuterLanguageElementImpl;
import com.redhat.devtools.intellij.qute.lang.psi.tree.QuteElementTypes;
import com.redhat.qute.parser.template.ASTVisitor;
import com.redhat.qute.parser.template.Node;
import com.redhat.qute.parser.template.NodeKind;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
Expand All @@ -29,19 +31,26 @@ public QuteASTNode(Node node) {
int end = node.getStart();
for(Node child : getChildren(node)) {
if (end != -1 && end < child.getStart()) {
rawAddChildrenWithoutNotifications(new LeafPsiElement(QuteElementTypes.QUTE_TEXT, child.getOwnerTemplate().getText(end, child.getStart())));
rawAddChildrenWithoutNotifications(new QuteToken(QuteElementTypes.QUTE_TEXT, child.getOwnerTemplate().getText(end, child.getStart())));
}
rawAddChildrenWithoutNotifications(getNode(child));
end = child.getEnd();
}
if (end < node.getEnd()) {
rawAddChildrenWithoutNotifications(new LeafPsiElement(QuteElementTypes.QUTE_CONTENT, node.getOwnerTemplate().getText(end, node.getEnd())));
rawAddChildrenWithoutNotifications(new QuteToken(QuteElementTypes.QUTE_CONTENT, node.getOwnerTemplate().getText(end, node.getEnd())));
}
}

@NotNull
public static TreeElement getNode(Node child) {
return getChildren(child).isEmpty()?new LeafPsiElement(QuteElementTypes.fromNode(child), child.getOwnerTemplate().getText(child.getStart(), child.getEnd())):new QuteASTNode(child);
if (child.getKind() == NodeKind.Text) {
return new OuterLanguageElementImpl(QuteElementTypes.fromNode(child), child.getOwnerTemplate().getText(child.getStart(), child.getEnd()));
}
if (child.getKind() == NodeKind.ExpressionPart) {

}
return getChildren(child).isEmpty()?new QuteToken(QuteElementTypes.fromNode(child), child.getOwnerTemplate().getText(child.getStart(), child.getEnd()))
:new QuteASTNode(child);
}

private static List<Node> getChildren(Node node) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,13 @@

import javax.swing.Icon;

/**
* Qute language file type.
*/
public class QuteFileType extends LanguageFileType {
private static final Icon QUARKUS_ICON = IconLoader.findIcon("/quarkus_icon_rgb_16px_default.png", QuarkusIconProvider.class);

@NotNull
public static final QuteFileType QUTE = new QuteFileType();

private QuteFileType() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,51 @@
import com.intellij.lang.Language;
import com.intellij.lang.LanguageParserDefinitions;
import com.intellij.lang.ParserDefinition;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.LanguageFileType;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.MultiplePsiFilesPerDocumentFileViewProvider;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider;
import com.intellij.psi.tree.IElementType;
import com.redhat.devtools.intellij.qute.lang.psi.tree.QuteElementTypes;
import org.jetbrains.annotations.NotNull;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

/**
* Qute file view provider.
*/
public class QuteFileViewProvider extends MultiplePsiFilesPerDocumentFileViewProvider implements TemplateLanguageFileViewProvider {
private final Language language;
private final Language templateLanguage;

public QuteFileViewProvider(VirtualFile file, Language language, Language templateLanguage, PsiManager manager, boolean eventSystemEnabled) {
public QuteFileViewProvider(VirtualFile file, Language language, PsiManager manager, boolean eventSystemEnabled) {
this(file, language, getTemplateLanguage(file), manager, eventSystemEnabled);
}

private QuteFileViewProvider(VirtualFile file, Language language, Language templateLanguage, PsiManager manager, boolean eventSystemEnabled) {
super(manager, file, eventSystemEnabled);
this.language = language;
this.templateLanguage = templateLanguage;
}

/**
* Returns the template language of the given file (ex : "HTML", "YAML", language etc) and the "Qute_" language otherwise.
*
* @param file the virtual file.
*
* @return the template language of the given file (ex : "HTML", "YAML", language etc) and the "Qute_" language otherwise.
*/
public static Language getTemplateLanguage(VirtualFile file) {
FileType fileType = FileTypeManager.getInstance().getFileTypeByExtension(file.getExtension());
return fileType instanceof LanguageFileType ? ((LanguageFileType) fileType).getLanguage() : QuteLanguage.INSTANCE;
}

protected PsiFile createFile(@NotNull Language lang) {
if (lang == getTemplateDataLanguage()) {
final ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(lang);
Expand All @@ -58,8 +80,8 @@ protected PsiFile createFile(@NotNull Language lang) {
@Override
public @NotNull Set<Language> getLanguages() {
Set<Language> languages = new LinkedHashSet<>();
languages.add(getTemplateDataLanguage());
languages.add(getBaseLanguage());
languages.add(getTemplateDataLanguage());
return languages;
}

Expand All @@ -70,7 +92,7 @@ protected PsiFile createFile(@NotNull Language lang) {

@Override
public IElementType getContentElementType(@NotNull Language language) {
return language == getTemplateDataLanguage()?QuteElementTypes.QUTE_FILE_DATA:null;
return language == getTemplateDataLanguage() ? QuteElementTypes.QUTE_FILE_DATA : null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,18 @@
package com.redhat.devtools.intellij.qute.lang;

import com.intellij.lang.Language;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.LanguageFileType;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.FileViewProviderFactory;
import com.intellij.psi.PsiManager;
import org.jetbrains.annotations.NotNull;

/**
* Qute file view provider factory.
*/
public class QuteFileViewProviderFactory implements FileViewProviderFactory {
@Override
public @NotNull FileViewProvider createFileViewProvider(@NotNull VirtualFile file, Language language, @NotNull PsiManager manager, boolean eventSystemEnabled) {
FileType fileType = FileTypeManager.getInstance().getFileTypeByExtension(file.getExtension());
return new QuteFileViewProvider(file, language, fileType instanceof LanguageFileType?((LanguageFileType) fileType).getLanguage():language, manager, eventSystemEnabled);
return new QuteFileViewProvider(file, language, manager, eventSystemEnabled);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@
import com.intellij.psi.templateLanguages.TemplateLanguage;
import org.jetbrains.annotations.NotNull;

/**
* Qute language.
*/
public class QuteLanguage extends Language implements TemplateLanguage, InjectableLanguage {

@NotNull
public static final QuteLanguage INSTANCE = new QuteLanguage();

private QuteLanguage() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
package com.redhat.devtools.intellij.qute.lang;

import com.intellij.lang.Language;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
Expand All @@ -27,7 +25,13 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;


/**
* Qute language substitutor to force some language file (ex:HTML, YAML, etc) to "_Qute" language when:
* <ul>
* <li>the HTML, YAML, etc file is hosted in a Qute project.</li>
* <li>the HTML, YAML, etc file is hosted in the src/main/resources/templates folder.</li>
* </ul>
*/
public class QuteLanguageSubstitutor extends LanguageSubstitutor {
protected boolean isTemplate(VirtualFile file, Module module) {
return file.getPath().contains("templates") && ModuleRootManager.getInstance(module).getFileIndex().isInSourceContent(file);
Expand All @@ -51,8 +55,8 @@ public static boolean isQuteLibrary(@NotNull LibraryOrderEntry libraryOrderEntry
}

private Module findModule(VirtualFile file) {
for(Project project : ProjectManager.getInstance().getOpenProjects()) {
for(Module module : ModuleManager.getInstance(project).getModules()) {
for (Project project : ProjectManager.getInstance().getOpenProjects()) {
for (Module module : ModuleManager.getInstance(project).getModules()) {
if (ModuleUtilCore.moduleContainsFile(module, file, false)) {
return module;
}
Expand Down

This file was deleted.

Loading

0 comments on commit 932a89f

Please sign in to comment.