FIR LC: populate DefaultImpls if an interface has default implementations
This commit is contained in:
committed by
Ilya Kirillov
parent
b52dc15aa7
commit
f8a6ab9536
+1
-1
@@ -47,4 +47,4 @@ class KtFe10AnalysisSession(val analysisContext: Fe10AnalysisContext) : KtAnalys
|
||||
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession {
|
||||
return KtFe10AnalysisSession(elementToReanalyze, token)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-2
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+52
@@ -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>()
|
||||
}
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+20
-5
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Vendored
+3
-1
@@ -7,4 +7,6 @@ interface KtInterface {
|
||||
}
|
||||
|
||||
fun withoutBody()
|
||||
}
|
||||
}
|
||||
|
||||
// FIR_COMPARISON
|
||||
|
||||
Reference in New Issue
Block a user