FIR LC: populate DefaultImpls if an interface has default implementations

This commit is contained in:
Jinseong Jeon
2021-12-07 15:43:54 -08:00
committed by Ilya Kirillov
parent b52dc15aa7
commit f8a6ab9536
8 changed files with 79 additions and 12 deletions
@@ -47,4 +47,4 @@ class KtFe10AnalysisSession(val analysisContext: Fe10AnalysisContext) : KtAnalys
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession {
return KtFe10AnalysisSession(elementToReanalyze, token)
}
}
}
@@ -6,10 +6,8 @@
package org.jetbrains.kotlin.analysis.api.fir
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.assertIsValidAndAccessible
import org.jetbrains.kotlin.analysis.api.components.*
import org.jetbrains.kotlin.analysis.api.fir.components.*
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirOverrideInfoProvider
@@ -88,7 +88,7 @@ internal class FirLightAnonymousClassForSymbol(
}
private val _ownInnerClasses: List<FirLightClassBase> by lazyPub {
anonymousObjectSymbol.createInnerClasses(manager)
anonymousObjectSymbol.createInnerClasses(manager, this, kotlinOrigin)
}
override fun getOwnInnerClasses(): List<PsiClass> = _ownInnerClasses
@@ -79,7 +79,7 @@ internal abstract class FirLightClassForClassOrObjectSymbol(
_typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY
private val _ownInnerClasses: List<FirLightClassBase> by lazyPub {
classOrObjectSymbol.createInnerClasses(manager)
classOrObjectSymbol.createInnerClasses(manager, this, kotlinOrigin)
}
override fun getOwnInnerClasses(): List<PsiClass> = _ownInnerClasses
@@ -0,0 +1,52 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.light.classes.symbol
import com.intellij.psi.*
import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.load.java.JvmAbi
internal class FirLightClassForInterfaceDefaultImpls(
private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
private val containingClass: FirLightClassBase,
manager: PsiManager
) : FirLightInterfaceClassSymbol(classOrObjectSymbol, manager) {
override fun getQualifiedName(): String? = containingClass.qualifiedName?.let { it + ".${JvmAbi.DEFAULT_IMPLS_CLASS_NAME}" }
override fun getName() = JvmAbi.DEFAULT_IMPLS_CLASS_NAME
override fun getParent() = containingClass
override fun copy() =
FirLightClassForInterfaceDefaultImpls(classOrObjectSymbol, containingClass, manager)
override fun getTypeParameterList(): PsiTypeParameterList? = null
override fun getTypeParameters(): Array<PsiTypeParameter> = emptyArray()
private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)
FirLightClassModifierList(this@FirLightClassForInterfaceDefaultImpls, modifiers, emptyList())
}
override fun getModifierList(): PsiModifierList? = _modifierList
override fun isInterface(): Boolean = false
override fun isDeprecated(): Boolean = false
override fun isAnnotationType(): Boolean = false
override fun isEnum(): Boolean = false
override fun hasTypeParameters(): Boolean = false
override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean = false
@Throws(IncorrectOperationException::class)
override fun setName(name: String): PsiElement {
throw IncorrectOperationException("Impossible to rename DefaultImpls")
}
override fun getContainingClass() = containingClass
override fun getOwnInnerClasses() = emptyList<PsiClass>()
}
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.isPrivateOrPrivateToThi
import org.jetbrains.kotlin.light.classes.symbol.classes.createInheritanceList
import org.jetbrains.kotlin.light.classes.symbol.classes.createMethods
internal class FirLightInterfaceClassSymbol(
internal open class FirLightInterfaceClassSymbol(
private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager
) : FirLightInterfaceOrAnnotationClassSymbol(classOrObjectSymbol, manager) {
@@ -18,10 +18,15 @@ import org.jetbrains.kotlin.analysis.api.tokens.HackToForceAllowRunningAnalyzeOn
import org.jetbrains.kotlin.analysis.api.tokens.hackyAllowRunningOnEdt
import org.jetbrains.kotlin.analysis.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.analysis.project.structure.getKtModuleOfTypeSafe
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.asJava.hasInterfaceDefaultImpls
import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.config.JvmDefaultMode
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.lexer.KtTokens
@@ -394,7 +399,11 @@ internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, su
return listBuilder
}
internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<FirLightClassBase> {
internal fun KtSymbolWithMembers.createInnerClasses(
manager: PsiManager,
containingClass: FirLightClassBase,
classOrObject: KtClassOrObject?
): List<FirLightClassBase> {
val result = ArrayList<FirLightClassBase>()
// workaround for ClassInnerStuffCache not supporting classes with null names, see KT-13927
@@ -407,10 +416,16 @@ internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<F
}
}
//TODO
//if (classOrObject.hasInterfaceDefaultImpls) {
// result.add(KtLightClassForInterfaceDefaultImpls(classOrObject))
//}
val jvmDefaultMode =
classOrObject?.getKtModuleOfTypeSafe<KtSourceModule>()?.languageVersionSettings?.getFlag(JvmAnalysisFlags.jvmDefaultMode)
?: JvmDefaultMode.DEFAULT
if (this is KtNamedClassOrObjectSymbol &&
classOrObject?.hasInterfaceDefaultImpls == true &&
jvmDefaultMode != JvmDefaultMode.ALL_INCOMPATIBLE
) {
result.add(FirLightClassForInterfaceDefaultImpls(this, containingClass, manager))
}
return result
}
@@ -7,4 +7,6 @@ interface KtInterface {
}
fun withoutBody()
}
}
// FIR_COMPARISON