diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index 167f2dc9bb3..a12be7e9920 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -7954,6 +7954,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/funInterface/genericSubstitutionForFunInterface.kt"); } + @TestMetadata("resolveFunInterfaceWithoutMainMethod.kt") + public void testResolveFunInterfaceWithoutMainMethod() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.kt"); + } + @TestMetadata("severalConversionsForFunInterface.kt") public void testSeveralConversionsForFunInterface() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/severalConversionsForFunInterface.kt"); diff --git a/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.fir.kt b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.fir.kt new file mode 100644 index 00000000000..c1f0fb14c2e --- /dev/null +++ b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.fir.kt @@ -0,0 +1,12 @@ +fun interface IsolatedFunFace { +} + +typealias FunAlias = IsolatedFunFace + +fun referIsolatedFunFace(iff: IsolatedFunFace) {} + +fun callIsolatedFunFace() { + referIsolatedFunFace(IsolatedFunFace {}) + referIsolatedFunFace(FunAlias {}) + referIsolatedFunFace({}) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.kt b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.kt new file mode 100644 index 00000000000..1f455ea24d1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.kt @@ -0,0 +1,12 @@ +fun interface IsolatedFunFace { +} + +typealias FunAlias = IsolatedFunFace + +fun referIsolatedFunFace(iff: IsolatedFunFace) {} + +fun callIsolatedFunFace() { + referIsolatedFunFace(IsolatedFunFace {}) + referIsolatedFunFace(FunAlias {}) + referIsolatedFunFace({}) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.txt b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.txt new file mode 100644 index 00000000000..0f9692c503e --- /dev/null +++ b/compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.txt @@ -0,0 +1,11 @@ +package + +public fun callIsolatedFunFace(): kotlin.Unit +public fun referIsolatedFunFace(/*0*/ iff: IsolatedFunFace): kotlin.Unit + +public fun interface IsolatedFunFace { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +public typealias FunAlias = IsolatedFunFace diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 0eb87bf77fc..0e30e57079d 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -7961,6 +7961,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/funInterface/genericSubstitutionForFunInterface.kt"); } + @TestMetadata("resolveFunInterfaceWithoutMainMethod.kt") + public void testResolveFunInterfaceWithoutMainMethod() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.kt"); + } + @TestMetadata("severalConversionsForFunInterface.kt") public void testSeveralConversionsForFunInterface() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/severalConversionsForFunInterface.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index d23dd13d52d..70cc96ecf19 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -7956,6 +7956,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/funInterface/genericSubstitutionForFunInterface.kt"); } + @TestMetadata("resolveFunInterfaceWithoutMainMethod.kt") + public void testResolveFunInterfaceWithoutMainMethod() throws Exception { + runTest("compiler/testData/diagnostics/tests/funInterface/resolveFunInterfaceWithoutMainMethod.kt"); + } + @TestMetadata("severalConversionsForFunInterface.kt") public void testSeveralConversionsForFunInterface() throws Exception { runTest("compiler/testData/diagnostics/tests/funInterface/severalConversionsForFunInterface.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/synthetic/FunInterfaceConstructorsSyntheticScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/synthetic/FunInterfaceConstructorsSyntheticScope.kt index 05351c4167f..4ea33b75035 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/synthetic/FunInterfaceConstructorsSyntheticScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/synthetic/FunInterfaceConstructorsSyntheticScope.kt @@ -58,21 +58,26 @@ class FunInterfaceConstructorsSyntheticScope( return getTypeAliasSamConstructor(classifier) } - if (classifier !is ClassDescriptor) return null - if (!classifier.isFun) return null - - return samConstructorForClassifier(classifier) + val classDescriptor = checkIfClassifierApplicable(classifier) ?: return null + return samConstructorForClassifier(classDescriptor) } private fun getTypeAliasSamConstructor(classifier: TypeAliasDescriptor): SamConstructorDescriptor? { - val classDescriptor = classifier.classDescriptor ?: return null - if (!classDescriptor.isFun) return null + val classDescriptor = checkIfClassifierApplicable(classifier.classDescriptor ?: return null) ?: return null return createTypeAliasSamConstructorFunction( classifier, samConstructorForClassifier(classDescriptor), samResolver, samConversionOracle ) } + private fun checkIfClassifierApplicable(classifier: ClassifierDescriptor): ClassDescriptor? { + if (classifier !is ClassDescriptor) return null + if (!classifier.isFun) return null + if (getSingleAbstractMethodOrNull(classifier) == null) return null + + return classifier + } + private fun recordSamLookupsToClassifier(classifier: ClassifierDescriptor, location: LookupLocation) { if (classifier !is ClassDescriptor || !classifier.isFun) return lookupTracker.record(location, classifier, SAM_LOOKUP_NAME)