diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt index 681b34f4ff5..b89b465f37b 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt @@ -1,4 +1,4 @@ -public abstract interface F : R|kotlin/Any| { +public abstract fun interface F : R|kotlin/Any| { public abstract fun R|kotlin/String|.f(x: R|kotlin/Int|): R|kotlin/Unit| } diff --git a/compiler/fir/analysis-tests/testData/resolve/funInterfaceDeclaration.fir.txt b/compiler/fir/analysis-tests/testData/resolve/funInterfaceDeclaration.fir.txt index a5a60533b23..f9f7c12db62 100644 --- a/compiler/fir/analysis-tests/testData/resolve/funInterfaceDeclaration.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/funInterfaceDeclaration.fir.txt @@ -1,36 +1,36 @@ FILE: funInterfaceDeclaration.kt - public abstract interface Test1 : R|kotlin/Any| { + public abstract fun interface Test1 : R|kotlin/Any| { public abstract fun foo(): R|kotlin/Unit| public abstract fun boo(): R|kotlin/Unit| } - public abstract interface Test2 : R|kotlin/Any| { + public abstract fun interface Test2 : R|kotlin/Any| { } - public abstract interface Test3 : R|kotlin/Any| { + public abstract fun interface Test3 : R|kotlin/Any| { public abstract val a: R|kotlin/Int| public get(): R|kotlin/Int| public abstract fun foo(): R|kotlin/Unit| } - public abstract interface Test4 : R|kotlin/Any| { + public abstract fun interface Test4 : R|kotlin/Any| { public abstract fun foo(a: R|T|): R|kotlin/Unit| } - public abstract interface Test5 : R|kotlin/Any| { + public abstract fun interface Test5 : R|kotlin/Any| { public abstract fun foo(a: R|kotlin/Int| = Int(5)): R|kotlin/Unit| } - public abstract interface Test6 : R|kotlin/Any| { + public abstract fun interface Test6 : R|kotlin/Any| { public abstract suspend fun foo(): R|kotlin/Unit| } - public abstract interface Test7 : R|kotlin/Any| { + public abstract fun interface Test7 : R|kotlin/Any| { public abstract fun foo(): R|kotlin/Unit| } - public abstract interface Test8 : R|Test7| { + public abstract fun interface Test8 : R|Test7| { public abstract fun boo(): R|kotlin/Unit| } @@ -40,7 +40,7 @@ FILE: funInterfaceDeclaration.kt } } - public abstract interface Test10 : R|Test9| { + public abstract fun interface Test10 : R|Test9| { public abstract fun test(): R|kotlin/Unit| } @@ -49,7 +49,7 @@ FILE: funInterfaceDeclaration.kt public get(): R|kotlin/Int| } - public abstract interface Test12 : R|Test11| { + public abstract fun interface Test12 : R|Test11| { public abstract fun test(): R|kotlin/Unit| } @@ -57,5 +57,5 @@ FILE: funInterfaceDeclaration.kt public abstract suspend fun test(): R|kotlin/Unit| } - public abstract interface Test15 : R|Test14| { + public abstract fun interface Test15 : R|Test14| { } diff --git a/compiler/fir/analysis-tests/testData/resolve/samConstructors/funInterfaceConstructorReference.fir.txt b/compiler/fir/analysis-tests/testData/resolve/samConstructors/funInterfaceConstructorReference.fir.txt index 85d8f45629c..7bd5457daf6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/samConstructors/funInterfaceConstructorReference.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/samConstructors/funInterfaceConstructorReference.fir.txt @@ -1,5 +1,5 @@ FILE: funInterfaceConstructorReference.kt - public abstract interface Test : R|kotlin/Any| { + public abstract fun interface Test : R|kotlin/Any| { public abstract fun foo(): R|kotlin/Unit| } diff --git a/compiler/fir/analysis-tests/testData/resolve/samConstructors/kotlinSam.fir.txt b/compiler/fir/analysis-tests/testData/resolve/samConstructors/kotlinSam.fir.txt index a1ece735cec..98681877d6e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/samConstructors/kotlinSam.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/samConstructors/kotlinSam.fir.txt @@ -1,11 +1,11 @@ FILE: kotlinSam.kt - public abstract interface MyRunnable : R|kotlin/Any| { + public abstract fun interface MyRunnable : R|kotlin/Any| { public abstract fun foo(x: R|kotlin/Int|): R|kotlin/Boolean| } public final fun foo(m: R|MyRunnable|): R|kotlin/Unit| { } - private abstract interface PrivateRunnable : R|kotlin/Any| { + private abstract fun interface PrivateRunnable : R|kotlin/Any| { public abstract fun bar(x: R|kotlin/String|): R|kotlin/Boolean| } diff --git a/compiler/fir/analysis-tests/testData/resolve/samConversions/kotlinSam.fir.txt b/compiler/fir/analysis-tests/testData/resolve/samConversions/kotlinSam.fir.txt index d822299f1f3..7b3f4fbb941 100644 --- a/compiler/fir/analysis-tests/testData/resolve/samConversions/kotlinSam.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/samConversions/kotlinSam.fir.txt @@ -1,22 +1,22 @@ FILE: kotlinSam.kt - public abstract interface MyRunnable : R|kotlin/Any| { + public abstract fun interface MyRunnable : R|kotlin/Any| { public abstract fun foo(x: R|kotlin/Int|): R|kotlin/Boolean| } - public abstract interface WithProperty : R|kotlin/Any| { + public abstract fun interface WithProperty : R|kotlin/Any| { public abstract val x: R|kotlin/Int| public get(): R|kotlin/Int| } - public abstract interface TwoAbstract : R|MyRunnable| { + public abstract fun interface TwoAbstract : R|MyRunnable| { public abstract fun bar(): R|kotlin/Unit| } - public abstract interface Super : R|kotlin/Any| { + public abstract fun interface Super : R|kotlin/Any| { public abstract fun foo(x: R|kotlin/Int|): R|kotlin/Any| } - public abstract interface Derived : R|Super| { + public abstract fun interface Derived : R|Super| { public abstract override fun foo(x: R|kotlin/Int|): R|kotlin/Boolean| } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/sam.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/sam.fir.txt index 23b64359bae..db40d58dfd5 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/sam.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/sam.fir.txt @@ -1,5 +1,5 @@ FILE: sam.kt - public abstract interface MySam : R|kotlin/Any| { + public abstract fun interface MySam : R|kotlin/Any| { public abstract fun run(x: R|kotlin/String|): R|kotlin/Int| } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index afb474c4ba4..61b7e19eb52 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -462,7 +462,7 @@ internal fun IrDeclarationParent.declareThisReceiverParameter( fun FirClass<*>.irOrigin(firProvider: FirProvider): IrDeclarationOrigin = when { firProvider.getFirClassifierContainerFileIfAny(symbol) != null -> IrDeclarationOrigin.DEFINED - origin == FirDeclarationOrigin.Java -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB + isJava -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB else -> IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt index c1580aad3ba..a9ed451fae3 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt @@ -155,7 +155,7 @@ class JavaScopeProvider( } } ?: return null - if (superClass.origin is FirDeclarationOrigin.Java) return superClass + if (superClass.isJava) return superClass return superClass.findJavaSuperClass(useSiteSession) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 4256414eb53..e3a244d3304 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility @@ -324,7 +325,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM print("inner ") } - // `companion/data` modifiers are only valid for FirRegularClass, but we render them to make sure they are not + // `companion/data/fun` modifiers are only valid for FirRegularClass, but we render them to make sure they are not // incorrectly loaded for other declarations during deserialization. if (memberDeclaration.status.isCompanion) { print("companion ") @@ -332,6 +333,13 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM if (memberDeclaration.status.isData) { print("data ") } + // All Java interfaces are considered `fun` (functional interfaces) for resolution purposes + // (see JavaSymbolProvider.createFirJavaClass). Don't render `fun` for Java interfaces; it's not a modifier in Java. + val isJavaInterface = + memberDeclaration is FirRegularClass && memberDeclaration.classKind == ClassKind.INTERFACE && memberDeclaration.isJava + if (memberDeclaration.status.isFun && !isJavaInterface) { + print("fun ") + } if (memberDeclaration.isInline) { print("inline ") diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index 59b85d11c2a..c12516cfcc1 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder import org.jetbrains.kotlin.fir.declarations.impl.FirFileImpl import org.jetbrains.kotlin.fir.declarations.impl.FirRegularClassImpl import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess -import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol @@ -23,8 +22,6 @@ import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeFlexibleType import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.coneTypeSafe -import org.jetbrains.kotlin.metadata.ProtoBuf -import org.jetbrains.kotlin.metadata.deserialization.NameResolver fun FirTypeParameterBuilder.addDefaultBoundIfNecessary(isFlexible: Boolean = false) { if (bounds.isEmpty()) { @@ -227,6 +224,8 @@ val FirQualifiedAccess.referredPropertySymbol: FirPropertySymbol? return reference.resolvedSymbol as? FirPropertySymbol } +inline val FirDeclaration.isJava: Boolean + get() = origin == FirDeclarationOrigin.Java inline val FirDeclaration.isFromLibrary: Boolean get() = origin == FirDeclarationOrigin.Library inline val FirDeclaration.isSynthetic: Boolean