xref: /aosp_15_r20/external/dagger2/javatests/dagger/internal/codegen/MembersInjectionValidationTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang /*
2*f585d8a3SJacky Wang  * Copyright (C) 2018 The Dagger Authors.
3*f585d8a3SJacky Wang  *
4*f585d8a3SJacky Wang  * Licensed under the Apache License, Version 2.0 (the "License");
5*f585d8a3SJacky Wang  * you may not use this file except in compliance with the License.
6*f585d8a3SJacky Wang  * You may obtain a copy of the License at
7*f585d8a3SJacky Wang  *
8*f585d8a3SJacky Wang  * http://www.apache.org/licenses/LICENSE-2.0
9*f585d8a3SJacky Wang  *
10*f585d8a3SJacky Wang  * Unless required by applicable law or agreed to in writing, software
11*f585d8a3SJacky Wang  * distributed under the License is distributed on an "AS IS" BASIS,
12*f585d8a3SJacky Wang  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f585d8a3SJacky Wang  * See the License for the specific language governing permissions and
14*f585d8a3SJacky Wang  * limitations under the License.
15*f585d8a3SJacky Wang  */
16*f585d8a3SJacky Wang 
17*f585d8a3SJacky Wang package dagger.internal.codegen;
18*f585d8a3SJacky Wang 
19*f585d8a3SJacky Wang import androidx.room.compiler.processing.util.Source;
20*f585d8a3SJacky Wang import dagger.testing.compile.CompilerTests;
21*f585d8a3SJacky Wang import org.junit.Test;
22*f585d8a3SJacky Wang import org.junit.runner.RunWith;
23*f585d8a3SJacky Wang import org.junit.runners.JUnit4;
24*f585d8a3SJacky Wang 
25*f585d8a3SJacky Wang /**
26*f585d8a3SJacky Wang  * Tests that errors are reported for invalid members injection methods and {@link
27*f585d8a3SJacky Wang  * dagger.MembersInjector} dependency requests.
28*f585d8a3SJacky Wang  */
29*f585d8a3SJacky Wang @RunWith(JUnit4.class)
30*f585d8a3SJacky Wang public class MembersInjectionValidationTest {
31*f585d8a3SJacky Wang   @Test
membersInjectDependsOnUnboundedType()32*f585d8a3SJacky Wang   public void membersInjectDependsOnUnboundedType() {
33*f585d8a3SJacky Wang     Source injectsUnboundedType =
34*f585d8a3SJacky Wang         CompilerTests.javaSource(
35*f585d8a3SJacky Wang             "test.InjectsUnboundedType",
36*f585d8a3SJacky Wang             "package test;",
37*f585d8a3SJacky Wang             "",
38*f585d8a3SJacky Wang             "import dagger.MembersInjector;",
39*f585d8a3SJacky Wang             "import java.util.ArrayList;",
40*f585d8a3SJacky Wang             "import javax.inject.Inject;",
41*f585d8a3SJacky Wang             "",
42*f585d8a3SJacky Wang             "class InjectsUnboundedType {",
43*f585d8a3SJacky Wang             "  @Inject MembersInjector<ArrayList<?>> listInjector;",
44*f585d8a3SJacky Wang             "}");
45*f585d8a3SJacky Wang 
46*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(injectsUnboundedType)
47*f585d8a3SJacky Wang         .compile(
48*f585d8a3SJacky Wang             subject -> {
49*f585d8a3SJacky Wang               subject.hasErrorCount(1);
50*f585d8a3SJacky Wang               subject.hasErrorContaining(
51*f585d8a3SJacky Wang                       "Cannot inject members into types with unbounded type arguments: "
52*f585d8a3SJacky Wang                           + "java.util.ArrayList<?>")
53*f585d8a3SJacky Wang                   .onSource(injectsUnboundedType)
54*f585d8a3SJacky Wang                   .onLineContaining("@Inject MembersInjector<ArrayList<?>> listInjector;");
55*f585d8a3SJacky Wang             });
56*f585d8a3SJacky Wang   }
57*f585d8a3SJacky Wang 
58*f585d8a3SJacky Wang   @Test
membersInjectPrimitive()59*f585d8a3SJacky Wang   public void membersInjectPrimitive() {
60*f585d8a3SJacky Wang     Source component =
61*f585d8a3SJacky Wang         CompilerTests.javaSource(
62*f585d8a3SJacky Wang             "test.TestComponent",
63*f585d8a3SJacky Wang             "package test;",
64*f585d8a3SJacky Wang             "",
65*f585d8a3SJacky Wang             "import dagger.Component;",
66*f585d8a3SJacky Wang             "",
67*f585d8a3SJacky Wang             "@Component",
68*f585d8a3SJacky Wang             "interface TestComponent {",
69*f585d8a3SJacky Wang             "  void inject(int primitive);",
70*f585d8a3SJacky Wang             "}");
71*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component)
72*f585d8a3SJacky Wang         .compile(
73*f585d8a3SJacky Wang             subject -> {
74*f585d8a3SJacky Wang               subject.hasErrorCount(1);
75*f585d8a3SJacky Wang               subject.hasErrorContaining("Cannot inject members into int")
76*f585d8a3SJacky Wang                   .onSource(component)
77*f585d8a3SJacky Wang                   .onLineContaining("void inject(int primitive);");
78*f585d8a3SJacky Wang             });
79*f585d8a3SJacky Wang   }
80*f585d8a3SJacky Wang 
81*f585d8a3SJacky Wang   @Test
membersInjectArray()82*f585d8a3SJacky Wang   public void membersInjectArray() {
83*f585d8a3SJacky Wang     Source component =
84*f585d8a3SJacky Wang         CompilerTests.javaSource(
85*f585d8a3SJacky Wang             "test.TestComponent",
86*f585d8a3SJacky Wang             "package test;",
87*f585d8a3SJacky Wang             "",
88*f585d8a3SJacky Wang             "import dagger.Component;",
89*f585d8a3SJacky Wang             "",
90*f585d8a3SJacky Wang             "@Component",
91*f585d8a3SJacky Wang             "interface TestComponent {",
92*f585d8a3SJacky Wang             "  void inject(Object[] array);",
93*f585d8a3SJacky Wang             "}");
94*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component)
95*f585d8a3SJacky Wang         .compile(
96*f585d8a3SJacky Wang             subject -> {
97*f585d8a3SJacky Wang               subject.hasErrorCount(1);
98*f585d8a3SJacky Wang               subject.hasErrorContaining("Cannot inject members into java.lang.Object[]")
99*f585d8a3SJacky Wang                   .onSource(component)
100*f585d8a3SJacky Wang                   .onLineContaining("void inject(Object[] array);");
101*f585d8a3SJacky Wang             });
102*f585d8a3SJacky Wang   }
103*f585d8a3SJacky Wang 
104*f585d8a3SJacky Wang   @Test
membersInjectorOfArray()105*f585d8a3SJacky Wang   public void membersInjectorOfArray() {
106*f585d8a3SJacky Wang     Source component =
107*f585d8a3SJacky Wang         CompilerTests.javaSource(
108*f585d8a3SJacky Wang             "test.TestComponent",
109*f585d8a3SJacky Wang             "package test;",
110*f585d8a3SJacky Wang             "",
111*f585d8a3SJacky Wang             "import dagger.Component;",
112*f585d8a3SJacky Wang             "import dagger.MembersInjector;",
113*f585d8a3SJacky Wang             "",
114*f585d8a3SJacky Wang             "@Component",
115*f585d8a3SJacky Wang             "interface TestComponent {",
116*f585d8a3SJacky Wang             "  MembersInjector<Object[]> objectArrayInjector();",
117*f585d8a3SJacky Wang             "}");
118*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component)
119*f585d8a3SJacky Wang         .compile(
120*f585d8a3SJacky Wang             subject -> {
121*f585d8a3SJacky Wang               subject.hasErrorCount(1);
122*f585d8a3SJacky Wang               subject.hasErrorContaining("Cannot inject members into java.lang.Object[]")
123*f585d8a3SJacky Wang                   .onSource(component)
124*f585d8a3SJacky Wang                   .onLineContaining("objectArrayInjector();");
125*f585d8a3SJacky Wang             });
126*f585d8a3SJacky Wang   }
127*f585d8a3SJacky Wang 
128*f585d8a3SJacky Wang   @Test
membersInjectRawType()129*f585d8a3SJacky Wang   public void membersInjectRawType() {
130*f585d8a3SJacky Wang     Source component =
131*f585d8a3SJacky Wang         CompilerTests.javaSource(
132*f585d8a3SJacky Wang             "test.TestComponent",
133*f585d8a3SJacky Wang             "package test;",
134*f585d8a3SJacky Wang             "",
135*f585d8a3SJacky Wang             "import dagger.Component;",
136*f585d8a3SJacky Wang             "import java.util.Set;",
137*f585d8a3SJacky Wang             "",
138*f585d8a3SJacky Wang             "@Component",
139*f585d8a3SJacky Wang             "interface TestComponent {",
140*f585d8a3SJacky Wang             "  void inject(Set rawSet);",
141*f585d8a3SJacky Wang             "}");
142*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component)
143*f585d8a3SJacky Wang         .compile(
144*f585d8a3SJacky Wang             subject -> {
145*f585d8a3SJacky Wang               subject.hasErrorCount(1);
146*f585d8a3SJacky Wang               subject.hasErrorContaining("Cannot inject members into raw type java.util.Set");
147*f585d8a3SJacky Wang             });
148*f585d8a3SJacky Wang   }
149*f585d8a3SJacky Wang 
150*f585d8a3SJacky Wang   @Test
qualifiedMembersInjector()151*f585d8a3SJacky Wang   public void qualifiedMembersInjector() {
152*f585d8a3SJacky Wang     Source component =
153*f585d8a3SJacky Wang         CompilerTests.javaSource(
154*f585d8a3SJacky Wang             "test.TestComponent",
155*f585d8a3SJacky Wang             "package test;",
156*f585d8a3SJacky Wang             "",
157*f585d8a3SJacky Wang             "import dagger.Component;",
158*f585d8a3SJacky Wang             "import dagger.MembersInjector;",
159*f585d8a3SJacky Wang             "import javax.inject.Named;",
160*f585d8a3SJacky Wang             "",
161*f585d8a3SJacky Wang             "@Component",
162*f585d8a3SJacky Wang             "interface TestComponent {",
163*f585d8a3SJacky Wang             "  @Named(\"foo\") MembersInjector<Object> objectInjector();",
164*f585d8a3SJacky Wang             "}");
165*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component)
166*f585d8a3SJacky Wang         .compile(
167*f585d8a3SJacky Wang             subject -> {
168*f585d8a3SJacky Wang               subject.hasErrorCount(1);
169*f585d8a3SJacky Wang               subject.hasErrorContaining("Cannot inject members into qualified types")
170*f585d8a3SJacky Wang                   .onSource(component)
171*f585d8a3SJacky Wang                   .onLineContaining("objectInjector();");
172*f585d8a3SJacky Wang             });
173*f585d8a3SJacky Wang   }
174*f585d8a3SJacky Wang 
175*f585d8a3SJacky Wang   @Test
qualifiedMembersInjectionMethod()176*f585d8a3SJacky Wang   public void qualifiedMembersInjectionMethod() {
177*f585d8a3SJacky Wang     Source component =
178*f585d8a3SJacky Wang         CompilerTests.javaSource(
179*f585d8a3SJacky Wang             "test.TestComponent",
180*f585d8a3SJacky Wang             "package test;",
181*f585d8a3SJacky Wang             "",
182*f585d8a3SJacky Wang             "import dagger.Component;",
183*f585d8a3SJacky Wang             "import dagger.MembersInjector;",
184*f585d8a3SJacky Wang             "import javax.inject.Named;",
185*f585d8a3SJacky Wang             "",
186*f585d8a3SJacky Wang             "@Component",
187*f585d8a3SJacky Wang             "interface TestComponent {",
188*f585d8a3SJacky Wang             "  @Named(\"foo\") void injectObject(Object object);",
189*f585d8a3SJacky Wang             "}");
190*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component)
191*f585d8a3SJacky Wang         .compile(
192*f585d8a3SJacky Wang             subject -> {
193*f585d8a3SJacky Wang               subject.hasErrorCount(1);
194*f585d8a3SJacky Wang               subject.hasErrorContaining("Cannot inject members into qualified types")
195*f585d8a3SJacky Wang                   .onSource(component)
196*f585d8a3SJacky Wang                   .onLineContaining("injectObject(Object object);");
197*f585d8a3SJacky Wang             });
198*f585d8a3SJacky Wang   }
199*f585d8a3SJacky Wang 
200*f585d8a3SJacky Wang   @Test
qualifiedMembersInjectionMethodParameter()201*f585d8a3SJacky Wang   public void qualifiedMembersInjectionMethodParameter() {
202*f585d8a3SJacky Wang     Source component =
203*f585d8a3SJacky Wang         CompilerTests.javaSource(
204*f585d8a3SJacky Wang             "test.TestComponent",
205*f585d8a3SJacky Wang             "package test;",
206*f585d8a3SJacky Wang             "",
207*f585d8a3SJacky Wang             "import dagger.Component;",
208*f585d8a3SJacky Wang             "import dagger.MembersInjector;",
209*f585d8a3SJacky Wang             "import javax.inject.Named;",
210*f585d8a3SJacky Wang             "",
211*f585d8a3SJacky Wang             "@Component",
212*f585d8a3SJacky Wang             "interface TestComponent {",
213*f585d8a3SJacky Wang             "  void injectObject(@Named(\"foo\") Object object);",
214*f585d8a3SJacky Wang             "}");
215*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component)
216*f585d8a3SJacky Wang         .compile(
217*f585d8a3SJacky Wang             subject -> {
218*f585d8a3SJacky Wang               subject.hasErrorCount(1);
219*f585d8a3SJacky Wang               subject.hasErrorContaining("Cannot inject members into qualified types")
220*f585d8a3SJacky Wang                   .onSource(component)
221*f585d8a3SJacky Wang                   .onLineContaining("injectObject(@Named(\"foo\") Object object);");
222*f585d8a3SJacky Wang             });
223*f585d8a3SJacky Wang   }
224*f585d8a3SJacky Wang 
225*f585d8a3SJacky Wang   @Test
staticFieldInjection()226*f585d8a3SJacky Wang   public void staticFieldInjection() {
227*f585d8a3SJacky Wang     Source injected =
228*f585d8a3SJacky Wang         CompilerTests.javaSource(
229*f585d8a3SJacky Wang             "test.Injected",
230*f585d8a3SJacky Wang             "package test;",
231*f585d8a3SJacky Wang             "",
232*f585d8a3SJacky Wang             "import javax.inject.Inject;",
233*f585d8a3SJacky Wang             "",
234*f585d8a3SJacky Wang             "final class Injected {",
235*f585d8a3SJacky Wang             "  @Inject static Object object;",
236*f585d8a3SJacky Wang             "}");
237*f585d8a3SJacky Wang     Source component =
238*f585d8a3SJacky Wang         CompilerTests.javaSource(
239*f585d8a3SJacky Wang             "test.TestComponent",
240*f585d8a3SJacky Wang             "package test;",
241*f585d8a3SJacky Wang             "",
242*f585d8a3SJacky Wang             "import dagger.Component;",
243*f585d8a3SJacky Wang             "",
244*f585d8a3SJacky Wang             "@Component",
245*f585d8a3SJacky Wang             "interface TestComponent {",
246*f585d8a3SJacky Wang             "  void inject(Injected injected);",
247*f585d8a3SJacky Wang             "}");
248*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(injected, component)
249*f585d8a3SJacky Wang         .compile(
250*f585d8a3SJacky Wang             subject -> {
251*f585d8a3SJacky Wang               subject.hasErrorCount(2);
252*f585d8a3SJacky Wang               subject.hasErrorContaining("static fields")
253*f585d8a3SJacky Wang                   .onSource(injected)
254*f585d8a3SJacky Wang                   .onLine(6);
255*f585d8a3SJacky Wang               subject.hasErrorContaining(
256*f585d8a3SJacky Wang                   "Injected cannot be provided without an @Inject constructor or an "
257*f585d8a3SJacky Wang                       + "@Provides-annotated method.");
258*f585d8a3SJacky Wang             });
259*f585d8a3SJacky Wang   }
260*f585d8a3SJacky Wang 
261*f585d8a3SJacky Wang   @Test
missingMembersInjectorForKotlinProperty()262*f585d8a3SJacky Wang   public void missingMembersInjectorForKotlinProperty() {
263*f585d8a3SJacky Wang     Source component =
264*f585d8a3SJacky Wang         CompilerTests.javaSource(
265*f585d8a3SJacky Wang             "test.TestComponent",
266*f585d8a3SJacky Wang             "package test;",
267*f585d8a3SJacky Wang             "",
268*f585d8a3SJacky Wang             "import dagger.Component;",
269*f585d8a3SJacky Wang             "import dagger.internal.codegen.KotlinInjectedQualifier;",
270*f585d8a3SJacky Wang             "",
271*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
272*f585d8a3SJacky Wang             "interface TestComponent {",
273*f585d8a3SJacky Wang             "  void inject(KotlinInjectedQualifier injected);",
274*f585d8a3SJacky Wang             "}");
275*f585d8a3SJacky Wang     Source module =
276*f585d8a3SJacky Wang         CompilerTests.javaSource(
277*f585d8a3SJacky Wang             "test.TestModule",
278*f585d8a3SJacky Wang             "package test;",
279*f585d8a3SJacky Wang             "",
280*f585d8a3SJacky Wang             "import dagger.Module;",
281*f585d8a3SJacky Wang             "import dagger.Provides;",
282*f585d8a3SJacky Wang             "import javax.inject.Named;",
283*f585d8a3SJacky Wang             "",
284*f585d8a3SJacky Wang             "@Module",
285*f585d8a3SJacky Wang             "class TestModule {",
286*f585d8a3SJacky Wang             "  @Provides",
287*f585d8a3SJacky Wang             "  @Named(\"TheString\")",
288*f585d8a3SJacky Wang             "  String theString() { return \"\"; }",
289*f585d8a3SJacky Wang             "}");
290*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component, module)
291*f585d8a3SJacky Wang         .compile(
292*f585d8a3SJacky Wang             subject -> {
293*f585d8a3SJacky Wang               switch (CompilerTests.backend(subject)) {
294*f585d8a3SJacky Wang                 case KSP:
295*f585d8a3SJacky Wang                   // KSP works fine in this case so we shouldn't expect any errors here.
296*f585d8a3SJacky Wang                   subject.hasErrorCount(0);
297*f585d8a3SJacky Wang                   break;
298*f585d8a3SJacky Wang                 case JAVAC:
299*f585d8a3SJacky Wang                   subject.hasErrorCount(2);
300*f585d8a3SJacky Wang                   subject.hasErrorContaining(
301*f585d8a3SJacky Wang                       "Unable to read annotations on an injected Kotlin property.");
302*f585d8a3SJacky Wang                   subject.hasErrorContaining("KotlinInjectedQualifier cannot be provided");
303*f585d8a3SJacky Wang                   break;
304*f585d8a3SJacky Wang               }
305*f585d8a3SJacky Wang             });
306*f585d8a3SJacky Wang   }
307*f585d8a3SJacky Wang 
308*f585d8a3SJacky Wang   @Test
memberInjectionForKotlinObjectFails()309*f585d8a3SJacky Wang   public void memberInjectionForKotlinObjectFails() {
310*f585d8a3SJacky Wang     Source component =
311*f585d8a3SJacky Wang         CompilerTests.javaSource(
312*f585d8a3SJacky Wang             "test.TestComponent",
313*f585d8a3SJacky Wang             "package test;",
314*f585d8a3SJacky Wang             "",
315*f585d8a3SJacky Wang             "import dagger.Component;",
316*f585d8a3SJacky Wang             "import dagger.internal.codegen.KotlinObjectWithMemberInjection;",
317*f585d8a3SJacky Wang             "",
318*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
319*f585d8a3SJacky Wang             "interface TestComponent {",
320*f585d8a3SJacky Wang             "  void inject(KotlinObjectWithMemberInjection injected);",
321*f585d8a3SJacky Wang             "}");
322*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component, testModule)
323*f585d8a3SJacky Wang         .compile(
324*f585d8a3SJacky Wang             subject -> {
325*f585d8a3SJacky Wang               switch (CompilerTests.backend(subject)) {
326*f585d8a3SJacky Wang                 case KSP:
327*f585d8a3SJacky Wang                   subject.hasErrorCount(2);
328*f585d8a3SJacky Wang                   break;
329*f585d8a3SJacky Wang                 case JAVAC:
330*f585d8a3SJacky Wang                   subject.hasErrorCount(3);
331*f585d8a3SJacky Wang                   subject.hasErrorContaining(
332*f585d8a3SJacky Wang                       "Dagger does not support injection into static fields");
333*f585d8a3SJacky Wang                   break;
334*f585d8a3SJacky Wang               }
335*f585d8a3SJacky Wang               subject.hasErrorContaining("Dagger does not support injection into Kotlin objects");
336*f585d8a3SJacky Wang               subject.hasErrorContaining("KotlinObjectWithMemberInjection cannot be provided");
337*f585d8a3SJacky Wang             });
338*f585d8a3SJacky Wang   }
339*f585d8a3SJacky Wang 
340*f585d8a3SJacky Wang   @Test
setterMemberInjectionForKotlinObjectFails()341*f585d8a3SJacky Wang   public void setterMemberInjectionForKotlinObjectFails() {
342*f585d8a3SJacky Wang     Source component =
343*f585d8a3SJacky Wang         CompilerTests.javaSource(
344*f585d8a3SJacky Wang             "test.TestComponent",
345*f585d8a3SJacky Wang             "package test;",
346*f585d8a3SJacky Wang             "",
347*f585d8a3SJacky Wang             "import dagger.Component;",
348*f585d8a3SJacky Wang             "import dagger.internal.codegen.KotlinObjectWithSetterMemberInjection;",
349*f585d8a3SJacky Wang             "",
350*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
351*f585d8a3SJacky Wang             "interface TestComponent {",
352*f585d8a3SJacky Wang             "  void inject(KotlinObjectWithSetterMemberInjection injected);",
353*f585d8a3SJacky Wang             "}");
354*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component, testModule)
355*f585d8a3SJacky Wang         .compile(
356*f585d8a3SJacky Wang             subject -> {
357*f585d8a3SJacky Wang               subject.hasErrorCount(2);
358*f585d8a3SJacky Wang               subject.hasErrorContaining("Dagger does not support injection into Kotlin objects");
359*f585d8a3SJacky Wang               subject.hasErrorContaining(
360*f585d8a3SJacky Wang                   "KotlinObjectWithSetterMemberInjection cannot be provided without an "
361*f585d8a3SJacky Wang                       + "@Provides-annotated method.");
362*f585d8a3SJacky Wang             });
363*f585d8a3SJacky Wang   }
364*f585d8a3SJacky Wang 
365*f585d8a3SJacky Wang   @Test
memberInjectionForKotlinClassWithCompanionObjectFails()366*f585d8a3SJacky Wang   public void memberInjectionForKotlinClassWithCompanionObjectFails() {
367*f585d8a3SJacky Wang     Source component =
368*f585d8a3SJacky Wang         CompilerTests.javaSource(
369*f585d8a3SJacky Wang             "test.TestComponent",
370*f585d8a3SJacky Wang             "package test;",
371*f585d8a3SJacky Wang             "",
372*f585d8a3SJacky Wang             "import dagger.Component;",
373*f585d8a3SJacky Wang             "import dagger.internal.codegen.KotlinClassWithMemberInjectedCompanion;",
374*f585d8a3SJacky Wang             "",
375*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
376*f585d8a3SJacky Wang             "interface TestComponent {",
377*f585d8a3SJacky Wang             "  void inject(KotlinClassWithMemberInjectedCompanion injected);",
378*f585d8a3SJacky Wang             "  void injectCompanion(KotlinClassWithMemberInjectedCompanion.Companion injected);",
379*f585d8a3SJacky Wang             "}");
380*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component, testModule)
381*f585d8a3SJacky Wang         .compile(
382*f585d8a3SJacky Wang             subject -> {
383*f585d8a3SJacky Wang               switch (CompilerTests.backend(subject)) {
384*f585d8a3SJacky Wang                 case KSP:
385*f585d8a3SJacky Wang                   subject.hasErrorCount(4);
386*f585d8a3SJacky Wang                   subject.hasErrorContaining(
387*f585d8a3SJacky Wang                       "Dagger does not support injection into Kotlin objects");
388*f585d8a3SJacky Wang                   break;
389*f585d8a3SJacky Wang                 case JAVAC:
390*f585d8a3SJacky Wang                   subject.hasErrorCount(2);
391*f585d8a3SJacky Wang                   break;
392*f585d8a3SJacky Wang               }
393*f585d8a3SJacky Wang               subject.hasErrorContaining("Dagger does not support injection into static fields");
394*f585d8a3SJacky Wang               subject.hasErrorContaining(
395*f585d8a3SJacky Wang                   "KotlinClassWithMemberInjectedCompanion cannot be provided");
396*f585d8a3SJacky Wang             });
397*f585d8a3SJacky Wang   }
398*f585d8a3SJacky Wang 
399*f585d8a3SJacky Wang   @Test
setterMemberInjectionForKotlinClassWithCompanionObjectFails()400*f585d8a3SJacky Wang   public void setterMemberInjectionForKotlinClassWithCompanionObjectFails() {
401*f585d8a3SJacky Wang     Source component =
402*f585d8a3SJacky Wang         CompilerTests.javaSource(
403*f585d8a3SJacky Wang             "test.TestComponent",
404*f585d8a3SJacky Wang             "package test;",
405*f585d8a3SJacky Wang             "",
406*f585d8a3SJacky Wang             "import dagger.Component;",
407*f585d8a3SJacky Wang             "import dagger.internal.codegen.KotlinClassWithSetterMemberInjectedCompanion;",
408*f585d8a3SJacky Wang             "",
409*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
410*f585d8a3SJacky Wang             "interface TestComponent {",
411*f585d8a3SJacky Wang             "  void inject(KotlinClassWithSetterMemberInjectedCompanion.Companion injected);",
412*f585d8a3SJacky Wang             "}");
413*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component, testModule)
414*f585d8a3SJacky Wang         .compile(
415*f585d8a3SJacky Wang             subject -> {
416*f585d8a3SJacky Wang               switch (CompilerTests.backend(subject)) {
417*f585d8a3SJacky Wang                 case KSP:
418*f585d8a3SJacky Wang                   // TODO(b/268257007): The KSP results should match KAPT once this bug is fixed.
419*f585d8a3SJacky Wang                   subject.hasErrorCount(3);
420*f585d8a3SJacky Wang                   subject.hasErrorContaining(
421*f585d8a3SJacky Wang                       "Dagger does not support injection into static methods");
422*f585d8a3SJacky Wang                   break;
423*f585d8a3SJacky Wang                 case JAVAC:
424*f585d8a3SJacky Wang                   subject.hasErrorCount(2);
425*f585d8a3SJacky Wang                   break;
426*f585d8a3SJacky Wang               }
427*f585d8a3SJacky Wang               subject.hasErrorContaining("Dagger does not support injection into Kotlin objects");
428*f585d8a3SJacky Wang               subject.hasErrorContaining(
429*f585d8a3SJacky Wang                   "KotlinClassWithSetterMemberInjectedCompanion.Companion cannot be provided");
430*f585d8a3SJacky Wang             });
431*f585d8a3SJacky Wang   }
432*f585d8a3SJacky Wang 
433*f585d8a3SJacky Wang   @Test
memberInjectionForKotlinClassWithNamedCompanionObjectFails()434*f585d8a3SJacky Wang   public void memberInjectionForKotlinClassWithNamedCompanionObjectFails() {
435*f585d8a3SJacky Wang     Source component =
436*f585d8a3SJacky Wang         CompilerTests.javaSource(
437*f585d8a3SJacky Wang             "test.TestComponent",
438*f585d8a3SJacky Wang             "package test;",
439*f585d8a3SJacky Wang             "",
440*f585d8a3SJacky Wang             "import dagger.Component;",
441*f585d8a3SJacky Wang             "import dagger.internal.codegen.KotlinClassWithMemberInjectedNamedCompanion;",
442*f585d8a3SJacky Wang             "",
443*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
444*f585d8a3SJacky Wang             "interface TestComponent {",
445*f585d8a3SJacky Wang             "  void inject(KotlinClassWithMemberInjectedNamedCompanion injected);",
446*f585d8a3SJacky Wang             "  void injectCompanion(KotlinClassWithMemberInjectedNamedCompanion.TheCompanion"
447*f585d8a3SJacky Wang                 + " injected);",
448*f585d8a3SJacky Wang             "}");
449*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component, testModule)
450*f585d8a3SJacky Wang         .compile(
451*f585d8a3SJacky Wang             subject -> {
452*f585d8a3SJacky Wang               switch (CompilerTests.backend(subject)) {
453*f585d8a3SJacky Wang                 case KSP:
454*f585d8a3SJacky Wang                   subject.hasErrorCount(4);
455*f585d8a3SJacky Wang                   subject.hasErrorContaining(
456*f585d8a3SJacky Wang                       "Dagger does not support injection into Kotlin objects");
457*f585d8a3SJacky Wang                   break;
458*f585d8a3SJacky Wang                 case JAVAC:
459*f585d8a3SJacky Wang                   subject.hasErrorCount(2);
460*f585d8a3SJacky Wang                   break;
461*f585d8a3SJacky Wang               }
462*f585d8a3SJacky Wang               subject.hasErrorContaining("Dagger does not support injection into static fields");
463*f585d8a3SJacky Wang               subject.hasErrorContaining(
464*f585d8a3SJacky Wang                   "KotlinClassWithMemberInjectedNamedCompanion cannot be provided");
465*f585d8a3SJacky Wang             });
466*f585d8a3SJacky Wang   }
467*f585d8a3SJacky Wang 
468*f585d8a3SJacky Wang   @Test
setterMemberInjectionForKotlinClassWithNamedCompanionObjectFails()469*f585d8a3SJacky Wang   public void setterMemberInjectionForKotlinClassWithNamedCompanionObjectFails() {
470*f585d8a3SJacky Wang     Source component =
471*f585d8a3SJacky Wang         CompilerTests.javaSource(
472*f585d8a3SJacky Wang             "test.TestComponent",
473*f585d8a3SJacky Wang             "package test;",
474*f585d8a3SJacky Wang             "",
475*f585d8a3SJacky Wang             "import dagger.Component;",
476*f585d8a3SJacky Wang             "import dagger.internal.codegen.KotlinClassWithSetterMemberInjectedNamedCompanion;",
477*f585d8a3SJacky Wang             "",
478*f585d8a3SJacky Wang             "@Component(modules = TestModule.class)",
479*f585d8a3SJacky Wang             "interface TestComponent {",
480*f585d8a3SJacky Wang             "  void inject(",
481*f585d8a3SJacky Wang             "      KotlinClassWithSetterMemberInjectedNamedCompanion.TheCompanion injected);",
482*f585d8a3SJacky Wang             "}");
483*f585d8a3SJacky Wang     CompilerTests.daggerCompiler(component, testModule)
484*f585d8a3SJacky Wang         .compile(
485*f585d8a3SJacky Wang             subject -> {
486*f585d8a3SJacky Wang               switch (CompilerTests.backend(subject)) {
487*f585d8a3SJacky Wang                 case KSP:
488*f585d8a3SJacky Wang                   // TODO(b/268257007): The KSP results should match KAPT once this bug is fixed.
489*f585d8a3SJacky Wang                   subject.hasErrorCount(3);
490*f585d8a3SJacky Wang                   subject.hasErrorContaining(
491*f585d8a3SJacky Wang                       "Dagger does not support injection into static methods");
492*f585d8a3SJacky Wang                   break;
493*f585d8a3SJacky Wang                 case JAVAC:
494*f585d8a3SJacky Wang                   subject.hasErrorCount(2);
495*f585d8a3SJacky Wang                   break;
496*f585d8a3SJacky Wang               }
497*f585d8a3SJacky Wang               subject.hasErrorContaining("Dagger does not support injection into Kotlin objects");
498*f585d8a3SJacky Wang               subject.hasErrorContaining(
499*f585d8a3SJacky Wang                   "KotlinClassWithSetterMemberInjectedNamedCompanion.TheCompanion "
500*f585d8a3SJacky Wang                       + "cannot be provided");
501*f585d8a3SJacky Wang             });
502*f585d8a3SJacky Wang   }
503*f585d8a3SJacky Wang 
504*f585d8a3SJacky Wang   private final Source testModule =
505*f585d8a3SJacky Wang         CompilerTests.javaSource(
506*f585d8a3SJacky Wang           "test.TestModule",
507*f585d8a3SJacky Wang           "package test;",
508*f585d8a3SJacky Wang           "",
509*f585d8a3SJacky Wang           "import dagger.Module;",
510*f585d8a3SJacky Wang           "import dagger.Provides;",
511*f585d8a3SJacky Wang           "",
512*f585d8a3SJacky Wang           "@Module",
513*f585d8a3SJacky Wang           "class TestModule {",
514*f585d8a3SJacky Wang           "  @Provides",
515*f585d8a3SJacky Wang           "  String theString() { return \"\"; }",
516*f585d8a3SJacky Wang           "}");
517*f585d8a3SJacky Wang }
518