diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index 87825d60007..ce58323c5d3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope +import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol @@ -159,10 +160,13 @@ class Fir2IrLazyClass( } } - for (declaration in fir.declarations) { - if (declaration is FirRegularClass && shouldBuildStub(declaration)) { - val nestedSymbol = classifierStorage.getIrClassSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate) - result += nestedSymbol.owner + for (name in scope.getClassifierNames()) { + scope.processClassifiersByName(name) { + val declaration = it.fir as? FirRegularClass ?: return@processClassifiersByName + if (declaration.classId.outerClassId == fir.classId && shouldBuildStub(declaration)) { + val nestedSymbol = classifierStorage.getIrClassSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate) + result += nestedSymbol.owner + } } } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index 53b066b6c4b..308ac1c7ddf 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -3006,6 +3006,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/stubs/javaNestedClass.kt"); } + @Test + @TestMetadata("javaNestedClassesInHierarchy.kt") + public void testJavaNestedClassesInHierarchy() throws Exception { + runTest("compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt"); + } + @Test @TestMetadata("javaStaticMethod.kt") public void testJavaStaticMethod() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java index cd3b4b6fe7d..3278378f2f8 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java @@ -3006,6 +3006,12 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex runTest("compiler/testData/ir/irText/stubs/javaNestedClass.kt"); } + @Test + @TestMetadata("javaNestedClassesInHierarchy.kt") + public void testJavaNestedClassesInHierarchy() throws Exception { + runTest("compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt"); + } + @Test @TestMetadata("javaStaticMethod.kt") public void testJavaStaticMethod() throws Exception { diff --git a/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.__J1.fir.ir.txt b/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.__J1.fir.ir.txt index 670992848ee..f95e52f45fb 100644 --- a/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.__J1.fir.ir.txt +++ b/compiler/testData/ir/irText/expressions/constructorWithOwnTypeParametersCall.__J1.fir.ir.txt @@ -3,6 +3,25 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J1 modality:OPEN visibility:p TYPE_PARAMETER name:X1 index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Number?] reified:false CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public () returnType:.J1.J1> TYPE_PARAMETER name:Y1 index:1 variance: superTypes:[@[FlexibleNullability] kotlin.CharSequence?] reified:false + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J2 modality:OPEN visibility:public [inner] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J1.J2.J1.J2, X1 of .J1> + TYPE_PARAMETER name:X2 index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Number?] reified:false + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public ($this:.J1.J1>) returnType:.J1.J2.J1.J2, X1 of .J1> + TYPE_PARAMETER name:Y2 index:1 variance: superTypes:[@[FlexibleNullability] kotlin.CharSequence?] reified:false + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J1.J1> + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J1.J2.J1.J2, X1 of .J1>, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J1.J2.J1.J2, X1 of .J1> + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.J1.J2.J1.J2, X1 of .J1>) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J1.J2.J1.J2, X1 of .J1> + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.J1.J2.J1.J2, X1 of .J1>) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J1.J2.J1.J2, X1 of .J1> FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J1.J1>, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any diff --git a/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.__J1.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.__J1.fir.ir.txt index ef22b1db925..dfc7c280721 100644 --- a/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.__J1.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/javaConstructorWithTypeParameters.__J1.fir.ir.txt @@ -5,6 +5,28 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J1 modality:OPEN visibility:p CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public (x1:@[FlexibleNullability] X1 of .J1.?) returnType:.J1.J1> TYPE_PARAMETER name:X1 index:1 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false VALUE_PARAMETER name:x1 index:0 type:@[FlexibleNullability] X1 of .J1.? + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J2 modality:OPEN visibility:public [inner] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J1.J2.J1.J2, T1 of .J1> + TYPE_PARAMETER name:T2 index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> ($this:.J1.J1>) returnType:.J1.J2.J1.J2, T1 of .J1> + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J1.J1> + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public ($this:.J1.J1>, x2:@[FlexibleNullability] X2 of .J1.J2.?) returnType:.J1.J2.J1.J2, T1 of .J1> + TYPE_PARAMETER name:X2 index:1 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J1.J1> + VALUE_PARAMETER name:x2 index:0 type:@[FlexibleNullability] X2 of .J1.J2.? + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J1.J2.J1.J2, T1 of .J1>, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J1.J2.J1.J2, T1 of .J1> + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.J1.J2.J1.J2, T1 of .J1>) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J1.J2.J1.J2, T1 of .J1> + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.J1.J2.J1.J2, T1 of .J1>) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J1.J2.J1.J2, T1 of .J1> FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J1.J1>, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any diff --git a/compiler/testData/ir/irText/stubs/javaInnerClass.__J.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaInnerClass.__J.fir.ir.txt index 642126609c7..4c309f30125 100644 --- a/compiler/testData/ir/irText/stubs/javaInnerClass.__J.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/javaInnerClass.__J.fir.ir.txt @@ -1,6 +1,25 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J [primary] + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:JInner modality:OPEN visibility:public [inner] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J.JInner + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> ($this:.J) returnType:.J.JInner [primary] + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:foo visibility:public modality:OPEN <> ($this:.J.JInner) returnType:kotlin.Unit + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J.JInner + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J.JInner, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J.JInner + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.J.JInner) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J.JInner + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.J.JInner) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J.JInner FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:bar visibility:public modality:OPEN <> ($this:.J) returnType:kotlin.Unit $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] diff --git a/compiler/testData/ir/irText/stubs/javaNestedClass.__J.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaNestedClass.__J.fir.ir.txt index 725c4170711..10f794f8513 100644 --- a/compiler/testData/ir/irText/stubs/javaNestedClass.__J.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/javaNestedClass.__J.fir.ir.txt @@ -1,6 +1,25 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J [primary] + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:JJ modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J.JJ + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J.JJ [primary] + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:foo visibility:public modality:OPEN <> ($this:.J.JJ) returnType:kotlin.Unit + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.J.JJ + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:bar visibility:public modality:OPEN <> () returnType:kotlin.Unit + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J.JJ, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J.JJ + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.J.JJ) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J.JJ + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.J.JJ) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.J.JJ FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any diff --git a/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Base.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Base.fir.ir.txt new file mode 100644 index 00000000000..4d34407f001 --- /dev/null +++ b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Base.fir.ir.txt @@ -0,0 +1,49 @@ +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:Base modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Base + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Base [primary] + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:BaseInner modality:OPEN visibility:public [inner] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Base.BaseInner + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> ($this:.Base) returnType:.Base.BaseInner [primary] + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Base + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.Base.BaseInner, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base.BaseInner + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.Base.BaseInner) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base.BaseInner + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.Base.BaseInner) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base.BaseInner + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:BaseNested modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Base.BaseNested + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Base.BaseNested [primary] + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.Base.BaseNested, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base.BaseNested + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.Base.BaseNested) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base.BaseNested + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.Base.BaseNested) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base.BaseNested + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.Base, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.Base) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.Base) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Base diff --git a/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Base.ir.txt b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Base.ir.txt new file mode 100644 index 00000000000..f3d0270ed66 --- /dev/null +++ b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Base.ir.txt @@ -0,0 +1,49 @@ +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:Base modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Base + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Base [primary] + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:BaseInner modality:OPEN visibility:public [inner] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Base.BaseInner + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> ($this:.Base) returnType:.Base.BaseInner [primary] + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Base + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:BaseNested modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Base.BaseNested + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Base.BaseNested [primary] + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Derived.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Derived.fir.ir.txt new file mode 100644 index 00000000000..2cb2a386846 --- /dev/null +++ b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Derived.fir.ir.txt @@ -0,0 +1,49 @@ +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:Derived modality:OPEN visibility:public superTypes:[.Base] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Derived + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Derived [primary] + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:DerivedInner modality:OPEN visibility:public [inner] superTypes:[.Base.BaseInner] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Derived.DerivedInner + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> ($this:.Derived) returnType:.Derived.DerivedInner [primary] + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Derived + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.Derived.DerivedInner, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .Base.BaseInner + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived.DerivedInner + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.Derived.DerivedInner) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .Base.BaseInner + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived.DerivedInner + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.Derived.DerivedInner) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .Base.BaseInner + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived.DerivedInner + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:DerivedNested modality:OPEN visibility:public superTypes:[.Base.BaseNested] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Derived.DerivedNested + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Derived.DerivedNested [primary] + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.Derived.DerivedNested, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .Base.BaseNested + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived.DerivedNested + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.Derived.DerivedNested) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .Base.BaseNested + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived.DerivedNested + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.Derived.DerivedNested) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .Base.BaseNested + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived.DerivedNested + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.Derived, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .Base + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.Derived) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .Base + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:.Derived) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .Base + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:.Derived diff --git a/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Derived.ir.txt b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Derived.ir.txt new file mode 100644 index 00000000000..39f26c5a1a5 --- /dev/null +++ b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.__Derived.ir.txt @@ -0,0 +1,49 @@ +CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:Derived modality:OPEN visibility:public superTypes:[.Base] + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Derived + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Derived [primary] + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:DerivedInner modality:OPEN visibility:public [inner] superTypes:[.Base.BaseInner] + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Derived.DerivedInner + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> ($this:.Derived) returnType:.Derived.DerivedInner [primary] + $outer: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Derived + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .Base.BaseInner + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .Base.BaseInner + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .Base.BaseInner + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:DerivedNested modality:OPEN visibility:public superTypes:[.Base.BaseNested] + $this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name: type:.Derived.DerivedNested + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.Derived.DerivedNested [primary] + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .Base.BaseNested + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .Base.BaseNested + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .Base.BaseNested + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .Base + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + VALUE_PARAMETER IR_EXTERNAL_DECLARATION_STUB name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .Base + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .Base + $this: VALUE_PARAMETER FAKE_OVERRIDE name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.ir.txt b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.ir.txt new file mode 100644 index 00000000000..8c2fa274adf --- /dev/null +++ b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.ir.txt @@ -0,0 +1,3 @@ +FILE fqName: fileName:/javaNestedClassesInHierarchy.kt + FUN name:test visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY diff --git a/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt new file mode 100644 index 00000000000..244cd89d0cb --- /dev/null +++ b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt @@ -0,0 +1,19 @@ +// TARGET_BACKEND: JVM +// FIR_IDENTICAL +// DUMP_EXTERNAL_CLASS: Base, Derived +// FILE: javaNestedClassesInHierarchy.kt + +fun test() {} + +// FILE: Base.java +public class Base { + public class BaseInner {} + public static class BaseNested {} +} + +// FILE: Derived.java + +public class Derived extends Base { + public class DerivedInner extends BaseInner {} + public static class DerivedNested extends BaseNested {} +} diff --git a/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt.txt b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt.txt new file mode 100644 index 00000000000..da3dd341d24 --- /dev/null +++ b/compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt.txt @@ -0,0 +1,2 @@ +fun test() { +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index 04261eb44d8..78d43597787 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -3006,6 +3006,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/stubs/javaNestedClass.kt"); } + @Test + @TestMetadata("javaNestedClassesInHierarchy.kt") + public void testJavaNestedClassesInHierarchy() throws Exception { + runTest("compiler/testData/ir/irText/stubs/javaNestedClassesInHierarchy.kt"); + } + @Test @TestMetadata("javaStaticMethod.kt") public void testJavaStaticMethod() throws Exception { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/IrTextDumpHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/IrTextDumpHandler.kt index cd127e8349f..8eaa2bbecd2 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/IrTextDumpHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/IrTextDumpHandler.kt @@ -79,12 +79,16 @@ class IrTextDumpHandler(testServices: TestServices) : AbstractIrHandler(testServ if (externalClassIds.isEmpty()) return val baseFile = testServices.moduleStructure.originalTestDataFiles.first() - for (externalClassId in externalClassIds) { - val classDump = info.irPluginContext.findExternalClass(externalClassId).dump() - val suffix = ".__${externalClassId.replace("/", ".")}" - val expectedFile = baseFile.withSuffixAndExtension(suffix, module.getDumpExtension(ignoreFirIdentical = true)) - assertions.assertEqualsToFile(expectedFile, classDump) - } + assertions.assertAll( + externalClassIds.map { externalClassId -> + { + val classDump = info.irPluginContext.findExternalClass(externalClassId).dump() + val suffix = ".__${externalClassId.replace("/", ".")}" + val expectedFile = baseFile.withSuffixAndExtension(suffix, module.getDumpExtension(ignoreFirIdentical = true)) + assertions.assertEqualsToFile(expectedFile, classDump) + } + } + ) } private fun IrPluginContext.findExternalClass(externalClassId: String): IrClass {