From 39369df22c9eba2dafc72ae6ca34b4f366abedd1 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Fri, 1 Apr 2011 18:57:36 +0200 Subject: [PATCH] Maven: filtered properties completion contributor fixed --- .../MavenSmartCompletionContributor.java | 19 +----- .../MavenPropertyCompletionContributor.java | 62 +++++++++++++------ .../MavenPropertyPsiReferenceProvider.java | 5 +- ...enPropertyCompletionAndResolutionTest.java | 2 +- 4 files changed, 50 insertions(+), 38 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java index 3983f2b24582..52c2b2616f71 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java @@ -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 diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyCompletionContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyCompletionContributor.java index 2a6e1c96d749..396146253dad 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyCompletionContributor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyCompletionContributor.java @@ -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; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java index afeb8861a07d..e747d920631b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReferenceProvider.java @@ -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) { diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.java index dc9f8e8cd601..4c2680bcf60c 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPropertyCompletionAndResolutionTest.java @@ -873,7 +873,7 @@ public class MavenPropertyCompletionAndResolutionTest extends MavenDomTestCase { List variants = getCompletionVariants(myProjectPom); assertContain(variants, "project.groupId"); - assertDoNotContain(variants, "groupId", "project.name"); + assertDoNotContain(variants, "project.name"); } public void testDoNotCompleteAfterNonWordCharacter() throws Exception {