aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWanying Ding <wanyingd@google.com>2024-01-04 10:42:47 -0800
committerDagger Team <dagger-dev+copybara@google.com>2024-01-04 10:47:52 -0800
commit408431a3bb4db983f27bb96122167ca4cf41322e (patch)
treedaeaf81d8ab1602e08a5512ad79e8cacc54076ad
parent09289eb52a5d18266981753d53b5e81fba87a1c2 (diff)
downloaddagger2-408431a3bb4db983f27bb96122167ca4cf41322e.tar.gz
Ban @Inject protected field.
RELNOTES=Ban @Inject protected field. PiperOrigin-RevId: 595746282
-rw-r--r--java/dagger/internal/codegen/validation/InjectValidator.java10
-rw-r--r--javatests/dagger/internal/codegen/MembersInjectionTest.java85
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"));
});
}