diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterface.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterface.kt index ac2ee21281f..16a5f93b83c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterface.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterface.kt @@ -9,6 +9,7 @@ import com.intellij.psi.PsiManager import com.intellij.psi.PsiMethod import com.intellij.psi.PsiReferenceList import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol @@ -55,9 +56,7 @@ internal open class SymbolLightClassForInterface : SymbolLightClassForInterfaceO withClassOrObjectSymbol { classOrObjectSymbol -> val result = mutableListOf() - val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() - .filterNot { it is KtFunctionSymbol && it.visibility.isPrivateOrPrivateToThis() } - .filterNot { it.hasTypeForValueClassInSignature() } + val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols().filter { acceptCallableSymbol(it) } createMethods(visibleDeclarations, result) addMethodsFromCompanionIfNeeded(result, classOrObjectSymbol) @@ -66,6 +65,11 @@ internal open class SymbolLightClassForInterface : SymbolLightClassForInterfaceO } } + context(KtAnalysisSession) + protected open fun acceptCallableSymbol(symbol: KtCallableSymbol): Boolean = + !(symbol is KtFunctionSymbol && symbol.visibility.isPrivateOrPrivateToThis() || symbol.hasTypeForValueClassInSignature()) + + override fun getOwnMethods(): List = _ownMethods override fun copy(): SymbolLightClassForInterface = diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt index e45f4036e23..3edb54db27c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt @@ -7,7 +7,11 @@ package org.jetbrains.kotlin.light.classes.symbol.classes import com.intellij.psi.* import com.intellij.util.IncorrectOperationException +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.light.classes.symbol.modifierLists.InitializedModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.load.java.JvmAbi @@ -62,4 +66,9 @@ internal class SymbolLightClassForInterfaceDefaultImpls(private val containingCl override fun getContainingClass() = containingClass override fun getOwnInnerClasses() = emptyList() + + context(KtAnalysisSession) + override fun acceptCallableSymbol(symbol: KtCallableSymbol): Boolean { + return super.acceptCallableSymbol(symbol) && (symbol as? KtSymbolWithModality)?.modality != Modality.ABSTRACT + } } diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.fir.java index 6f4b1d7e432..2755c22079c 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.fir.java @@ -2,6 +2,9 @@ public abstract interface C /* p.C*/ extends p.B { @org.jetbrains.annotations.NotNull() public abstract java.lang.String c();// c() + @org.jetbrains.annotations.NotNull() + public abstract java.lang.String more();// more() + public static final class DefaultImpls /* p.C.DefaultImpls*/ { @org.jetbrains.annotations.NotNull() public java.lang.String c();// c() diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.java index 9c9fa6d4e3e..d4c3e72a1ee 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.java @@ -2,6 +2,9 @@ public abstract interface C /* p.C*/ extends p.B { @org.jetbrains.annotations.NotNull() public abstract java.lang.String c();// c() + @org.jetbrains.annotations.NotNull() + public abstract java.lang.String more();// more() + public static final class DefaultImpls /* p.C.DefaultImpls*/ { @org.jetbrains.annotations.NotNull() public static java.lang.String a(@org.jetbrains.annotations.NotNull() p.C);// a(p.C) diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.kt b/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.kt index 5b7a0f950b0..82fae01cf94 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.kt +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/ExtendingInterfaceWithDefaultImpls.kt @@ -11,4 +11,6 @@ interface B: A { interface C : B { fun c() = "c" + + fun more(): String }