diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index e8e4b8d7fdd..e99128d4b10 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -5396,6 +5396,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis public void testTypeParameterUse() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/typeParameterUse.kt"); } + + @Test + @TestMetadata("UsingObject.kt") + public void testUsingObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.fir.txt new file mode 100644 index 00000000000..2cf93c6b31d --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.fir.txt @@ -0,0 +1,14 @@ +FILE: UsingObject.kt + public final class A : R|kotlin/Any| { + public constructor(): R|A| { + super() + } + + } + public final fun foo(): R|A?| { + ^foo Null(null) + } + public final fun main(): R|kotlin/Unit| { + lval w: R|kotlin/Any| = R|/foo|() ?: Q|java/lang|.R|java/lang/Object.Object|() + R|/w|.R|kotlin/Any.hashCode|() + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.kt new file mode 100644 index 00000000000..527d44b3d24 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.kt @@ -0,0 +1,8 @@ +class A + +fun foo(): A? = null + +fun main() { + val w = foo() ?: java.lang.Object() + w.hashCode() +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index d3fb87f4cd3..29097a5e472 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -5396,6 +5396,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { public void testTypeParameterUse() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/typeParameterUse.kt"); } + + @Test + @TestMetadata("UsingObject.kt") + public void testUsingObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 0a80fd75bff..da047f1b0b1 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -5396,6 +5396,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos public void testTypeParameterUse() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/typeParameterUse.kt"); } + + @Test + @TestMetadata("UsingObject.kt") + public void testUsingObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/UsingObject.kt"); + } } @Nested diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 3cfeadd53ae..5b5cef59742 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -33,15 +33,13 @@ import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeFlexibleType import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef +import org.jetbrains.kotlin.fir.types.constructClassLikeType import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl -import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.types.Variance.INVARIANT import org.jetbrains.kotlin.util.OperatorNameConventions @@ -195,6 +193,13 @@ class FirJavaFacade( } } javaClass.supertypes.mapTo(superTypeRefs) { it.toFirJavaTypeRef(session, javaTypeParameterStack) } + if (superTypeRefs.isEmpty()) { + superTypeRefs.add( + buildResolvedTypeRef { + type = StandardClassIds.Any.constructClassLikeType(emptyArray(), isNullable = false) + } + ) + } val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol })