diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt index 20297299f56..90db7b65fa5 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt @@ -26,6 +26,8 @@ import com.intellij.psi.search.GlobalSearchScope import gnu.trove.THashMap import org.jetbrains.kotlin.cli.jvm.index.JavaRoot import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndex +import org.jetbrains.kotlin.load.java.structure.JavaClass +import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.jvm.KotlinCliJavaFileManager @@ -45,7 +47,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ this.index = packagesCache } - override fun findClass(classId: ClassId, searchScope: GlobalSearchScope): PsiClass? = perfCounter.time { + private fun findPsiClass(classId: ClassId, searchScope: GlobalSearchScope): PsiClass? = perfCounter.time { findVirtualFileForTopLevelClass(classId, searchScope)?.findPsiClassInVirtualFile(classId.relativeClassName.asString()) } @@ -58,6 +60,11 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ }?.takeIf { it in searchScope } } + override fun findClass(classId: ClassId, searchScope: GlobalSearchScope): JavaClass? { + val virtualFile = findVirtualFileForTopLevelClass(classId, searchScope) ?: return null + return virtualFile.findPsiClassInVirtualFile(classId.relativeClassName.asString())?.let(::JavaClassImpl) + } + // this method is called from IDEA to resolve dependencies in Java code // which supposedly shouldn't have errors so the dependencies exist in general override fun findClass(qName: String, scope: GlobalSearchScope): PsiClass? { @@ -68,7 +75,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ // "a.b.c", and so on, until we find something. Most classes are top level, so most of the times the search ends quickly forEachClassId(qName) { classId -> - findClass(classId, scope)?.let { return it } + findPsiClass(classId, scope)?.let { return it } } return null diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java index 576db7fa1ec..24759c1ca21 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java @@ -18,17 +18,14 @@ package org.jetbrains.kotlin.load.java; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiClass; import com.intellij.psi.PsiPackage; import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.asJava.KtLightClassMarker; import org.jetbrains.kotlin.idea.KotlinFileType; import org.jetbrains.kotlin.load.java.structure.JavaClass; import org.jetbrains.kotlin.load.java.structure.JavaPackage; -import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl; import org.jetbrains.kotlin.load.java.structure.impl.JavaPackageImpl; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; @@ -95,20 +92,7 @@ public class JavaClassFinderImpl implements JavaClassFinder { @Nullable @Override public JavaClass findClass(@NotNull ClassId classId) { - PsiClass psiClass = javaFacade.findClass(classId, javaSearchScope); - if (psiClass == null) return null; - - JavaClassImpl javaClass = new JavaClassImpl(psiClass); - FqName fqName = classId.asSingleFqName(); - if (!fqName.equals(javaClass.getFqName())) { - throw new IllegalStateException("Requested " + fqName + ", got " + javaClass.getFqName()); - } - - if (psiClass instanceof KtLightClassMarker) { - throw new IllegalStateException("Kotlin light classes should not be found by JavaPsiFacade, resolving: " + fqName); - } - - return javaClass; + return javaFacade.findClass(classId, javaSearchScope); } @Nullable diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt index 6a35c96fc56..f3fbc80fc0e 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt @@ -16,14 +16,13 @@ package org.jetbrains.kotlin.resolve.jvm -import com.intellij.psi.PsiClass import com.intellij.psi.impl.file.impl.JavaFileManager import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName interface KotlinCliJavaFileManager : JavaFileManager { - fun findClass(classId: ClassId, searchScope: GlobalSearchScope): PsiClass? - + fun findClass(classId: ClassId, searchScope: GlobalSearchScope): JavaClass? fun knownClassNamesInPackage(packageFqName: FqName): Set? -} \ No newline at end of file +} 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 f4531859f52..6d4716c776b 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 @@ -41,8 +41,11 @@ import kotlin.collections.ArraysKt; import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.asJava.KtLightClassMarker; import org.jetbrains.kotlin.idea.KotlinLanguage; import org.jetbrains.kotlin.load.java.JavaClassFinderImpl; +import org.jetbrains.kotlin.load.java.structure.JavaClass; +import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; @@ -97,7 +100,7 @@ public class KotlinJavaPsiFacade { return emptyModifierList; } - public PsiClass findClass(@NotNull ClassId classId, @NotNull GlobalSearchScope scope) { + public JavaClass findClass(@NotNull ClassId classId, @NotNull GlobalSearchScope scope) { ProgressIndicatorAndCompilationCanceledStatus.checkCanceled(); // We hope this method is being called often enough to cancel daemon processes smoothly String qualifiedName = classId.asSingleFqName().asString(); @@ -105,14 +108,14 @@ public class KotlinJavaPsiFacade { if (shouldUseSlowResolve()) { PsiClass[] classes = findClassesInDumbMode(qualifiedName, scope); if (classes.length != 0) { - return classes[0]; + return createJavaClass(classId, classes[0]); } return null; } for (KotlinPsiElementFinderWrapper finder : finders()) { if (finder instanceof CliFinder) { - PsiClass aClass = ((CliFinder) finder).findClass(classId, scope); + JavaClass aClass = ((CliFinder) finder).findClass(classId, scope); if (aClass != null) return aClass; } else { @@ -139,7 +142,7 @@ public class KotlinJavaPsiFacade { } } - return aClass; + return createJavaClass(classId, aClass); } } } @@ -147,6 +150,21 @@ public class KotlinJavaPsiFacade { return null; } + @NotNull + private static JavaClass createJavaClass(@NotNull ClassId classId, @NotNull PsiClass psiClass) { + JavaClassImpl javaClass = new JavaClassImpl(psiClass); + FqName fqName = classId.asSingleFqName(); + if (!fqName.equals(javaClass.getFqName())) { + throw new IllegalStateException("Requested " + fqName + ", got " + javaClass.getFqName()); + } + + if (psiClass instanceof KtLightClassMarker) { + throw new IllegalStateException("Kotlin light classes should not be found by JavaPsiFacade, resolving: " + fqName); + } + + return javaClass; + } + @Nullable public Set knownClassNamesInPackage(@NotNull FqName packageFqName) { KotlinPsiElementFinderWrapper[] finders = finders(); @@ -361,7 +379,7 @@ public class KotlinJavaPsiFacade { return javaFileManager.findClass(qualifiedName, scope); } - public PsiClass findClass(@NotNull ClassId classId, @NotNull GlobalSearchScope scope) { + public JavaClass findClass(@NotNull ClassId classId, @NotNull GlobalSearchScope scope) { return javaFileManager.findClass(classId, scope); } diff --git a/compiler/tests/org/jetbrains/kotlin/cli/jvm/KotlinCliJavaFileManagerTest.kt b/compiler/tests/org/jetbrains/kotlin/cli/jvm/KotlinCliJavaFileManagerTest.kt index bb469ab6ec1..b6a1330356d 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/jvm/KotlinCliJavaFileManagerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/cli/jvm/KotlinCliJavaFileManagerTest.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot import org.jetbrains.kotlin.cli.jvm.index.JavaRoot import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndexImpl +import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -210,7 +211,7 @@ class KotlinCliJavaFileManagerTest : KotlinTestWithEnvironment() { val classId = ClassId(FqName(packageFQName), FqName(classFqName), false) val stringRequest = classId.asSingleFqName().asString() - val foundByClassId = manager.findClass(classId, allScope) + val foundByClassId = (manager.findClass(classId, allScope) as JavaClassImpl).psi val foundByString = manager.findClass(stringRequest, allScope) TestCase.assertNotNull("Could not find: $classId", foundByClassId)