From cc8061587edddce2efb4cf41210fe2bcef9ca2a1 Mon Sep 17 00:00:00 2001 From: Anton Duyun Date: Mon, 7 Aug 2023 16:56:41 +0300 Subject: [PATCH] `@DefaultComponent` should work for template components too (#244) --- .../processor/GraphResolutionHelper.java | 9 ++++--- .../processor/ConflictResolutionTest.java | 24 +++++++++++++++++ .../kora/app/ksp/GraphResolutionHelper.kt | 17 +++++++----- .../kora/app/ksp/ConflictResolutionTest.kt | 27 +++++++++++++++++++ 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/kora-app-annotation-processor/src/main/java/ru/tinkoff/kora/kora/app/annotation/processor/GraphResolutionHelper.java b/kora-app-annotation-processor/src/main/java/ru/tinkoff/kora/kora/app/annotation/processor/GraphResolutionHelper.java index 6941a054a..abc659970 100644 --- a/kora-app-annotation-processor/src/main/java/ru/tinkoff/kora/kora/app/annotation/processor/GraphResolutionHelper.java +++ b/kora-app-annotation-processor/src/main/java/ru/tinkoff/kora/kora/app/annotation/processor/GraphResolutionHelper.java @@ -251,11 +251,14 @@ public static List findDependencyDeclarationsFromTemplate( d.type(), dependencyClaim.type() )).toList(); - if (exactMatch.isEmpty()) { - return declarations; - } else { + if (!exactMatch.isEmpty()) { return exactMatch; } + var nonDefault = declarations.stream().filter(Predicate.not(ComponentDeclaration::isDefault)).toList(); + if (!nonDefault.isEmpty()) { + return nonDefault; + } + return declarations; } @Nullable diff --git a/kora-app-annotation-processor/src/test/java/ru/tinkoff/kora/kora/app/annotation/processor/ConflictResolutionTest.java b/kora-app-annotation-processor/src/test/java/ru/tinkoff/kora/kora/app/annotation/processor/ConflictResolutionTest.java index 4372eaffa..0c1bd4d9e 100644 --- a/kora-app-annotation-processor/src/test/java/ru/tinkoff/kora/kora/app/annotation/processor/ConflictResolutionTest.java +++ b/kora-app-annotation-processor/src/test/java/ru/tinkoff/kora/kora/app/annotation/processor/ConflictResolutionTest.java @@ -50,4 +50,28 @@ public interface ExampleApplication { assertThat(g.get(draw.getNodes().get(0))).isInstanceOf(this.compileResult.loadClass("TestImpl2")); } + @Test + public void testDefaultComponentTemplateOverride() throws ClassNotFoundException { + var draw = compile(""" + public interface TestInterface {} + """, """ + public class TestImpl1 implements TestInterface {} + """, """ + public class TestImpl2 implements TestInterface {} + """, """ + @KoraApp + public interface ExampleApplication { + @Root + default String root(TestInterface t) {return "";} + + @DefaultComponent + default TestImpl1 testImpl1() { return new TestImpl1<>(); } + default TestImpl2 testImpl2() { return new TestImpl2<>(); } + } + """); + assertThat(draw.getNodes()).hasSize(2); + var g = draw.init().block(); + assertThat(g.get(draw.getNodes().get(0))).isInstanceOf(this.compileResult.loadClass("TestImpl2")); + } + } diff --git a/kora-app-symbol-processor/src/main/kotlin/ru/tinkoff/kora/kora/app/ksp/GraphResolutionHelper.kt b/kora-app-symbol-processor/src/main/kotlin/ru/tinkoff/kora/kora/app/ksp/GraphResolutionHelper.kt index bc082621c..03f86292a 100644 --- a/kora-app-symbol-processor/src/main/kotlin/ru/tinkoff/kora/kora/app/ksp/GraphResolutionHelper.kt +++ b/kora-app-symbol-processor/src/main/kotlin/ru/tinkoff/kora/kora/app/ksp/GraphResolutionHelper.kt @@ -237,13 +237,16 @@ object GraphResolutionHelper { if (result.isEmpty()) { return result } - if (result.size > 1) { - val exactMatch = result.filter { it.type == dependencyClaim.type } - if (exactMatch.isEmpty()) { - return result - } else { - return exactMatch - } + if (result.size == 1) { + return result + } + val exactMatch = result.filter { it.type == dependencyClaim.type } + if (exactMatch.isNotEmpty()) { + return exactMatch + } + val nonDefault = result.filter { !it.isDefault() } + if (nonDefault.isNotEmpty()) { + return nonDefault } return result } diff --git a/kora-app-symbol-processor/src/test/kotlin/ru/tinkoff/kora/kora/app/ksp/ConflictResolutionTest.kt b/kora-app-symbol-processor/src/test/kotlin/ru/tinkoff/kora/kora/app/ksp/ConflictResolutionTest.kt index f11ccd5a7..a0ec63279 100644 --- a/kora-app-symbol-processor/src/test/kotlin/ru/tinkoff/kora/kora/app/ksp/ConflictResolutionTest.kt +++ b/kora-app-symbol-processor/src/test/kotlin/ru/tinkoff/kora/kora/app/ksp/ConflictResolutionTest.kt @@ -57,4 +57,31 @@ class ConflictResolutionTest : AbstractSymbolProcessorTest() { assertThat(compileResult.isFailed()).isFalse() } + + @Test + fun testDefaultComponentTemplateOverride() { + compile( + listOf(KoraAppProcessorProvider()), + """ + interface TestInterface + """.trimIndent(), """ + class TestImpl1 : TestInterface {} + """.trimIndent(), """ + class TestImpl2 : TestInterface {} + """.trimIndent(), """ + @KoraApp + interface ExampleApplication { + @Root + fun root(t: TestInterface) = "" + + fun testImpl1() = TestImpl1() + + @DefaultComponent + fun testImpl2() = TestImpl2() + } + """.trimIndent() + ) + + compileResult.assertSuccess() + } }