diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt index f03b9f80020..1eae4e3b0e1 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt @@ -47,4 +47,4 @@ class KtFe10AnalysisSession(val analysisContext: Fe10AnalysisContext) : KtAnalys override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession { return KtFe10AnalysisSession(elementToReanalyze, token) } -} \ No newline at end of file +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt index 1e5b6a45fd5..4a85573de4b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt @@ -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 diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightAnonymousClassForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightAnonymousClassForSymbol.kt index 7704ce23f08..8e5117ecae6 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightAnonymousClassForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightAnonymousClassForSymbol.kt @@ -88,7 +88,7 @@ internal class FirLightAnonymousClassForSymbol( } private val _ownInnerClasses: List by lazyPub { - anonymousObjectSymbol.createInnerClasses(manager) + anonymousObjectSymbol.createInnerClasses(manager, this, kotlinOrigin) } override fun getOwnInnerClasses(): List = _ownInnerClasses diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt index ab001e9edac..1f57ed75236 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt @@ -79,7 +79,7 @@ internal abstract class FirLightClassForClassOrObjectSymbol( _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY private val _ownInnerClasses: List by lazyPub { - classOrObjectSymbol.createInnerClasses(manager) + classOrObjectSymbol.createInnerClasses(manager, this, kotlinOrigin) } override fun getOwnInnerClasses(): List = _ownInnerClasses diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForInterfaceDefaultImpls.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForInterfaceDefaultImpls.kt new file mode 100644 index 00000000000..c06328961c5 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForInterfaceDefaultImpls.kt @@ -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 = 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() +} diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt index 52240b032e4..aa0d5e843ca 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightInterfaceClassSymbol.kt @@ -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) { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt index 4de74dbcd36..6d9a2601c71 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt @@ -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 { +internal fun KtSymbolWithMembers.createInnerClasses( + manager: PsiManager, + containingClass: FirLightClassBase, + classOrObject: KtClassOrObject? +): List { val result = ArrayList() // workaround for ClassInnerStuffCache not supporting classes with null names, see KT-13927 @@ -407,10 +416,16 @@ internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List()?.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 } diff --git a/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAllCompatibility.kt b/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAllCompatibility.kt index dd17ff1e9e2..ea00201aef2 100644 --- a/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAllCompatibility.kt +++ b/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAllCompatibility.kt @@ -7,4 +7,6 @@ interface KtInterface { } fun withoutBody() -} \ No newline at end of file +} + +// FIR_COMPARISON