diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index eed982022a1..dbc7baab939 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl +import org.jetbrains.kotlin.fir.declarations.impl.addDefaultBoundIfNecessary import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.java.declarations.FirJavaConstructor import org.jetbrains.kotlin.fir.java.declarations.FirJavaField @@ -122,6 +123,7 @@ class JavaSymbolProvider( for (upperBound in javaTypeParameter.upperBounds) { bounds += upperBound.toFirResolvedTypeRef(this@JavaSymbolProvider.session, stack) } + addDefaultBoundIfNecessary() } private fun List.convertTypeParameters(stack: JavaTypeParameterStack): List { diff --git a/idea/testData/fir/multiModule/intersectionTypesProblem/extraDump.java.txt b/idea/testData/fir/multiModule/intersectionTypesProblem/extraDump.java.txt new file mode 100644 index 00000000000..b17033b49a4 --- /dev/null +++ b/idea/testData/fir/multiModule/intersectionTypesProblem/extraDump.java.txt @@ -0,0 +1,12 @@ +public abstract interface Diagnostic : R|kotlin/Any| { +} +public abstract interface DiagnosticWithParameters1 : R|jvm/Diagnostic| { + public abstract operator fun getA(): R|ft!| + +} +public abstract interface DiagnosticWithParameters2 : R|jvm/Diagnostic| { + public abstract operator fun getA(): R|ft!| + + public abstract operator fun getB(): R|ft!| + +} diff --git a/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/Diagnostic.java b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/Diagnostic.java new file mode 100644 index 00000000000..d53d04419fd --- /dev/null +++ b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/Diagnostic.java @@ -0,0 +1,3 @@ +package jvm; + +public interface Diagnostic {} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/DiagnosticWithParameters1.java b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/DiagnosticWithParameters1.java new file mode 100644 index 00000000000..315d07e8bcd --- /dev/null +++ b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/DiagnosticWithParameters1.java @@ -0,0 +1,5 @@ +package jvm; + +public interface DiagnosticWithParameters1 extends Diagnostic { + A getA(); +} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/DiagnosticWithParameters2.java b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/DiagnosticWithParameters2.java new file mode 100644 index 00000000000..12cf21d6f06 --- /dev/null +++ b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/DiagnosticWithParameters2.java @@ -0,0 +1,6 @@ +package jvm; + +public interface DiagnosticWithParameters2 extends Diagnostic { + A getA(); + B getB(); +} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/test.kt b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/test.kt new file mode 100644 index 00000000000..745c2b2d722 --- /dev/null +++ b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/test.kt @@ -0,0 +1,7 @@ +package jvm; + +fun select(x: K, y: K): K = x + +fun test(d1: DiagnosticWithParameters1<*, *>, d2: DiagnosticWithParameters2<*, *, *>) { + val res = select(d1.a, d2.b) +} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/test.txt b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/test.txt new file mode 100644 index 00000000000..b82a652a330 --- /dev/null +++ b/idea/testData/fir/multiModule/intersectionTypesProblem/jvm/test.txt @@ -0,0 +1,7 @@ +FILE: test.kt + public final fun select(x: R|K|, y: R|K|): R|K| { + ^select R|/x| + } + public final fun test(d1: R|jvm/DiagnosticWithParameters1<*, *>|, d2: R|jvm/DiagnosticWithParameters2<*, *, *>|): R|kotlin/Unit| { + lval res: R|ft?| = R|jvm/select|?|>(R|/d1|.R|jvm/DiagnosticWithParameters1.a|, R|/d2|.R|jvm/DiagnosticWithParameters2.b|) + } diff --git a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java index 5ec75f84289..b4b015949d8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java @@ -64,6 +64,11 @@ public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleRe runTest("idea/testData/fir/multiModule/fullWithJavaPredefinedSignature/"); } + @TestMetadata("intersectionTypesProblem") + public void testIntersectionTypesProblem() throws Exception { + runTest("idea/testData/fir/multiModule/intersectionTypesProblem/"); + } + @TestMetadata("javaGetPrefixConflict") public void testJavaGetPrefixConflict() throws Exception { runTest("idea/testData/fir/multiModule/javaGetPrefixConflict/");