[FIR IDE] Initial FIR LightClass implementation

This commit is contained in:
Igor Yakovlev
2020-09-22 16:21:30 +03:00
committed by Ilya Kirillov
parent c881cf7af6
commit b742a475ff
38 changed files with 2774 additions and 49 deletions
@@ -550,11 +550,17 @@ fun KtClassOrObject.defaultJavaAncestorQualifiedName(): String? {
}
fun KtClassOrObject.shouldNotBeVisibleAsLightClass(): Boolean {
if (containingFile is KtCodeFragment) {
// Avoid building light classes for code fragments
return true
}
if (parentsWithSelf.filterIsInstance<KtClassOrObject>().any { it.hasExpectModifier() }) {
return true
}
if (safeIsLocal()) {
if (isLocal) {
if (containingFile.virtualFile == null) return true
if (hasParseErrorsAround(this) || PsiUtilCore.hasErrorElementChild(this)) return true
}
@@ -50,9 +50,9 @@ fun PsiReferenceList.addSuperTypeEntry(
}
}
internal fun KtClassOrObject.getExternalDependencies(): List<ModificationTracker> {
fun KtClassOrObject.getExternalDependencies(): List<ModificationTracker> {
return with(KotlinModificationTrackerService.getInstance(project)) {
if (!safeIsLocal()) return listOf(outOfBlockModificationTracker)
if (!this@getExternalDependencies.isLocal) return listOf(outOfBlockModificationTracker)
else when (val file = containingFile) {
is KtFile -> listOf(outOfBlockModificationTracker, fileModificationTracker(file))
else -> listOf(outOfBlockModificationTracker)
@@ -32,13 +32,13 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.types.RawType
internal const val METHOD_INDEX_FOR_GETTER = 1
internal const val METHOD_INDEX_FOR_SETTER = 2
internal const val METHOD_INDEX_FOR_DEFAULT_CTOR = 3
internal const val METHOD_INDEX_FOR_NO_ARG_OVERLOAD_CTOR = 4
internal const val METHOD_INDEX_FOR_NON_ORIGIN_METHOD = 5
internal const val METHOD_INDEX_FOR_SCRIPT_MAIN = 6
internal const val METHOD_INDEX_BASE = 7
const val METHOD_INDEX_FOR_GETTER = 1
const val METHOD_INDEX_FOR_SETTER = 2
const val METHOD_INDEX_FOR_DEFAULT_CTOR = 3
const val METHOD_INDEX_FOR_NO_ARG_OVERLOAD_CTOR = 4
const val METHOD_INDEX_FOR_NON_ORIGIN_METHOD = 5
const val METHOD_INDEX_FOR_SCRIPT_MAIN = 6
const val METHOD_INDEX_BASE = 7
internal abstract class KtUltraLightMethod(
internal val delegate: PsiMethod,
@@ -26,7 +26,6 @@ import com.intellij.psi.util.PsiUtilCore
import com.intellij.util.SmartList
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.isValidJavaFqName
@@ -73,7 +72,7 @@ class JavaElementFinder(
for (declaration in classOrObjectDeclarations) {
if (declaration !is KtEnumEntry) {
val lightClass = declaration.toLightClass()
val lightClass = kotlinAsJavaSupport.getLightClass(declaration)
if (lightClass != null) {
answer.add(lightClass)
}
@@ -90,7 +89,7 @@ class JavaElementFinder(
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
//NOTE: can't filter out more interfaces right away because decompiled declarations do not have member bodies
if (classOrObject is KtClass && classOrObject.isInterface()) {
val interfaceClass = classOrObject.toLightClass() ?: continue
val interfaceClass = kotlinAsJavaSupport.getLightClass(classOrObject) ?: continue
val implsClass = interfaceClass.findInnerClassByName(JvmAbi.DEFAULT_IMPLS_CLASS_NAME, false) ?: continue
answer.add(implsClass)
}
@@ -141,7 +140,7 @@ class JavaElementFinder(
val declarations = kotlinAsJavaSupport.findClassOrObjectDeclarationsInPackage(packageFQN, scope)
for (declaration in declarations) {
val aClass = declaration.toLightClass() ?: continue
val aClass = kotlinAsJavaSupport.getLightClass(declaration) ?: continue
answer.add(aClass)
}