Refactor KotlinJavaPsiFacade.KotlinPsiElementFinderImpl
Split KotlinPsiElementFinderImpl into two classes: one is used in the compiler (boolean field isCliFileManager previously handled that), the other is used in IDE and possibly other non-CLI scenarios. Also avoid a possible class cast exception in KotlinJavaPsiFacade.knownClassNamesInPackage
This commit is contained in:
+53
-42
@@ -44,9 +44,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage;
|
import org.jetbrains.kotlin.idea.KotlinLanguage;
|
||||||
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl;
|
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl;
|
||||||
|
import org.jetbrains.kotlin.name.ClassId;
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
|
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
|
||||||
import org.jetbrains.kotlin.name.ClassId;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -112,8 +112,8 @@ public class KotlinJavaPsiFacade {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (KotlinPsiElementFinderWrapper finder : finders()) {
|
for (KotlinPsiElementFinderWrapper finder : finders()) {
|
||||||
if (finder instanceof KotlinPsiElementFinderImpl) {
|
if (finder instanceof CliFinder) {
|
||||||
PsiClass aClass = ((KotlinPsiElementFinderImpl) finder).findClass(classId, scope);
|
PsiClass aClass = ((CliFinder) finder).findClass(classId, scope);
|
||||||
if (aClass != null) return aClass;
|
if (aClass != null) return aClass;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -152,8 +152,8 @@ public class KotlinJavaPsiFacade {
|
|||||||
public Set<String> knownClassNamesInPackage(@NotNull FqName packageFqName) {
|
public Set<String> knownClassNamesInPackage(@NotNull FqName packageFqName) {
|
||||||
KotlinPsiElementFinderWrapper[] finders = finders();
|
KotlinPsiElementFinderWrapper[] finders = finders();
|
||||||
|
|
||||||
if (finders.length == 1) {
|
if (finders.length == 1 && finders[0] instanceof CliFinder) {
|
||||||
return ((KotlinPsiElementFinderImpl) finders[0]).knownClassNamesInPackage(packageFqName);
|
return ((CliFinder) finders[0]).knownClassNamesInPackage(packageFqName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@@ -197,9 +197,14 @@ public class KotlinJavaPsiFacade {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected KotlinPsiElementFinderWrapper[] calcFinders() {
|
private KotlinPsiElementFinderWrapper[] calcFinders() {
|
||||||
List<KotlinPsiElementFinderWrapper> elementFinders = new ArrayList<KotlinPsiElementFinderWrapper>();
|
List<KotlinPsiElementFinderWrapper> elementFinders = new ArrayList<KotlinPsiElementFinderWrapper>();
|
||||||
elementFinders.add(new KotlinPsiElementFinderImpl(getProject()));
|
JavaFileManager javaFileManager = findJavaFileManager(project);
|
||||||
|
elementFinders.add(
|
||||||
|
javaFileManager instanceof KotlinCliJavaFileManager
|
||||||
|
? new CliFinder((KotlinCliJavaFileManager) javaFileManager)
|
||||||
|
: new NonCliFinder(project, javaFileManager)
|
||||||
|
);
|
||||||
|
|
||||||
List<PsiElementFinder> nonKotlinFinders = ArraysKt.filter(
|
List<PsiElementFinder> nonKotlinFinders = ArraysKt.filter(
|
||||||
getProject().getExtensions(PsiElementFinder.EP_NAME), new Function1<PsiElementFinder, Boolean>() {
|
getProject().getExtensions(PsiElementFinder.EP_NAME), new Function1<PsiElementFinder, Boolean>() {
|
||||||
@@ -220,6 +225,15 @@ public class KotlinJavaPsiFacade {
|
|||||||
return elementFinders.toArray(new KotlinPsiElementFinderWrapper[elementFinders.size()]);
|
return elementFinders.toArray(new KotlinPsiElementFinderWrapper[elementFinders.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static JavaFileManager findJavaFileManager(@NotNull Project project) {
|
||||||
|
JavaFileManager javaFileManager = ServiceManager.getService(project, JavaFileManager.class);
|
||||||
|
if (javaFileManager == null) {
|
||||||
|
throw new IllegalStateException("JavaFileManager component is not found in project");
|
||||||
|
}
|
||||||
|
return javaFileManager;
|
||||||
|
}
|
||||||
|
|
||||||
public PsiPackage findPackage(@NotNull String qualifiedName, GlobalSearchScope searchScope) {
|
public PsiPackage findPackage(@NotNull String qualifiedName, GlobalSearchScope searchScope) {
|
||||||
PackageCache cache = SoftReference.dereference(packageCache);
|
PackageCache cache = SoftReference.dereference(packageCache);
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
@@ -342,59 +356,56 @@ public class KotlinJavaPsiFacade {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class KotlinPsiElementFinderImpl implements KotlinPsiElementFinderWrapper, DumbAware {
|
private static class CliFinder implements KotlinPsiElementFinderWrapper, DumbAware {
|
||||||
private final JavaFileManager javaFileManager;
|
private final KotlinCliJavaFileManager javaFileManager;
|
||||||
private final boolean isCliFileManager;
|
|
||||||
|
|
||||||
private final PsiManager psiManager;
|
public CliFinder(@NotNull KotlinCliJavaFileManager javaFileManager) {
|
||||||
private final PackageIndex packageIndex;
|
this.javaFileManager = javaFileManager;
|
||||||
|
|
||||||
public KotlinPsiElementFinderImpl(Project project) {
|
|
||||||
this.javaFileManager = findJavaFileManager(project);
|
|
||||||
this.isCliFileManager = javaFileManager instanceof KotlinCliJavaFileManager;
|
|
||||||
|
|
||||||
this.packageIndex = PackageIndex.getInstance(project);
|
|
||||||
this.psiManager = PsiManager.getInstance(project);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static JavaFileManager findJavaFileManager(@NotNull Project project) {
|
|
||||||
JavaFileManager javaFileManager = ServiceManager.getService(project, JavaFileManager.class);
|
|
||||||
if (javaFileManager == null) {
|
|
||||||
throw new IllegalStateException("JavaFileManager component is not found in project");
|
|
||||||
}
|
|
||||||
|
|
||||||
return javaFileManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
|
public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
|
||||||
return javaFileManager.findClass(qualifiedName, scope);
|
return javaFileManager.findClass(qualifiedName, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PsiClass findClass(@NotNull ClassId classId, @NotNull GlobalSearchScope scope) {
|
public PsiClass findClass(@NotNull ClassId classId, @NotNull GlobalSearchScope scope) {
|
||||||
if (isCliFileManager) {
|
return javaFileManager.findClass(classId, scope);
|
||||||
return ((KotlinCliJavaFileManager) javaFileManager).findClass(classId, scope);
|
|
||||||
}
|
|
||||||
return findClass(classId.asSingleFqName().asString(), scope);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Set<String> knownClassNamesInPackage(@NotNull FqName packageFqName) {
|
public Set<String> knownClassNamesInPackage(@NotNull FqName packageFqName) {
|
||||||
if (isCliFileManager) {
|
return javaFileManager.knownClassNamesInPackage(packageFqName);
|
||||||
return ((KotlinCliJavaFileManager) javaFileManager).knownClassNamesInPackage(packageFqName);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PsiPackage findPackage(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
|
public PsiPackage findPackage(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
|
||||||
if (isCliFileManager) {
|
return javaFileManager.findPackage(qualifiedName);
|
||||||
return javaFileManager.findPackage(qualifiedName);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSameResultForAnyScope() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class NonCliFinder implements KotlinPsiElementFinderWrapper, DumbAware {
|
||||||
|
private final JavaFileManager javaFileManager;
|
||||||
|
private final PsiManager psiManager;
|
||||||
|
private final PackageIndex packageIndex;
|
||||||
|
|
||||||
|
public NonCliFinder(@NotNull Project project, @NotNull JavaFileManager javaFileManager) {
|
||||||
|
this.javaFileManager = javaFileManager;
|
||||||
|
this.packageIndex = PackageIndex.getInstance(project);
|
||||||
|
this.psiManager = PsiManager.getInstance(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
|
||||||
|
return javaFileManager.findClass(qualifiedName, scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PsiPackage findPackage(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
|
||||||
Query<VirtualFile> dirs = packageIndex.getDirsByPackageName(qualifiedName, true);
|
Query<VirtualFile> dirs = packageIndex.getDirsByPackageName(qualifiedName, true);
|
||||||
return hasDirectoriesInScope(dirs, scope) ? new PsiPackageImpl(psiManager, qualifiedName) : null;
|
return hasDirectoriesInScope(dirs, scope) ? new PsiPackageImpl(psiManager, qualifiedName) : null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user