diff options
author | Wanying Ding <wanyingd@google.com> | 2024-01-04 10:42:47 -0800 |
---|---|---|
committer | Dagger Team <dagger-dev+copybara@google.com> | 2024-01-04 10:47:52 -0800 |
commit | 408431a3bb4db983f27bb96122167ca4cf41322e (patch) | |
tree | daeaf81d8ab1602e08a5512ad79e8cacc54076ad | |
parent | 09289eb52a5d18266981753d53b5e81fba87a1c2 (diff) | |
download | dagger2-408431a3bb4db983f27bb96122167ca4cf41322e.tar.gz |
Ban @Inject protected field.
RELNOTES=Ban @Inject protected field.
PiperOrigin-RevId: 595746282
-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")); }); } |