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