mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-70793 IDEA does not recognize wildcard imports in Java Spring configuration
This commit is contained in:
+50
@@ -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;
|
||||
}
|
||||
}
|
||||
+24
-17
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user