diff --git a/java/dagger/internal/codegen/validation/SpiModelBindingGraphConverter.java b/java/dagger/internal/codegen/validation/SpiModelBindingGraphConverter.java index 42e1adffb34..ef9e24b1204 100644 --- a/java/dagger/internal/codegen/validation/SpiModelBindingGraphConverter.java +++ b/java/dagger/internal/codegen/validation/SpiModelBindingGraphConverter.java @@ -16,6 +16,7 @@ package dagger.internal.codegen.validation; +import static androidx.room.compiler.processing.XElementKt.isMethod; import static androidx.room.compiler.processing.compat.XConverters.getProcessingEnv; import static androidx.room.compiler.processing.compat.XConverters.toJavac; import static androidx.room.compiler.processing.compat.XConverters.toKS; @@ -46,7 +47,8 @@ import com.google.devtools.ksp.symbol.KSAnnotated; import com.google.devtools.ksp.symbol.KSAnnotation; import com.google.devtools.ksp.symbol.KSClassDeclaration; -import com.google.devtools.ksp.symbol.KSFunctionDeclaration; +import com.google.devtools.ksp.symbol.KSDeclaration; +import com.google.devtools.ksp.symbol.KSPropertyDeclaration; import com.google.devtools.ksp.symbol.KSType; import dagger.internal.codegen.xprocessing.XAnnotations; import dagger.internal.codegen.xprocessing.XElements; @@ -575,9 +577,12 @@ public ExecutableElement javac() { } @Override - public KSFunctionDeclaration ksp() { + public KSDeclaration ksp() { checkIsKsp(backend()); - return toKS(executableElement()); + return isMethod(executableElement()) + && XElements.asMethod(executableElement()).isKotlinPropertyMethod() + ? (KSPropertyDeclaration) toKS((XElement) executableElement()) + : toKS(executableElement()); } @Override diff --git a/java/dagger/spi/model/DaggerExecutableElement.java b/java/dagger/spi/model/DaggerExecutableElement.java index afbd8e001aa..c585505b55b 100644 --- a/java/dagger/spi/model/DaggerExecutableElement.java +++ b/java/dagger/spi/model/DaggerExecutableElement.java @@ -16,7 +16,7 @@ package dagger.spi.model; -import com.google.devtools.ksp.symbol.KSFunctionDeclaration; +import com.google.devtools.ksp.symbol.KSDeclaration; import com.google.errorprone.annotations.DoNotMock; import javax.lang.model.element.ExecutableElement; @@ -31,11 +31,12 @@ public abstract class DaggerExecutableElement { public abstract ExecutableElement javac(); /** - * Returns the KSP representation for the executable element. + * Returns the KSP representation for the executable element. Can be either KSFunctionDeclaration + * or KSPropertyDeclaration. * * @throws IllegalStateException if the current backend isn't KSP. */ - public abstract KSFunctionDeclaration ksp(); + public abstract KSDeclaration ksp(); /** Returns the backend used in this compilation. */ public abstract DaggerProcessingEnv.Backend backend(); diff --git a/javatests/dagger/internal/codegen/MultibindingTest.java b/javatests/dagger/internal/codegen/MultibindingTest.java index 119fe8060cf..1fee6f2c68b 100644 --- a/javatests/dagger/internal/codegen/MultibindingTest.java +++ b/javatests/dagger/internal/codegen/MultibindingTest.java @@ -24,6 +24,39 @@ @RunWith(JUnit4.class) public class MultibindingTest { + @Test + public void multibindingContributedWithKotlinProperty_compilesSucessfully() { + Source component = + CompilerTests.javaSource( + "test.MyComponent", + "package test;", + "", + "import dagger.Component;", + "import java.util.Set;", + "", + "@Component(modules = TestModule.class)", + "interface MyComponent {", + " Set getStrs();", + "}"); + Source moduleSrc = + CompilerTests.kotlinSource( + "test.TestModule.kt", + "package test", + "", + "import dagger.Module", + "import dagger.Provides", + "import dagger.multibindings.IntoSet", + "", + "@Module", + "object TestModule {", + "@get:IntoSet", + "@get:Provides", + "val helloString: String", + " get() = \"hello\"", + "}"); + + CompilerTests.daggerCompiler(component, moduleSrc).compile(subject -> subject.hasErrorCount(0)); + } @Test public void providesWithTwoMultibindingAnnotations_failsToCompile() {