From a9ebb95a4919e06da0222f281cd9bb50c8fb9501 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 16 Jun 2011 17:34:44 +0400 Subject: [PATCH] IDEA-70793 IDEA does not recognize wildcard imports in Java Spring configuration --- .../providers/PatternPackageReferenceSet.java | 50 +++++++++++++++++++ .../impl/providers/PsiPackageReference.java | 41 ++++++++------- 2 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PatternPackageReferenceSet.java diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PatternPackageReferenceSet.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PatternPackageReferenceSet.java new file mode 100644 index 000000000000..3c020f0e92fe --- /dev/null +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PatternPackageReferenceSet.java @@ -0,0 +1,50 @@ +package com.intellij.psi.impl.source.resolve.reference.impl.providers; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiPackage; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.PackageReferenceSet; +import com.intellij.util.PatternUtil; +import com.intellij.util.Processor; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +public class PatternPackageReferenceSet extends PackageReferenceSet { + public PatternPackageReferenceSet(String text, int start, int end, PsiElement element, int startInElement) { + super(text.substring(start, end), element, start + startInElement); + } + + @Override + public Collection resolvePackageName(final PsiPackage context, final String packageName) { + if (packageName.contains("*")) { + final Pattern pattern = PatternUtil.fromMask(packageName); + final Set packages = new HashSet(); + + processSubPackages(context, new Processor() { + @Override + public boolean process(PsiPackage psiPackage) { + String name = psiPackage.getName(); + if (name != null && pattern.matcher(name).matches()) { + packages.add(psiPackage); + } + return true; + } + }); + + return packages; + } + else { + return super.resolvePackageName(context, packageName); + } + } + + protected boolean processSubPackages(final PsiPackage pkg, final Processor processor) { + if (!processor.process(pkg)) return false; + for (final PsiPackage aPackage : pkg.getSubPackages()) { + if (!processSubPackages(aPackage, processor)) return false; + } + return true; + } +} diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PsiPackageReference.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PsiPackageReference.java index 21ee8a63793f..2788a65e323f 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PsiPackageReference.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/PsiPackageReference.java @@ -27,7 +27,7 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; +import java.util.*; public class PsiPackageReference extends PsiPolyVariantReferenceBase implements EmptyResolveMessageProvider { @@ -40,20 +40,28 @@ public class PsiPackageReference extends PsiPolyVariantReferenceBase myIndex = index; } - @Nullable - private PsiPackage getContext() { - return myIndex == 0 ? JavaPsiFacade.getInstance(getElement().getProject()).findPackage("") : - (PsiPackage)myReferenceSet.getReference(myIndex - 1).resolve(); + @NotNull + private Set getContext() { + if (myIndex == 0) return Collections.singleton(JavaPsiFacade.getInstance(getElement().getProject()).findPackage("")); + Set psiPackages = new HashSet(); + for (ResolveResult resolveResult : myReferenceSet.getReference(myIndex - 1).multiResolve(false)) { + PsiElement psiElement = resolveResult.getElement(); + if (psiElement instanceof PsiPackage) { + psiPackages.add((PsiPackage)psiElement); + } + } + ; + return psiPackages; } @NotNull public Object[] getVariants() { - final PsiPackage psiPackage = getContext(); - if (psiPackage == null) return ArrayUtil.EMPTY_OBJECT_ARRAY; - final PsiPackage[] psiPackages = psiPackage.getSubPackages(); - final Object[] variants = new Object[psiPackages.length]; - System.arraycopy(psiPackages, 0, variants, 0, variants.length); - return variants; + Set subPackages = new HashSet(); + for (PsiPackage psiPackage : getContext()) { + subPackages.addAll(Arrays.asList(psiPackage.getSubPackages())); + } + + return subPackages.toArray(); } public String getUnresolvedMessagePattern() { @@ -62,12 +70,11 @@ public class PsiPackageReference extends PsiPolyVariantReferenceBase @NotNull public ResolveResult[] multiResolve(final boolean incompleteCode) { - final PsiPackage parentPackage = getContext(); - if (parentPackage != null) { - final Collection packages = myReferenceSet.resolvePackageName(parentPackage, getValue()); - return PsiElementResolveResult.createResults(packages); + final Collection packages = new HashSet(); + for (PsiPackage parentPackage : getContext()) { + packages.addAll(myReferenceSet.resolvePackageName(parentPackage, getValue())); } - return ResolveResult.EMPTY_ARRAY; + return PsiElementResolveResult.createResults(packages); } @Override @@ -77,7 +84,7 @@ public class PsiPackageReference extends PsiPolyVariantReferenceBase } final String newName = ((PsiPackage)element).getQualifiedName(); final TextRange range = - new TextRange(getReferenceSet().getReference(0).getRangeInElement().getStartOffset(), getRangeInElement().getEndOffset()); + new TextRange(getReferenceSet().getReference(0).getRangeInElement().getStartOffset(), getRangeInElement().getEndOffset()); final ElementManipulator manipulator = ElementManipulators.getManipulator(getElement()); return manipulator.handleContentChange(getElement(), range, newName); }