From dd9c0c5c6e781153023c043763ce1fdeb7dbf7d4 Mon Sep 17 00:00:00 2001 From: LepilkinaElena Date: Fri, 20 Nov 2020 19:10:41 +0300 Subject: [PATCH] Use separate logic for filtering and skipping in collectAndFilterRealOverrides [KT-43487] (#3921) --- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../kotlin/ir/util/IrFakeOverrideUtils.kt | 18 ++++++++++++------ .../traits/abstractClassWithFakeOverride.kt | 15 +++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++++ 10 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index bf8eb94be8a..61ddd00b119 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -31384,6 +31384,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/traits/abstractClassInheritsFromInterface.kt"); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt index 1b19b24a538..5639181114c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt @@ -38,15 +38,21 @@ fun IrSimpleFunction.collectRealOverrides( return this.overriddenSymbols .map { it.owner } - .collectAndFilterRealOverrides { - require(it is IrSimpleFunction) { "Expected IrSimpleFunction: ${it.render()}" } - toSkip(it) || filter(it) - } + .collectAndFilterRealOverrides( + { + require(it is IrSimpleFunction) { "Expected IrSimpleFunction: ${it.render()}" } + toSkip(it) + }, + filter + ) .map { it as IrSimpleFunction } .toSet() } -fun Collection.collectAndFilterRealOverrides(toSkip: (IrOverridableMember) -> Boolean = { false }): Set { +fun Collection.collectAndFilterRealOverrides( + toSkip: (IrOverridableMember) -> Boolean = { false }, + filter: (IrOverridableMember) -> Boolean = { false } +): Set { val visited = mutableSetOf() val realOverrides = mutableSetOf() @@ -60,7 +66,7 @@ fun Collection.collectAndFilterRealOverrides(toSkip: (IrOve } fun collectRealOverrides(member: IrOverridableMember) { - if (!visited.add(member)) return + if (!visited.add(member) || filter(member)) return if (member.isReal && !toSkip(member)) { realOverrides += member diff --git a/compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt b/compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt new file mode 100644 index 00000000000..dd2159e74b3 --- /dev/null +++ b/compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt @@ -0,0 +1,15 @@ +interface A { + fun foo(): String = "Fail" +} + +abstract class B : A { + abstract override fun foo(): String +} + +abstract class C : B() + +class D : C() { + override fun foo(): String = "OK" +} + +fun box() = D().foo() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 4beca574135..fa369720281 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -33155,6 +33155,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/traits/abstractClassInheritsFromInterface.kt"); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 049c177a7e4..6cbd283fad3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -30789,6 +30789,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/traits/abstractClassInheritsFromInterface.kt"); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index dfea3f7857f..11dd8f2ffc8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -31384,6 +31384,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/traits/abstractClassInheritsFromInterface.kt"); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 1fbe2b63019..0ef28c60d79 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -25410,6 +25410,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS_IR_ES6, testDataFilePath); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true); } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index e848fe808bf..8ac0f210150 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -25410,6 +25410,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS_IR, testDataFilePath); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index f89079338a6..c5f9692f93b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -25425,6 +25425,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS, testDataFilePath); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true); } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 262208530e7..2e47c7a0607 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -13828,6 +13828,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest KotlinTestUtils.runTest0(this::doTest, TargetBackend.WASM, testDataFilePath); } + @TestMetadata("abstractClassWithFakeOverride.kt") + public void testAbstractClassWithFakeOverride() throws Exception { + runTest("compiler/testData/codegen/box/traits/abstractClassWithFakeOverride.kt"); + } + public void testAllFilesPresentInTraits() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/traits"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); }