mirror of
https://github.com/fankes/moshi.git
synced 2025-10-20 08:29:22 +08:00
Fix generic typealiases (#551)
* Add generic type alias * Fix missing resolveAliases check to fix generics * Reword to useAbbreviatedType
This commit is contained in:
@@ -182,7 +182,7 @@ internal data class TargetType(
|
|||||||
for (property in classProto.propertyList) {
|
for (property in classProto.propertyList) {
|
||||||
val name = nameResolver.getString(property.name)
|
val name = nameResolver.getString(property.name)
|
||||||
val type = typeResolver.resolve(property.returnType.asTypeName(
|
val type = typeResolver.resolve(property.returnType.asTypeName(
|
||||||
nameResolver, classProto::getTypeParameter, true))
|
nameResolver, classProto::getTypeParameter, false))
|
||||||
result[name] = TargetProperty(name, type, property, constructor.parameters[name],
|
result[name] = TargetProperty(name, type, property, constructor.parameters[name],
|
||||||
annotationHolders[name], fields[name], setters[name], getters[name])
|
annotationHolders[name], fields[name], setters[name], getters[name])
|
||||||
}
|
}
|
||||||
@@ -207,7 +207,7 @@ internal data class TargetType(
|
|||||||
TypeVariableName(
|
TypeVariableName(
|
||||||
name = nameResolver.getString(it.name),
|
name = nameResolver.getString(it.name),
|
||||||
bounds = *(it.upperBoundList
|
bounds = *(it.upperBoundList
|
||||||
.map { it.asTypeName(nameResolver, proto::getTypeParameter) }
|
.map { it.asTypeName(nameResolver, proto::getTypeParameter, false) }
|
||||||
.toTypedArray()),
|
.toTypedArray()),
|
||||||
variance = it.varianceModifier)
|
variance = it.varianceModifier)
|
||||||
.reified(it.reified)
|
.reified(it.reified)
|
||||||
|
@@ -61,30 +61,30 @@ internal fun TypeParameter.Variance.asKModifier(): KModifier? {
|
|||||||
internal fun Type.asTypeName(
|
internal fun Type.asTypeName(
|
||||||
nameResolver: NameResolver,
|
nameResolver: NameResolver,
|
||||||
getTypeParameter: (index: Int) -> TypeParameter,
|
getTypeParameter: (index: Int) -> TypeParameter,
|
||||||
resolveAliases: Boolean = false
|
useAbbreviatedType: Boolean = true
|
||||||
): TypeName {
|
): TypeName {
|
||||||
|
|
||||||
val argumentList = when {
|
val argumentList = when {
|
||||||
hasAbbreviatedType() -> abbreviatedType.argumentList
|
useAbbreviatedType && hasAbbreviatedType() -> abbreviatedType.argumentList
|
||||||
else -> argumentList
|
else -> argumentList
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasFlexibleUpperBound()) {
|
if (hasFlexibleUpperBound()) {
|
||||||
return WildcardTypeName.subtypeOf(
|
return WildcardTypeName.subtypeOf(
|
||||||
flexibleUpperBound.asTypeName(nameResolver, getTypeParameter, resolveAliases))
|
flexibleUpperBound.asTypeName(nameResolver, getTypeParameter, useAbbreviatedType))
|
||||||
.asNullableIf(nullable)
|
.asNullableIf(nullable)
|
||||||
} else if (hasOuterType()) {
|
} else if (hasOuterType()) {
|
||||||
return WildcardTypeName.supertypeOf(
|
return WildcardTypeName.supertypeOf(
|
||||||
outerType.asTypeName(nameResolver, getTypeParameter, resolveAliases))
|
outerType.asTypeName(nameResolver, getTypeParameter, useAbbreviatedType))
|
||||||
.asNullableIf(nullable)
|
.asNullableIf(nullable)
|
||||||
}
|
}
|
||||||
|
|
||||||
val realType = when {
|
val realType = when {
|
||||||
hasTypeParameter() -> return getTypeParameter(typeParameter)
|
hasTypeParameter() -> return getTypeParameter(typeParameter)
|
||||||
.asTypeName(nameResolver, getTypeParameter, resolveAliases)
|
.asTypeName(nameResolver, getTypeParameter, useAbbreviatedType)
|
||||||
.asNullableIf(nullable)
|
.asNullableIf(nullable)
|
||||||
hasTypeParameterName() -> typeParameterName
|
hasTypeParameterName() -> typeParameterName
|
||||||
hasAbbreviatedType() && !resolveAliases -> abbreviatedType.typeAliasName
|
useAbbreviatedType && hasAbbreviatedType() -> abbreviatedType.typeAliasName
|
||||||
else -> className
|
else -> className
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ internal fun Type.asTypeName(
|
|||||||
argumentType.projection
|
argumentType.projection
|
||||||
} else null
|
} else null
|
||||||
if (argumentType.hasType()) {
|
if (argumentType.hasType()) {
|
||||||
argumentType.type.asTypeName(nameResolver, getTypeParameter, resolveAliases)
|
argumentType.type.asTypeName(nameResolver, getTypeParameter, useAbbreviatedType)
|
||||||
.let { argumentTypeName ->
|
.let { argumentTypeName ->
|
||||||
nullableProjection?.let { projection ->
|
nullableProjection?.let { projection ->
|
||||||
when (projection) {
|
when (projection) {
|
||||||
|
@@ -826,6 +826,7 @@ data class NullableTypeParams<T>(
|
|||||||
)
|
)
|
||||||
|
|
||||||
typealias TypeAliasName = String
|
typealias TypeAliasName = String
|
||||||
|
typealias GenericTypeAlias = List<String>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is here mostly just to ensure it still compiles. Covers variance, @Json, default values,
|
* This is here mostly just to ensure it still compiles. Covers variance, @Json, default values,
|
||||||
@@ -852,5 +853,6 @@ data class SmokeTestType(
|
|||||||
val favoriteArrayValues: Array<String>,
|
val favoriteArrayValues: Array<String>,
|
||||||
val favoriteNullableArrayValues: Array<String?>,
|
val favoriteNullableArrayValues: Array<String?>,
|
||||||
val nullableSetListMapArrayNullableIntWithDefault: Set<List<Map<String, Array<IntArray?>>>>? = null,
|
val nullableSetListMapArrayNullableIntWithDefault: Set<List<Map<String, Array<IntArray?>>>>? = null,
|
||||||
val aliasedName: TypeAliasName = "Woah"
|
val aliasedName: TypeAliasName = "Woah",
|
||||||
|
val genericAlias: GenericTypeAlias = listOf("Woah")
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user