diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java index 1cdcc89d34d..2773b7f9923 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java @@ -44,9 +44,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.KotlinLanguage; import org.jetbrains.kotlin.load.java.JavaClassFinderImpl; +import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; -import org.jetbrains.kotlin.name.ClassId; import java.util.ArrayList; import java.util.Arrays; @@ -112,8 +112,8 @@ public class KotlinJavaPsiFacade { } for (KotlinPsiElementFinderWrapper finder : finders()) { - if (finder instanceof KotlinPsiElementFinderImpl) { - PsiClass aClass = ((KotlinPsiElementFinderImpl) finder).findClass(classId, scope); + if (finder instanceof CliFinder) { + PsiClass aClass = ((CliFinder) finder).findClass(classId, scope); if (aClass != null) return aClass; } else { @@ -152,8 +152,8 @@ public class KotlinJavaPsiFacade { public Set knownClassNamesInPackage(@NotNull FqName packageFqName) { KotlinPsiElementFinderWrapper[] finders = finders(); - if (finders.length == 1) { - return ((KotlinPsiElementFinderImpl) finders[0]).knownClassNamesInPackage(packageFqName); + if (finders.length == 1 && finders[0] instanceof CliFinder) { + return ((CliFinder) finders[0]).knownClassNamesInPackage(packageFqName); } return null; @@ -197,9 +197,14 @@ public class KotlinJavaPsiFacade { } @NotNull - protected KotlinPsiElementFinderWrapper[] calcFinders() { + private KotlinPsiElementFinderWrapper[] calcFinders() { List elementFinders = new ArrayList(); - elementFinders.add(new KotlinPsiElementFinderImpl(getProject())); + JavaFileManager javaFileManager = findJavaFileManager(project); + elementFinders.add( + javaFileManager instanceof KotlinCliJavaFileManager + ? new CliFinder((KotlinCliJavaFileManager) javaFileManager) + : new NonCliFinder(project, javaFileManager) + ); List nonKotlinFinders = ArraysKt.filter( getProject().getExtensions(PsiElementFinder.EP_NAME), new Function1() { @@ -220,6 +225,15 @@ public class KotlinJavaPsiFacade { 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) { PackageCache cache = SoftReference.dereference(packageCache); if (cache == null) { @@ -342,59 +356,56 @@ public class KotlinJavaPsiFacade { } } - static class KotlinPsiElementFinderImpl implements KotlinPsiElementFinderWrapper, DumbAware { - private final JavaFileManager javaFileManager; - private final boolean isCliFileManager; + private static class CliFinder implements KotlinPsiElementFinderWrapper, DumbAware { + private final KotlinCliJavaFileManager javaFileManager; - private final PsiManager psiManager; - private final PackageIndex packageIndex; - - public KotlinPsiElementFinderImpl(Project project) { - this.javaFileManager = findJavaFileManager(project); - this.isCliFileManager = javaFileManager instanceof KotlinCliJavaFileManager; - - this.packageIndex = PackageIndex.getInstance(project); - this.psiManager = PsiManager.getInstance(project); + public CliFinder(@NotNull KotlinCliJavaFileManager javaFileManager) { + this.javaFileManager = javaFileManager; } - @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 public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { return javaFileManager.findClass(qualifiedName, scope); } public PsiClass findClass(@NotNull ClassId classId, @NotNull GlobalSearchScope scope) { - if (isCliFileManager) { - return ((KotlinCliJavaFileManager) javaFileManager).findClass(classId, scope); - } - return findClass(classId.asSingleFqName().asString(), scope); + return javaFileManager.findClass(classId, scope); } @Nullable public Set knownClassNamesInPackage(@NotNull FqName packageFqName) { - if (isCliFileManager) { - return ((KotlinCliJavaFileManager) javaFileManager).knownClassNamesInPackage(packageFqName); - } - - return null; + return javaFileManager.knownClassNamesInPackage(packageFqName); } @Override 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 dirs = packageIndex.getDirsByPackageName(qualifiedName, true); return hasDirectoriesInScope(dirs, scope) ? new PsiPackageImpl(psiManager, qualifiedName) : null; }