Maven: filtered properties completion contributor fixed

This commit is contained in:
Anton Makeev
2011-04-01 18:58:30 +02:00
parent 326217b55e
commit 39369df22c
4 changed files with 50 additions and 38 deletions
@@ -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
@@ -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;
}
}
@@ -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) {
@@ -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 {