diff options
-rw-r--r-- | java/dagger/internal/codegen/validation/InjectValidator.java | 10 | ||||
-rw-r--r-- | javatests/dagger/internal/codegen/MembersInjectionTest.java | 85 |
2 files changed, 94 insertions, 1 deletions
diff --git a/java/dagger/internal/codegen/validation/InjectValidator.java b/java/dagger/internal/codegen/validation/InjectValidator.java index f223f6a9a..ac434d7d6 100644 --- a/java/dagger/internal/codegen/validation/InjectValidator.java +++ b/java/dagger/internal/codegen/validation/InjectValidator.java @@ -64,6 +64,7 @@ import javax.tools.Diagnostic.Kind; */ @Singleton public final class InjectValidator implements ClearableCache { + private final XProcessingEnv processingEnv; private final CompilerOptions compilerOptions; private final DependencyRequestValidator dependencyRequestValidator; @@ -298,6 +299,15 @@ public final class InjectValidator implements ClearableCache { fieldElement); } + if (fieldElement.isProtected() + && fieldElement.getEnclosingElement().isFromKotlin() + ) { + builder.addItem( + "Dagger injector does not have access to kotlin protected fields", + staticMemberDiagnosticKind(), + fieldElement); + } + validateDependencyRequest(builder, fieldElement); return builder.build(); diff --git a/javatests/dagger/internal/codegen/MembersInjectionTest.java b/javatests/dagger/internal/codegen/MembersInjectionTest.java index 8d2ff0b9f..4748853fb 100644 --- a/javatests/dagger/internal/codegen/MembersInjectionTest.java +++ b/javatests/dagger/internal/codegen/MembersInjectionTest.java @@ -46,6 +46,88 @@ public class MembersInjectionTest { } @Test + public void injectKotlinProtectField_fails() { + Source injectFieldSrc = + CompilerTests.kotlinSource( + "MyClass.kt", + "package test", + "", + "import javax.inject.Inject", + "", + "class MyClass @Inject constructor() {", + " @Inject protected lateinit var protectedField: String", + "}"); + Source moduleSrc = + CompilerTests.kotlinSource( + "MyModule.kt", + "package test", + "", + "import dagger.Module", + "import dagger.Provides", + "", + "@Module", + "object MyModule {", + " @Provides", + " fun providesString() = \"hello\"", + "}"); + Source componentSrc = + CompilerTests.kotlinSource( + "MyComponent.kt", + "package test", + "", + "import dagger.Component", + "@Component(modules = [MyModule::class])", + "interface MyComponent {}"); + CompilerTests.daggerCompiler(injectFieldSrc, moduleSrc, componentSrc) + .withProcessingOptions(compilerMode.processorOptions()) + .compile( + subject -> { + subject.hasErrorCount(1); + subject.hasErrorContaining( + "Dagger injector does not have access to kotlin protected fields"); + }); + } + + @Test + public void injectJavaProtectField_succeeds() { + Source injectFieldSrc = + CompilerTests.javaSource( + "test.MyClass", + "package test;", + "", + "import javax.inject.Inject;", + "", + "public final class MyClass {", + " @Inject MyClass() {}", + " @Inject protected String protectedField;", + "}"); + Source moduleSrc = + CompilerTests.kotlinSource( + "MyModule.kt", + "package test", + "", + "import dagger.Module", + "import dagger.Provides", + "", + "@Module", + "object MyModule {", + " @Provides", + " fun providesString() = \"hello\"", + "}"); + Source componentSrc = + CompilerTests.kotlinSource( + "MyComponent.kt", + "package test", + "", + "import dagger.Component", + "@Component(modules = [MyModule::class])", + "interface MyComponent {}"); + CompilerTests.daggerCompiler(injectFieldSrc, moduleSrc, componentSrc) + .withProcessingOptions(compilerMode.processorOptions()) + .compile(subject -> subject.hasErrorCount(0)); + } + + @Test public void parentClass_noInjectedMembers() throws Exception { Source childFile = CompilerTests.javaSource( @@ -159,7 +241,8 @@ public class MembersInjectionTest { .compile( subject -> { subject.hasErrorCount(0); - subject.generatedSource(goldenFileRule.goldenSource("test/GenericClass_MembersInjector")); + subject.generatedSource( + goldenFileRule.goldenSource("test/GenericClass_MembersInjector")); }); } |