Fix handling of typealiases in non-classname envs + wildcard fix… (#987)

* Correctly render non-classname wildcard types

Resolves #984
Resolves #985

* Add thorough typealias test

* Expand unwrapTypeAlias to parameterized and wildcard types

Resolves #983

* Disable Werror for now
This commit is contained in:
Zac Sweers
2019-10-30 21:15:28 -04:00
committed by GitHub
parent ac789070e8
commit 092175ae90
4 changed files with 87 additions and 6 deletions

View File

@@ -115,7 +115,11 @@
</executions>
<configuration>
<args>
<arg>-Werror</arg>
<!--
Disabled for now because we generate redundant `out` variance for some generics,
but there's no way for us to know when it's redundant.
-->
<!-- <arg>-Werror</arg>-->
<arg>-Xuse-experimental=kotlin.ExperimentalStdlibApi</arg>
<arg>-XXLanguage:+InlineClasses</arg>
</args>

View File

@@ -403,8 +403,46 @@ class DualKotlinTest(useReflection: Boolean) {
var prop: Int = 0
}
@Test fun typeAliasUnwrapping() {
val adapter = moshi
.newBuilder()
.add(Types.supertypeOf(Int::class.javaObjectType), moshi.adapter<Int>())
.build()
.adapter<TypeAliasUnwrapping>()
@Language("JSON")
val testJson = """{"simpleClass":6,"parameterized":{"value":6},"wildcardIn":{"value":6},"wildcardOut":{"value":6},"complex":{"value":[{"value":6}]}}"""
val testValue = TypeAliasUnwrapping(
simpleClass = 6,
parameterized = TypeAliasGeneric(6),
wildcardIn = TypeAliasGeneric(6),
wildcardOut = TypeAliasGeneric(6),
complex = TypeAliasGeneric(listOf(TypeAliasGeneric(6)))
)
assertThat(adapter.toJson(testValue)).isEqualTo(testJson)
val result = adapter.fromJson(testJson)!!
assertThat(result).isEqualTo(testValue)
}
@JsonClass(generateAdapter = true)
data class TypeAliasUnwrapping(
val simpleClass: TypeAlias,
val parameterized: TypeAliasGeneric<TypeAlias>,
val wildcardIn: TypeAliasGeneric<in TypeAlias>,
val wildcardOut: TypeAliasGeneric<out TypeAlias>,
@Suppress("REDUNDANT_PROJECTION")
val complex: TypeAliasGeneric<List<out TypeAliasGeneric<in TypeAlias>>>
)
}
typealias TypeAlias = Int
@JsonClass(generateAdapter = true)
data class TypeAliasGeneric<T>(val value: T)
// Has to be outside since inline classes are only allowed on top level
@JsonClass(generateAdapter = true)
inline class InlineClass(val i: Int)