Skip to content

Commit

Permalink
Example of type expansion
Browse files Browse the repository at this point in the history
(cherry picked from commit 646d6d3)
  • Loading branch information
ting-yuan authored and KSP Auto Pick committed Feb 13, 2025
1 parent 6f1cd08 commit 694d88a
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 32 deletions.
32 changes: 16 additions & 16 deletions kotlin-analysis-api/testData/typeAlias.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@
// WITH_RUNTIME
// TEST PROCESSOR: TypeAliasProcessor
// EXPECTED:
// a : A = String
// b : B = String
// c : CC = A = String
// d : String
// listOfInt : ListOfInt = List<Int>
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int>
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int>
// myList : MyList<Long> = List<T>
// myList_B : List<Number>
// myList_String : MyList_String = MyList<String> = List<T>
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T>
// myListOfAlias : MyListOfAlias = List<@JvmSuppressWildcards A>
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib>
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>>
// nested1 : MyList<ListOfInt> = List<T>
// nested2 : List<ListOfInt>
// a : A = String = (expanded) String
// b : B = String = (expanded) String
// c : CC = A = String = (expanded) String
// d : String = (expanded) String
// listOfInt : ListOfInt = List<Int> = (expanded) List<Int>
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
// myList : MyList<Long> = List<T> = (expanded) List<Long>
// myList_B : List<Number> = (expanded) List<Number>
// myList_String : MyList_String = MyList<String> = List<T> = (expanded) List<String>
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T> = (expanded) List<String>
// myListOfAlias : MyListOfAlias = List<@JvmSuppressWildcards A> = (expanded) List<String>
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib> = (expanded) List<String>
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>> = (expanded) Map<Class<BaseViewHolder>, Provider<ViewBinder<BaseViewHolder, SpaceshipEmbedModel>>>
// nested1 : MyList<ListOfInt> = List<T> = (expanded) List<List<Int>>
// nested2 : List<ListOfInt> = (expanded) List<List<Int>>
// END

// MODULE: module1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ open class TypeAliasProcessor : AbstractTestProcessor() {
byFinalSignature.getOrPut(signatures.last()) {
mutableListOf()
}.add(propType)
append(" = (expanded) ${resolver.expandType(propType).toSignature()}")
}
}
}.forEach(results::add)
Expand Down Expand Up @@ -89,6 +90,46 @@ open class TypeAliasProcessor : AbstractTestProcessor() {
}
}

private fun Resolver.expandType(type: KSType, substitutions: MutableMap<KSTypeParameter, KSType>): KSType {
val decl = type.declaration
return when (decl) {
is KSClassDeclaration -> {
val arguments = type.arguments.map {
val argType = it.type?.resolve() ?: return@map it
getTypeArgument(createKSTypeReferenceFromKSType(expandType(argType, substitutions)), it.variance)
}
decl.asType(arguments)
}

is KSTypeParameter -> {
val substituted = substitutions.get(decl) ?: return type
val fullySubstituted = expandType(substituted, substitutions)
// update/cache with refined substitution
if (substituted != fullySubstituted)
substitutions[decl] = fullySubstituted
fullySubstituted
}

is KSTypeAlias -> {
val aliasedType = decl.type.resolve()

decl.typeParameters.zip(type.arguments).forEach { (param, arg) ->
arg.type?.resolve()?.let {
substitutions[param] = it
}
}

expandType(aliasedType, substitutions)
}

else -> type
}
}

private fun Resolver.expandType(type: KSType): KSType {
return expandType(type, mutableMapOf())
}

override fun toResult(): List<String> {
return results
}
Expand Down
32 changes: 16 additions & 16 deletions test-utils/testData/api/typeAlias.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@
// WITH_RUNTIME
// TEST PROCESSOR: TypeAliasProcessor
// EXPECTED:
// a : A = String
// b : B = String
// c : CC = A = String
// d : String
// listOfInt : ListOfInt = List<Int>
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int>
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int>
// myList : MyList<Long> = List<T>
// myList_B : List<Number>
// myList_String : MyList_String = MyList<String> = List<T>
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T>
// myListOfAlias : MyListOfAlias = List<A>
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib>
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>>
// nested1 : MyList<ListOfInt> = List<T>
// nested2 : List<ListOfInt>
// a : A = String = (expanded) String
// b : B = String = (expanded) String
// c : CC = A = String = (expanded) String
// d : String = (expanded) String
// listOfInt : ListOfInt = List<Int> = (expanded) List<Int>
// listOfInt_B : ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
// listOfInt_C : ListOfInt_C = ListOfInt_B = ListOfInt = List<Int> = (expanded) List<Int>
// myList : MyList<Long> = List<T> = (expanded) List<Long>
// myList_B : List<Number> = (expanded) List<Number>
// myList_String : MyList_String = MyList<String> = List<T> = (expanded) List<String>
// myList_b_String : MyList_B_String = MyList_B<String> = MyList<R> = List<T> = (expanded) List<String>
// myListOfAlias : MyListOfAlias = List<A> = (expanded) List<String>
// myListOfAliasInLib : MyListOfAliasInLib = List<@JvmSuppressWildcards AInLib> = (expanded) List<String>
// viewBinderProviders : Map<Class<BaseViewHolder>, @JvmSuppressWildcards Provider<BaseEmbedViewBinder>> = (expanded) Map<Class<BaseViewHolder>, Provider<ViewBinder<BaseViewHolder, SpaceshipEmbedModel>>>
// nested1 : MyList<ListOfInt> = List<T> = (expanded) List<List<Int>>
// nested2 : List<ListOfInt> = (expanded) List<List<Int>>
// END

// MODULE: module1
Expand Down

0 comments on commit 694d88a

Please sign in to comment.