Skip to content

Commit 262b906

Browse files
committed
Example of type expansion
1 parent 8c4eb1a commit 262b906

File tree

3 files changed

+73
-32
lines changed

3 files changed

+73
-32
lines changed

kotlin-analysis-api/testData/typeAlias.kt

+16-16
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,22 @@
1818
// WITH_RUNTIME
1919
// TEST PROCESSOR: TypeAliasProcessor
2020
// EXPECTED:
21-
// a : A = String
22-
// b : B = String
23-
// c : CC = A = String
24-
// d : String
25-
// listOfInt : ListOfInt = List<Int>
26-
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int>
27-
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int>
28-
// myList : MyList<Long> = List<T>
29-
// myList_B : List<Number>
30-
// myList_String : MyList_String = MyList<String> = List<T>
31-
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T>
32-
// myListOfAlias : MyListOfAlias = List<@JvmSuppressWildcards A>
33-
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib>
34-
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>>
35-
// nested1 : MyList<ListOfInt> = List<T>
36-
// nested2 : List<ListOfInt>
21+
// a : A = String = (expanded) String
22+
// b : B = String = (expanded) String
23+
// c : CC = A = String = (expanded) String
24+
// d : String = (expanded) String
25+
// listOfInt : ListOfInt = List<Int> = (expanded) List<Int>
26+
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
27+
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
28+
// myList : MyList<Long> = List<T> = (expanded) List<Long>
29+
// myList_B : List<Number> = (expanded) List<Number>
30+
// myList_String : MyList_String = MyList<String> = List<T> = (expanded) List<String>
31+
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T> = (expanded) List<String>
32+
// myListOfAlias : MyListOfAlias = List<@JvmSuppressWildcards A> = (expanded) List<String>
33+
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib> = (expanded) List<String>
34+
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>> = (expanded) Map<Class<BaseViewHolder>, Provider<ViewBinder<BaseViewHolder, SpaceshipEmbedModel>>>
35+
// nested1 : MyList<ListOfInt> = List<T> = (expanded) List<List<Int>>
36+
// nested2 : List<ListOfInt> = (expanded) List<List<Int>>
3737
// END
3838

3939
// MODULE: module1

test-utils/src/main/kotlin/com/google/devtools/ksp/processor/TypeAliasProcessor.kt

+41
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ open class TypeAliasProcessor : AbstractTestProcessor() {
3737
byFinalSignature.getOrPut(signatures.last()) {
3838
mutableListOf()
3939
}.add(propType)
40+
append(" = (expanded) ${resolver.expandType(propType).toSignature()}")
4041
}
4142
}
4243
}.forEach(results::add)
@@ -89,6 +90,46 @@ open class TypeAliasProcessor : AbstractTestProcessor() {
8990
}
9091
}
9192

93+
private fun Resolver.expandType(type: KSType, substitutions: MutableMap<KSTypeParameter, KSType>): KSType {
94+
val decl = type.declaration
95+
return when (decl) {
96+
is KSClassDeclaration -> {
97+
val arguments = type.arguments.map {
98+
val argType = it.type?.resolve() ?: return@map it
99+
getTypeArgument(createKSTypeReferenceFromKSType(expandType(argType, substitutions)), it.variance)
100+
}
101+
decl.asType(arguments)
102+
}
103+
104+
is KSTypeParameter -> {
105+
val substituted = substitutions.get(decl) ?: return type
106+
val fullySubstituted = expandType(substituted, substitutions)
107+
// update/cache with refined substitution
108+
if (substituted != fullySubstituted)
109+
substitutions[decl] = fullySubstituted
110+
fullySubstituted
111+
}
112+
113+
is KSTypeAlias -> {
114+
val aliasedType = decl.type.resolve()
115+
116+
decl.typeParameters.zip(type.arguments).forEach { (param, arg) ->
117+
arg.type?.resolve()?.let {
118+
substitutions[param] = it
119+
}
120+
}
121+
122+
expandType(aliasedType, substitutions)
123+
}
124+
125+
else -> type
126+
}
127+
}
128+
129+
private fun Resolver.expandType(type: KSType): KSType {
130+
return expandType(type, mutableMapOf())
131+
}
132+
92133
override fun toResult(): List<String> {
93134
return results
94135
}

test-utils/testData/api/typeAlias.kt

+16-16
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,22 @@
1818
// WITH_RUNTIME
1919
// TEST PROCESSOR: TypeAliasProcessor
2020
// EXPECTED:
21-
// a : A = String
22-
// b : B = String
23-
// c : CC = A = String
24-
// d : String
25-
// listOfInt : ListOfInt = List<Int>
26-
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int>
27-
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int>
28-
// myList : MyList<Long> = List<T>
29-
// myList_B : List<Number>
30-
// myList_String : MyList_String = MyList<String> = List<T>
31-
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T>
32-
// myListOfAlias : MyListOfAlias = List<A>
33-
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib>
34-
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>>
35-
// nested1 : MyList<ListOfInt> = List<T>
36-
// nested2 : List<ListOfInt>
21+
// a : A = String = (expanded) String
22+
// b : B = String = (expanded) String
23+
// c : CC = A = String = (expanded) String
24+
// d : String = (expanded) String
25+
// listOfInt : ListOfInt = List<Int> = (expanded) List<Int>
26+
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
27+
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
28+
// myList : MyList<Long> = List<T> = (expanded) List<Long>
29+
// myList_B : List<Number> = (expanded) List<Number>
30+
// myList_String : MyList_String = MyList<String> = List<T> = (expanded) List<String>
31+
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T> = (expanded) List<String>
32+
// myListOfAlias : MyListOfAlias = List<A> = (expanded) List<String>
33+
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib> = (expanded) List<String>
34+
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>> = (expanded) Map<Class<BaseViewHolder>, Provider<ViewBinder<BaseViewHolder, SpaceshipEmbedModel>>>
35+
// nested1 : MyList<ListOfInt> = List<T> = (expanded) List<List<Int>>
36+
// nested2 : List<ListOfInt> = (expanded) List<List<Int>>
3737
// END
3838

3939
// MODULE: module1

0 commit comments

Comments
 (0)