mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Maven: filtered properties completion contributor fixed
This commit is contained in:
+2
-17
@@ -36,6 +36,7 @@ import com.intellij.util.xml.impl.GenericDomValueReference;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.idea.maven.dom.MavenDomUtil;
|
||||
import org.jetbrains.idea.maven.dom.converters.MavenSmartConverter;
|
||||
import org.jetbrains.idea.maven.dom.references.MavenPropertyCompletionContributor;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@@ -51,23 +52,7 @@ public class MavenSmartCompletionContributor extends CompletionContributor {
|
||||
return getVariants(parameters);
|
||||
}
|
||||
});
|
||||
|
||||
for (Object each : variants) {
|
||||
LookupElement e;
|
||||
if (each instanceof LookupElement) {
|
||||
e = (LookupElement)each;
|
||||
}
|
||||
else if (each instanceof String) {
|
||||
e = LookupElementBuilder.create((String)each);
|
||||
}
|
||||
else if (each instanceof PsiNamedElement) {
|
||||
e = LookupElementBuilder.create((PsiNamedElement)each);
|
||||
}
|
||||
else {
|
||||
e = LookupElementBuilder.create(each, String.valueOf(each));
|
||||
}
|
||||
result.addElement(e);
|
||||
}
|
||||
MavenPropertyCompletionContributor.addVariants(variants, result);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+44
-18
@@ -16,21 +16,26 @@
|
||||
package org.jetbrains.idea.maven.dom.references;
|
||||
|
||||
import com.intellij.codeInsight.completion.CompletionContributor;
|
||||
import com.intellij.codeInsight.completion.CompletionInitializationContext;
|
||||
import com.intellij.codeInsight.completion.CompletionParameters;
|
||||
import com.intellij.codeInsight.completion.CompletionResultSet;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
import org.jetbrains.idea.maven.dom.MavenDomUtil;
|
||||
import org.jetbrains.idea.maven.project.MavenProject;
|
||||
import org.jetbrains.idea.maven.project.MavenProjectsManager;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
public class MavenPropertyCompletionContributor extends CompletionContributor {
|
||||
@Override
|
||||
public void beforeCompletion(@NotNull CompletionInitializationContext context) {
|
||||
Project project = context.getProject();
|
||||
PsiFile psiFile = context.getFile();
|
||||
public void fillCompletionVariants(CompletionParameters parameters, CompletionResultSet result) {
|
||||
PsiFile psiFile = parameters.getOriginalFile();
|
||||
Project project = psiFile.getProject();
|
||||
|
||||
MavenProjectsManager manager = MavenProjectsManager.getInstance(project);
|
||||
if (!manager.isMavenizedProject()) return;
|
||||
@@ -40,24 +45,45 @@ public class MavenPropertyCompletionContributor extends CompletionContributor {
|
||||
|
||||
if (!MavenDomUtil.isMavenFile(psiFile) && !MavenDomUtil.isFilteredResourceFile(psiFile)) return;
|
||||
|
||||
CharSequence text = context.getEditor().getDocument().getCharsSequence();
|
||||
int offset = context.getStartOffset();
|
||||
if (isAfterOpenBrace(text, offset)) {
|
||||
context.setDummyIdentifier(CompletionInitializationContext.DUMMY_IDENTIFIER_TRIMMED + "}");
|
||||
String text = psiFile.getText();
|
||||
int offset = parameters.getOffset();
|
||||
int braceOffset = findOpenBrace(text, offset);
|
||||
if (braceOffset == -1) return;
|
||||
|
||||
TextRange range = TextRange.create(braceOffset, offset);
|
||||
String prefix = range.substring(text);
|
||||
|
||||
MavenFilteredPropertyPsiReference ref = new MavenFilteredPropertyPsiReference(projectFile, psiFile, prefix, range,
|
||||
MavenPropertyPsiReferenceProvider.SOFT_DEFAULT);
|
||||
|
||||
addVariants(Arrays.asList(ref.getVariants()), result.withPrefixMatcher(prefix));
|
||||
}
|
||||
|
||||
public static void addVariants(Collection<?> variants, CompletionResultSet result) {
|
||||
for (Object each : variants) {
|
||||
LookupElement e;
|
||||
if (each instanceof LookupElement) {
|
||||
e = (LookupElement)each;
|
||||
}
|
||||
else if (each instanceof String) {
|
||||
e = LookupElementBuilder.create((String)each);
|
||||
}
|
||||
else if (each instanceof PsiNamedElement) {
|
||||
e = LookupElementBuilder.create((PsiNamedElement)each);
|
||||
}
|
||||
else {
|
||||
e = LookupElementBuilder.create(each, String.valueOf(each));
|
||||
}
|
||||
result.addElement(e);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isAfterOpenBrace(CharSequence text, int offset) {
|
||||
private static int findOpenBrace(CharSequence text, int offset) {
|
||||
for (int i = offset - 1; i > 0; i--) {
|
||||
char c = text.charAt(i);
|
||||
if (c == '{' && text.charAt(i - 1) == '$') return true;
|
||||
if (!Character.isLetterOrDigit(c) && c != '.') return false;
|
||||
if (c == '{' && text.charAt(i - 1) == '$') return i + 1;
|
||||
if (!Character.isLetterOrDigit(c) && c != '.') return -1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fillCompletionVariants(CompletionParameters parameters, CompletionResultSet result) {
|
||||
super.fillCompletionVariants(parameters, result);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -32,6 +32,7 @@ import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
public class MavenPropertyPsiReferenceProvider extends PsiReferenceProvider {
|
||||
public static final boolean SOFT_DEFAULT = false;
|
||||
private final boolean myFiltered;
|
||||
|
||||
public MavenPropertyPsiReferenceProvider(boolean filtered) {
|
||||
@@ -43,9 +44,9 @@ public class MavenPropertyPsiReferenceProvider extends PsiReferenceProvider {
|
||||
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
|
||||
if (myFiltered) {
|
||||
if (!MavenDomUtil.isFilteredResourceFile(element)) return PsiReference.EMPTY_ARRAY;
|
||||
return getReferences(element, element.getText(), 0, true, false);
|
||||
return getReferences(element, element.getText(), 0, true, SOFT_DEFAULT);
|
||||
}
|
||||
return getReferences(element, false);
|
||||
return getReferences(element, SOFT_DEFAULT);
|
||||
}
|
||||
|
||||
public static PsiReference[] getReferences(PsiElement element, boolean isSoft) {
|
||||
|
||||
+1
-1
@@ -873,7 +873,7 @@ public class MavenPropertyCompletionAndResolutionTest extends MavenDomTestCase {
|
||||
|
||||
List<String> variants = getCompletionVariants(myProjectPom);
|
||||
assertContain(variants, "project.groupId");
|
||||
assertDoNotContain(variants, "groupId", "project.name");
|
||||
assertDoNotContain(variants, "project.name");
|
||||
}
|
||||
|
||||
public void testDoNotCompleteAfterNonWordCharacter() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user