Refactor KotlinCliJavaFileManager: make it return JavaClass
It seems to be very natural refactoring considering the following changes: optimizing KotlinCliJavaFileManagerImpl.findClass to make it read class files manually instead of requesting PSI
This commit is contained in:
+9
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+3
-4
@@ -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<String>?
|
||||
}
|
||||
}
|
||||
|
||||
+23
-5
@@ -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<String> 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user