Handle non-property parameters in kotlin code gen (#982)

* Add parameter-only param in multi-masks test

* Add type to target parameters for later reference

* Ensure parameters are ordered

* Reword AdapterGenerator fromJson logic to use sealed FromJsonComponent

This allows us to handle parameter-only types separately (needed for mask index calculation). Resolves #979

* Add more tests
This commit is contained in:
Zac Sweers
2019-10-30 21:06:04 -04:00
committed by Jesse Wilson
parent a384bd0429
commit 9a0294c3a0
6 changed files with 160 additions and 24 deletions

View File

@@ -327,6 +327,7 @@ class DualKotlinTest(useReflection: Boolean) {
@Test fun multipleConstructors() {
val adapter = moshi.adapter<MultipleConstructorsB>()
//language=JSON
assertThat(adapter.toJson(MultipleConstructorsB(6))).isEqualTo("""{"f":{"f":6},"b":6}""")
@Language("JSON")
@@ -342,6 +343,59 @@ class DualKotlinTest(useReflection: Boolean) {
class MultipleConstructorsB(val f: MultipleConstructorsA = MultipleConstructorsA(5), val b: Int) {
constructor(f: Int, b: Int = 6): this(MultipleConstructorsA(f), b)
}
@Test fun `multiple non-property parameters`() {
val adapter = moshi.adapter<MultipleNonPropertyParameters>()
@Language("JSON")
val testJson = """{"prop":7}"""
assertThat(adapter.toJson(MultipleNonPropertyParameters(7))).isEqualTo(testJson)
val result = adapter.fromJson(testJson)!!
assertThat(result.prop).isEqualTo(7)
}
@JsonClass(generateAdapter = true)
class MultipleNonPropertyParameters(
val prop: Int,
param1: Int = 1,
param2: Int = 2
) {
init {
// Ensure the params always uses their default value
require(param1 == 1)
require(param2 == 2)
}
}
// Tests the case of multiple parameters with no parameter properties.
@Test fun `only multiple non-property parameters`() {
val adapter = moshi.adapter<OnlyMultipleNonPropertyParameters>()
@Language("JSON")
val testJson = """{"prop":7}"""
assertThat(adapter.toJson(OnlyMultipleNonPropertyParameters().apply { prop = 7 }))
.isEqualTo(testJson)
val result = adapter.fromJson(testJson)!!
assertThat(result.prop).isEqualTo(7)
}
@JsonClass(generateAdapter = true)
class OnlyMultipleNonPropertyParameters(
param1: Int = 1,
param2: Int = 2
) {
init {
// Ensure the params always uses their default value
require(param1 == 1)
require(param2 == 2)
}
var prop: Int = 0
}
}
// Has to be outside since inline classes are only allowed on top level

View File

@@ -75,7 +75,7 @@ class MultipleMasks(
val arg17: Long = 17,
val arg18: Long = 18,
val arg19: Long = 19,
val arg20: Long = 20,
@Suppress("UNUSED_PARAMETER") arg20: Long = 20,
val arg21: Long = 21,
val arg22: Long = 22,
val arg23: Long = 23,