IDEA-70793 IDEA does not recognize wildcard imports in Java Spring configuration

This commit is contained in:
unknown
2011-06-17 11:12:48 +04:00
parent cc64146d0b
commit a9ebb95a49
2 changed files with 74 additions and 17 deletions
@@ -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<PsiPackage> resolvePackageName(final PsiPackage context, final String packageName) {
if (packageName.contains("*")) {
final Pattern pattern = PatternUtil.fromMask(packageName);
final Set<PsiPackage> packages = new HashSet<PsiPackage>();
processSubPackages(context, new Processor<PsiPackage>() {
@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<PsiPackage> processor) {
if (!processor.process(pkg)) return false;
for (final PsiPackage aPackage : pkg.getSubPackages()) {
if (!processSubPackages(aPackage, processor)) return false;
}
return true;
}
}
@@ -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<PsiElement> implements EmptyResolveMessageProvider {
@@ -40,20 +40,28 @@ public class PsiPackageReference extends PsiPolyVariantReferenceBase<PsiElement>
myIndex = index;
}
@Nullable
private PsiPackage getContext() {
return myIndex == 0 ? JavaPsiFacade.getInstance(getElement().getProject()).findPackage("") :
(PsiPackage)myReferenceSet.getReference(myIndex - 1).resolve();
@NotNull
private Set<PsiPackage> getContext() {
if (myIndex == 0) return Collections.singleton(JavaPsiFacade.getInstance(getElement().getProject()).findPackage(""));
Set<PsiPackage> psiPackages = new HashSet<PsiPackage>();
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<PsiPackage> subPackages = new HashSet<PsiPackage>();
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<PsiElement>
@NotNull
public ResolveResult[] multiResolve(final boolean incompleteCode) {
final PsiPackage parentPackage = getContext();
if (parentPackage != null) {
final Collection<PsiPackage> packages = myReferenceSet.resolvePackageName(parentPackage, getValue());
return PsiElementResolveResult.createResults(packages);
final Collection<PsiPackage> packages = new HashSet<PsiPackage>();
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<PsiElement>
}
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<PsiElement> manipulator = ElementManipulators.getManipulator(getElement());
return manipulator.handleContentChange(getElement(), range, newName);
}