@@ -20,7 +20,6 @@ import com.google.common.truth.Truth.assertThat
20
20
import com.google.devtools.build.lib.view.proto.Deps
21
21
import io.bazel.kotlin.builder.Deps.*
22
22
import io.bazel.kotlin.builder.KotlinJvmTestBuilder
23
- import io.bazel.kotlin.builder.utils.BazelRunFiles
24
23
import org.junit.Test
25
24
import org.junit.runner.RunWith
26
25
import org.junit.runners.Parameterized
@@ -391,7 +390,7 @@ class KotlinBuilderJvmJdepsTest(private val enableK2Compiler: Boolean) {
391
390
}
392
391
393
392
@Test
394
- fun `kotlin indirect property reference on object` () {
393
+ fun `kotlin indirect property reference on object calling helloWorld function ` () {
395
394
val transitivePropertyTarget = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
396
395
c.addSource(
397
396
" Bar.kt" ,
@@ -444,6 +443,62 @@ class KotlinBuilderJvmJdepsTest(private val enableK2Compiler: Boolean) {
444
443
assertIncomplete(jdeps).isEmpty()
445
444
}
446
445
446
+ @Test
447
+ fun `kotlin indirect property reference on object without calling helloWorld function` () {
448
+ val transitivePropertyTarget = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
449
+ c.addSource(
450
+ " Bar.kt" ,
451
+ """
452
+ package something
453
+
454
+ class Bar {
455
+ fun helloWorld() {}
456
+ }
457
+ """
458
+ )
459
+ }
460
+
461
+ val dependentTarget = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
462
+ c.addSource(
463
+ " Foo.kt" ,
464
+ """
465
+ package something
466
+
467
+ class Foo {
468
+ val bar = Bar()
469
+ }
470
+ """
471
+ )
472
+ c.addDirectDependencies(transitivePropertyTarget)
473
+ }
474
+
475
+ val dependingTarget = runJdepsCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
476
+ c.addSource(
477
+ " HasPropertyDependency.kt" ,
478
+ """
479
+ package something
480
+
481
+ class HasPropertyDependency {
482
+ fun something(): Any {
483
+ val foo = Foo()
484
+ return foo.bar
485
+ }
486
+ }
487
+ """
488
+ )
489
+ c.addDirectDependencies(dependentTarget)
490
+ c.addTransitiveDependencies(transitivePropertyTarget)
491
+ }
492
+ val jdeps = depsProto(dependingTarget)
493
+
494
+ assertThat(jdeps.ruleLabel).isEqualTo(dependingTarget.label())
495
+ assertThat(jdeps.dependencyCount).isEqualTo(2 )
496
+ assertExplicit(jdeps).contains(dependentTarget.singleCompileJar())
497
+ assertImplicit(jdeps).contains(transitivePropertyTarget.singleCompileJar())
498
+ assertUnused(jdeps).isEmpty()
499
+ assertIncomplete(jdeps).isEmpty()
500
+ }
501
+
447
502
@Test
448
503
fun `kotlin extension property reference` () {
449
504
val dependentTarget = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
@@ -987,6 +1042,120 @@ class KotlinBuilderJvmJdepsTest(private val enableK2Compiler: Boolean) {
987
1042
assertIncomplete(jdeps).isEmpty()
988
1043
}
989
1044
1045
+ @Test
1046
+ fun `function call on a class should collect the indirect super class of that class as an implicit dependency` () {
1047
+ val implicitSuperClassDep = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
1048
+ c.addSource(
1049
+ " Base.kt" ,
1050
+ """
1051
+ package something
1052
+
1053
+ open class Base
1054
+ """
1055
+ )
1056
+ }
1057
+
1058
+ val explicitSuperClassDep = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
1059
+ c.addSource(
1060
+ " Derived.kt" ,
1061
+ """
1062
+ package something
1063
+
1064
+ class Derived : Base() {
1065
+ fun hi(): String {
1066
+ return "Hello"
1067
+ }
1068
+ }
1069
+ """
1070
+ )
1071
+ c.addDirectDependencies(implicitSuperClassDep)
1072
+ }
1073
+
1074
+ val dependingTarget = runJdepsCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
1075
+ c.addSource(
1076
+ " ReferencesClassWithSuperClass.kt" ,
1077
+ """
1078
+ package something
1079
+
1080
+ class ReferencesClassWithSuperClass {
1081
+ fun stuff(): String {
1082
+ return Derived().hi()
1083
+ }
1084
+ }
1085
+ """
1086
+ )
1087
+ c.addDirectDependencies(explicitSuperClassDep)
1088
+ c.addTransitiveDependencies(implicitSuperClassDep)
1089
+ }
1090
+ val jdeps = depsProto(dependingTarget)
1091
+
1092
+ assertThat(jdeps.ruleLabel).isEqualTo(dependingTarget.label())
1093
+
1094
+ assertExplicit(jdeps).containsExactly(explicitSuperClassDep.singleCompileJar())
1095
+ assertImplicit(jdeps).containsExactly(implicitSuperClassDep.singleCompileJar())
1096
+ assertUnused(jdeps).isEmpty()
1097
+ assertIncomplete(jdeps).isEmpty()
1098
+ }
1099
+
1100
+ @Test
1101
+ fun `creating a kotlin class should collect the indirect java super class, with a kotlin type param class, of that class as an implicit dependency` () {
1102
+ val implicitSuperClassGenericTypeParamDep = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
1103
+ c.addSource(
1104
+ " BaseGenericType.kt" ,
1105
+ """
1106
+ package something
1107
+
1108
+ class BaseGenericType
1109
+ """
1110
+ )
1111
+ }
1112
+
1113
+ val explicitClassWithTypeParamJavaSuperclassDep = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
1114
+ c.addSource(
1115
+ " Derived.kt" ,
1116
+ """
1117
+ package something
1118
+ import something.JavaBaseWithTypeParam
1119
+
1120
+ class Derived : JavaBaseWithTypeParam<BaseGenericType>() {
1121
+ fun hi(): String {
1122
+ return "Hello"
1123
+ }
1124
+ }
1125
+ """
1126
+ )
1127
+ c.addDirectDependencies(TEST_FIXTURES_DEP )
1128
+ c.addDirectDependencies(implicitSuperClassGenericTypeParamDep)
1129
+ }
1130
+
1131
+ val dependingTarget = runJdepsCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
1132
+ c.addSource(
1133
+ " ReferencesClassWithSuperClass.kt" ,
1134
+ """
1135
+ package something
1136
+
1137
+ class ReferencesClassWithSuperClass {
1138
+ fun stuff(): String {
1139
+ val derived = Derived()
1140
+ return derived.toString()
1141
+ }
1142
+ }
1143
+ """
1144
+ )
1145
+ c.addDirectDependencies(explicitClassWithTypeParamJavaSuperclassDep)
1146
+ c.addTransitiveDependencies(TEST_FIXTURES_DEP )
1147
+ c.addTransitiveDependencies(implicitSuperClassGenericTypeParamDep)
1148
+ }
1149
+ val jdeps = depsProto(dependingTarget)
1150
+
1151
+ assertThat(jdeps.ruleLabel).isEqualTo(dependingTarget.label())
1152
+ assertExplicit(jdeps).containsExactly(explicitClassWithTypeParamJavaSuperclassDep.singleCompileJar())
1153
+ assertImplicit(jdeps).contains(TEST_FIXTURES_DEP .singleCompileJar())
1154
+ assertImplicit(jdeps).contains(implicitSuperClassGenericTypeParamDep.singleCompileJar())
1155
+ assertUnused(jdeps).isEmpty()
1156
+ assertIncomplete(jdeps).isEmpty()
1157
+ }
1158
+
990
1159
@Test
991
1160
fun `class declaration all super class references should be an implicit dependency` () {
992
1161
val implicitSuperClassDep = runCompileTask { c: KotlinJvmTestBuilder .TaskBuilder ->
@@ -1207,6 +1376,7 @@ class KotlinBuilderJvmJdepsTest(private val enableK2Compiler: Boolean) {
1207
1376
)
1208
1377
c.addDirectDependencies(depWithFunction)
1209
1378
c.addTransitiveDependencies(depWithReturnType)
1379
+ c.addTransitiveDependencies(depWithReturnTypesSuperType)
1210
1380
c.setLabel(" dependingTarget" )
1211
1381
}
1212
1382
val jdeps = depsProto(dependingTarget)
0 commit comments