@@ -506,6 +506,109 @@ public void falsePositiveCyclicDependencyIndirectionDetected() {
506
506
.onLine (28 );
507
507
}
508
508
509
+ @ Test
510
+ public void circularBindsMethods () {
511
+ JavaFileObject qualifier =
512
+ JavaFileObjects .forSourceLines (
513
+ "test.SomeQualifier" ,
514
+ "package test;" ,
515
+ "" ,
516
+ "import javax.inject.Qualifier;" ,
517
+ "" ,
518
+ "@Qualifier @interface SomeQualifier {}" );
519
+ JavaFileObject module =
520
+ JavaFileObjects .forSourceLines (
521
+ "test.TestModule" ,
522
+ "package test;" ,
523
+ "" ,
524
+ "import dagger.Binds;" ,
525
+ "import dagger.Module;" ,
526
+ "" ,
527
+ "@Module" ,
528
+ "abstract class TestModule {" ,
529
+ " @Binds abstract Object bindUnqualified(@SomeQualifier Object qualified);" ,
530
+ " @Binds @SomeQualifier abstract Object bindQualified(Object unqualified);" ,
531
+ "}" );
532
+ JavaFileObject component =
533
+ JavaFileObjects .forSourceLines (
534
+ "test.TestComponent" ,
535
+ "package test;" ,
536
+ "" ,
537
+ "import dagger.Component;" ,
538
+ "" ,
539
+ "@Component(modules = TestModule.class)" ,
540
+ "interface TestComponent {" ,
541
+ " Object unqualified();" ,
542
+ " @SomeQualifier Object qualified();" ,
543
+ "}" );
544
+
545
+ assertThat (qualifier , module , component )
546
+ .processedWith (new ComponentProcessor ())
547
+ .failsToCompile ()
548
+ .withErrorContaining (
549
+ "test.TestComponent.unqualified() contains a dependency cycle:\n "
550
+ + " java.lang.Object is injected at\n "
551
+ + " test.TestModule.bindQualified(unqualified)\n "
552
+ + " @test.SomeQualifier java.lang.Object is injected at\n "
553
+ + " test.TestModule.bindUnqualified(qualified)\n "
554
+ + " java.lang.Object is provided at\n "
555
+ + " test.TestComponent.unqualified()" )
556
+ .in (component )
557
+ .onLine (7 )
558
+ .and ()
559
+ .withErrorContaining (
560
+ "test.TestComponent.qualified() contains a dependency cycle:\n "
561
+ + " @test.SomeQualifier java.lang.Object is injected at\n "
562
+ + " test.TestModule.bindUnqualified(qualified)\n "
563
+ + " java.lang.Object is injected at\n "
564
+ + " test.TestModule.bindQualified(unqualified)\n "
565
+ + " @test.SomeQualifier java.lang.Object is provided at\n "
566
+ + " test.TestComponent.qualified()" )
567
+ .in (component )
568
+ .onLine (8 );
569
+ }
570
+
571
+ @ Test
572
+ public void selfReferentialBinds () {
573
+ JavaFileObject module =
574
+ JavaFileObjects .forSourceLines (
575
+ "test.TestModule" ,
576
+ "package test;" ,
577
+ "" ,
578
+ "import dagger.Binds;" ,
579
+ "import dagger.Module;" ,
580
+ "" ,
581
+ "@Module" ,
582
+ "abstract class TestModule {" ,
583
+ " @Binds abstract Object bindToSelf(Object sameKey);" ,
584
+ "}" );
585
+ JavaFileObject component =
586
+ JavaFileObjects .forSourceLines (
587
+ "test.TestComponent" ,
588
+ "package test;" ,
589
+ "" ,
590
+ "import dagger.Component;" ,
591
+ "" ,
592
+ "@Component(modules = TestModule.class)" ,
593
+ "interface TestComponent {" ,
594
+ " Object selfReferential();" ,
595
+ "}" );
596
+
597
+ assertThat (module , component )
598
+ .processedWith (new ComponentProcessor ())
599
+ .failsToCompile ()
600
+ .withErrorContaining (
601
+ // TODO(gak): cl/126230644 produces a better error message in this case. Here it isn't
602
+ // unclear what is going wrong.
603
+ "test.TestComponent.selfReferential() contains a dependency cycle:\n "
604
+ + " java.lang.Object is injected at\n "
605
+ + " test.TestModule.bindToSelf(sameKey)\n "
606
+ + " java.lang.Object is provided at\n "
607
+ + " test.TestComponent.selfReferential()" )
608
+ .in (component )
609
+ .onLine (7 );
610
+ }
611
+
509
612
@ Test public void duplicateExplicitBindings_ProvidesAndComponentProvision () {
510
613
JavaFileObject component = JavaFileObjects .forSourceLines ("test.Outer" ,
511
614
"package test;" ,
0 commit comments