From d43f3bb12999b89adc18997584668527f1324de7 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 11 Apr 2020 18:32:29 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/kmapper/KMapper.kt | 6 +++--- .../kmapper/{ParameterForMap.kt => PlainParameterForMap.kt} | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename src/main/kotlin/com/mapk/kmapper/{ParameterForMap.kt => PlainParameterForMap.kt} (75%) diff --git a/src/main/kotlin/com/mapk/kmapper/KMapper.kt b/src/main/kotlin/com/mapk/kmapper/KMapper.kt index fcf4c5c..8cebfb2 100644 --- a/src/main/kotlin/com/mapk/kmapper/KMapper.kt +++ b/src/main/kotlin/com/mapk/kmapper/KMapper.kt @@ -29,9 +29,9 @@ class KMapper private constructor( clazz.toKConstructor(), parameterNameConverter ) - private val parameterMap: Map> = function.parameters + private val parameterMap: Map> = function.parameters .filter { it.kind != KParameter.Kind.INSTANCE && !it.isUseDefaultArgument() } - .associate { (parameterNameConverter(it.getAliasOrName()!!)) to ParameterForMap.newInstance(it) } + .associate { (parameterNameConverter(it.getAliasOrName()!!)) to PlainParameterForMap.newInstance(it) } private fun bindArguments(argumentBucket: ArgumentBucket, src: Any) { src::class.memberProperties.forEach outer@{ property -> @@ -111,7 +111,7 @@ class KMapper private constructor( } } -private fun mapObject(param: ParameterForMap, value: T): Any? { +private fun mapObject(param: PlainParameterForMap, value: T): Any? { val valueClazz: KClass<*> = value::class // パラメータに対してvalueが代入可能(同じもしくは親クラス)であればそのまま用いる diff --git a/src/main/kotlin/com/mapk/kmapper/ParameterForMap.kt b/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt similarity index 75% rename from src/main/kotlin/com/mapk/kmapper/ParameterForMap.kt rename to src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt index 71b9d5a..7a47538 100644 --- a/src/main/kotlin/com/mapk/kmapper/ParameterForMap.kt +++ b/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt @@ -5,7 +5,7 @@ import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.full.isSubclassOf -internal class ParameterForMap private constructor(val param: KParameter, val clazz: KClass) { +internal class PlainParameterForMap private constructor(val param: KParameter, val clazz: KClass) { val javaClazz: Class by lazy { clazz.java } @@ -19,8 +19,8 @@ internal class ParameterForMap private constructor(val param: KParamete converters.find { (key, _) -> input.isSubclassOf(key) }?.second companion object { - fun newInstance(param: KParameter): ParameterForMap<*> { - return ParameterForMap(param, param.type.classifier as KClass<*>) + fun newInstance(param: KParameter): PlainParameterForMap<*> { + return PlainParameterForMap(param, param.type.classifier as KClass<*>) } } } From 6668e05de8ef857d7f4b785764c385ed3a808367 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 11 Apr 2020 18:33:29 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mapk/kmapper/{KMapper.kt => PlainKMapper.kt} | 2 +- .../kotlin/com/mapk/kmapper/ConverterKMapperTest.kt | 6 +++--- .../kotlin/com/mapk/kmapper/DefaultArgumentTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt | 2 +- .../kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt | 2 +- .../com/mapk/kmapper/ParameterNameConverterTest.kt | 2 +- .../kotlin/com/mapk/kmapper/PropertyAliasTest.kt | 4 ++-- .../kotlin/com/mapk/kmapper/SimpleKMapperTest.kt | 12 ++++++------ .../kotlin/com/mapk/kmapper/StringMappingTest.kt | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) rename src/main/kotlin/com/mapk/kmapper/{KMapper.kt => PlainKMapper.kt} (99%) diff --git a/src/main/kotlin/com/mapk/kmapper/KMapper.kt b/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt similarity index 99% rename from src/main/kotlin/com/mapk/kmapper/KMapper.kt rename to src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt index 8cebfb2..a8ccca4 100644 --- a/src/main/kotlin/com/mapk/kmapper/KMapper.kt +++ b/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt @@ -17,7 +17,7 @@ import kotlin.reflect.full.isSuperclassOf import kotlin.reflect.full.memberProperties import kotlin.reflect.jvm.javaGetter -class KMapper private constructor( +class PlainKMapper private constructor( private val function: KFunctionForCall, parameterNameConverter: (String) -> String ) { diff --git a/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt b/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt index 246a650..6bf6c1d 100644 --- a/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt @@ -37,7 +37,7 @@ class ConverterKMapperTest { @Test @DisplayName("コンストラクターでのコンバートテスト") fun constructorConverterTest() { - val mapper = KMapper(ConstructorConverterDst::class) + val mapper = PlainKMapper(ConstructorConverterDst::class) val result = mapper.map(mapOf("argument" to 1)) assertEquals(ConstructorConverter(1), result.argument) @@ -46,7 +46,7 @@ class ConverterKMapperTest { @Test @DisplayName("コンパニオンオブジェクトに定義したコンバータでのコンバートテスト") fun companionConverterTest() { - val mapper = KMapper(CompanionConverterDst::class) + val mapper = PlainKMapper(CompanionConverterDst::class) val result = mapper.map(mapOf("argument" to "arg")) assertEquals("arg", result.argument.arg) @@ -55,7 +55,7 @@ class ConverterKMapperTest { @Test @DisplayName("スタティックメソッドに定義したコンバータでのコンバートテスト") fun staticMethodConverterTest() { - val mapper = KMapper(StaticMethodConverterDst::class) + val mapper = PlainKMapper(StaticMethodConverterDst::class) val result = mapper.map(mapOf("argument" to "1,2,3")) assertTrue(intArrayOf(1, 2, 3) contentEquals result.argument.arg) diff --git a/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt b/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt index 91a8188..509083a 100644 --- a/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt @@ -18,7 +18,7 @@ class DefaultArgumentTest { inner class KMapperTest { @Test fun test() { - val result = KMapper(::Dst).map(src) + val result = PlainKMapper(::Dst).map(src) assertEquals(Dst(1, "default"), result) } } diff --git a/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt b/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt index 0caa6cc..3a8afb8 100644 --- a/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt @@ -19,7 +19,7 @@ class EnumMappingTest { @Nested @DisplayName("KMapper") inner class KMapperTest { - private val mapper = KMapper(EnumMappingDst::class) + private val mapper = PlainKMapper(EnumMappingDst::class) @ParameterizedTest(name = "Non-Null要求") @EnumSource(value = JvmLanguage::class) diff --git a/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt b/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt index ecc51b2..7b4dbaa 100644 --- a/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt @@ -22,7 +22,7 @@ class KGetterIgnoreTest { val src1 = Src1(1, "2-1", 31) val src2 = Src2("2-2", 32, "4") - val mapper = KMapper(::Dst) + val mapper = PlainKMapper(::Dst) val dst1 = mapper.map(src1, src2) val dst2 = mapper.map(src2, src1) diff --git a/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt b/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt index 5a8ce90..07f0407 100644 --- a/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt @@ -20,7 +20,7 @@ class ParameterNameConverterTest { val expected = "snakeCase" val src = mapOf("camel_case" to expected) - val mapper = KMapper(CamelCaseDst::class) { + val mapper = PlainKMapper(CamelCaseDst::class) { CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, it) } val result = mapper.map(src) diff --git a/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt b/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt index 1847dec..4121c05 100644 --- a/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt @@ -32,7 +32,7 @@ class PropertyAliasTest { "arg3" to 3 ) - val result = KMapper(::AliasedDst).map(src) + val result = PlainKMapper(::AliasedDst).map(src) assertEquals(1.0, result.arg1) assertEquals(3, result.arg2) @@ -42,7 +42,7 @@ class PropertyAliasTest { @DisplayName("ゲッターにエイリアスを貼った場合") fun getAliasTest() { val src = AliasedSrc(1.0, 2) - val result = KMapper(::AliasedDst).map(src) + val result = PlainKMapper(::AliasedDst).map(src) assertEquals(1.0, result.arg1) assertEquals(2, result.arg2) diff --git a/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt b/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt index bbfa682..e55ca10 100644 --- a/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt @@ -76,12 +76,12 @@ class SimpleKMapperTest { @Nested @DisplayName("KMapper") inner class KMapperTest { - private val mappers: Set> = setOf( - KMapper(SimpleDst::class), - KMapper(::SimpleDst), - KMapper((SimpleDst)::factory), - KMapper(::instanceFunction), - KMapper(SimpleDstExt::class) + private val mappers: Set> = setOf( + PlainKMapper(SimpleDst::class), + PlainKMapper(::SimpleDst), + PlainKMapper((SimpleDst)::factory), + PlainKMapper(::instanceFunction), + PlainKMapper(SimpleDstExt::class) ) @Nested diff --git a/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt b/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt index 60ea9d8..97f6290 100644 --- a/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt @@ -15,7 +15,7 @@ class StringMappingTest { inner class KMapperTest { @Test fun test() { - val result: StringMappingDst = KMapper(StringMappingDst::class).map("value" to 1) + val result: StringMappingDst = PlainKMapper(StringMappingDst::class).map("value" to 1) assertEquals("1", result.value) } } From 8bdf9dcb8a78896cbf8aabfd8371948d4801bdab Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 11 Apr 2020 18:34:54 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=E6=94=B9=E5=90=8D=E3=81=AB=E4=BC=B4?= =?UTF-8?q?=E3=81=86DisplayName=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt | 2 +- src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt b/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt index 6bf6c1d..2373668 100644 --- a/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/ConverterKMapperTest.kt @@ -32,7 +32,7 @@ private data class BoundStaticMethodConverterSrc(val argument: String) @DisplayName("コンバータ有りでのマッピングテスト") class ConverterKMapperTest { @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { @Test @DisplayName("コンストラクターでのコンバートテスト") diff --git a/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt b/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt index 509083a..2a1adfa 100644 --- a/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/DefaultArgumentTest.kt @@ -14,7 +14,7 @@ class DefaultArgumentTest { private val src = Src(1, "src") @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { @Test fun test() { diff --git a/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt b/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt index 3a8afb8..b637cd2 100644 --- a/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt @@ -17,7 +17,7 @@ private class EnumMappingDst(val language: JvmLanguage?) @DisplayName("文字列 -> Enumのマッピングテスト") class EnumMappingTest { @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { private val mapper = PlainKMapper(EnumMappingDst::class) diff --git a/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt b/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt index 7b4dbaa..11ee9f9 100644 --- a/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/KGetterIgnoreTest.kt @@ -14,7 +14,7 @@ class KGetterIgnoreTest { data class Dst(val arg1: Int, val arg2: String, val arg3: Int, val arg4: String) @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { @Test @DisplayName("フィールドを無視するテスト") diff --git a/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt b/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt index 07f0407..eeb5da2 100644 --- a/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/ParameterNameConverterTest.kt @@ -12,7 +12,7 @@ private data class BoundSrc(val camel_case: String) @DisplayName("パラメータ名変換のテスト") class ParameterNameConverterTest { @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { @Test @DisplayName("スネークケースsrc -> キャメルケースdst") diff --git a/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt b/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt index 4121c05..9f49504 100644 --- a/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/PropertyAliasTest.kt @@ -21,7 +21,7 @@ private data class AliasedSrc( @DisplayName("エイリアスを貼った場合のテスト") class PropertyAliasTest { @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { @Test @DisplayName("パラメータにエイリアスを貼った場合") diff --git a/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt b/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt index e55ca10..33ec88d 100644 --- a/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/SimpleKMapperTest.kt @@ -74,7 +74,7 @@ class SimpleKMapperTest { } @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { private val mappers: Set> = setOf( PlainKMapper(SimpleDst::class), diff --git a/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt b/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt index 97f6290..0f6f8e9 100644 --- a/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt +++ b/src/test/kotlin/com/mapk/kmapper/StringMappingTest.kt @@ -11,7 +11,7 @@ private data class BoundMappingSrc(val value: Int) @DisplayName("文字列に対してtoStringしたものを渡すテスト") class StringMappingTest { @Nested - @DisplayName("KMapper") + @DisplayName("PlainKMapper") inner class KMapperTest { @Test fun test() { From 1ad8fc23391cad19c7ab855ed17a94b41f38752f Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 11 Apr 2020 22:40:43 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=97=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=81=AF=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=81=AE=E4=B8=AD=E3=81=AB=E6=9C=89=E3=81=A3=E3=81=9F=E6=96=B9?= =?UTF-8?q?=E3=81=8C=E9=81=A9=E5=88=87=E3=81=A0=E3=81=A3=E3=81=9F=E3=81=9F?= =?UTF-8?q?=E3=82=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mapk/kmapper/PlainParameterForMap.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt b/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt index 7a47538..e2bea94 100644 --- a/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt +++ b/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt @@ -1,9 +1,11 @@ package com.mapk.kmapper +import com.mapk.core.EnumMapper import kotlin.reflect.KClass import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.full.isSubclassOf +import kotlin.reflect.full.isSuperclassOf internal class PlainParameterForMap private constructor(val param: KParameter, val clazz: KClass) { val javaClazz: Class by lazy { @@ -14,6 +16,25 @@ internal class PlainParameterForMap private constructor(val param: KPar convertersFromConstructors(clazz) + convertersFromStaticMethods(clazz) + convertersFromCompanionObject(clazz) } + fun mapObject(value: U): Any? { + val valueClazz: KClass<*> = value::class + + // パラメータに対してvalueが代入可能(同じもしくは親クラス)であればそのまま用いる + if (clazz.isSuperclassOf(valueClazz)) return value + + val converter: KFunction<*>? = getConverter(valueClazz) + + return when { + // converterに一致する組み合わせが有れば設定されていればそれを使う + converter != null -> converter.call(value) + // 要求された値がenumかつ元が文字列ならenum mapperでマップ + javaClazz.isEnum && value is String -> EnumMapper.getEnum(javaClazz, value) + // 要求されているパラメータがStringならtoStringする + clazz == String::class -> value.toString() + else -> throw IllegalArgumentException("Can not convert $valueClazz to $clazz") + } + } + // 引数の型がconverterに対して入力可能ならconverterを返す fun getConverter(input: KClass): KFunction? = converters.find { (key, _) -> input.isSubclassOf(key) }?.second From 783ad928b7d5f195a8aa0c7006ebe3bb9862523a Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 11 Apr 2020 22:41:16 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=E7=A7=BB=E5=8B=95=E3=81=AE=E3=81=9F?= =?UTF-8?q?=E3=82=81=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/mapk/kmapper/PlainKMapper.kt | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt b/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt index a8ccca4..6377ced 100644 --- a/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt +++ b/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt @@ -3,7 +3,6 @@ package com.mapk.kmapper import com.mapk.annotations.KGetterAlias import com.mapk.annotations.KGetterIgnore import com.mapk.core.ArgumentBucket -import com.mapk.core.EnumMapper import com.mapk.core.KFunctionForCall import com.mapk.core.getAliasOrName import com.mapk.core.isUseDefaultArgument @@ -13,7 +12,6 @@ import kotlin.reflect.KClass import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.KVisibility -import kotlin.reflect.full.isSuperclassOf import kotlin.reflect.full.memberProperties import kotlin.reflect.jvm.javaGetter @@ -110,22 +108,3 @@ class PlainKMapper private constructor( return function.call(bucket) } } - -private fun mapObject(param: PlainParameterForMap, value: T): Any? { - val valueClazz: KClass<*> = value::class - - // パラメータに対してvalueが代入可能(同じもしくは親クラス)であればそのまま用いる - if (param.clazz.isSuperclassOf(valueClazz)) return value - - val converter: KFunction<*>? = param.getConverter(valueClazz) - - return when { - // converterに一致する組み合わせが有れば設定されていればそれを使う - converter != null -> converter.call(value) - // 要求された値がenumかつ元が文字列ならenum mapperでマップ - param.javaClazz.isEnum && value is String -> EnumMapper.getEnum(param.clazz.java, value) - // 要求されているパラメータがStringならtoStringする - param.clazz == String::class -> value.toString() - else -> throw IllegalArgumentException("Can not convert $valueClazz to ${param.clazz}") - } -} From 14932a9dfb1f01a4eff858c0d0b61363de4f67a8 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 11 Apr 2020 22:41:27 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt b/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt index 6377ced..17bb1d9 100644 --- a/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt +++ b/src/main/kotlin/com/mapk/kmapper/PlainKMapper.kt @@ -49,7 +49,7 @@ class PlainKMapper private constructor( parameterMap[alias ?: property.name]?.let { // javaGetterを呼び出す方が高速 javaGetter.isAccessible = true - argumentBucket.putIfAbsent(it.param, javaGetter.invoke(src)?.let { value -> mapObject(it, value) }) + argumentBucket.putIfAbsent(it.param, javaGetter.invoke(src)?.let { value -> it.mapObject(value) }) // 終了判定 if (argumentBucket.isInitialized) return } @@ -60,7 +60,7 @@ class PlainKMapper private constructor( src.forEach { (key, value) -> parameterMap[key]?.let { param -> // 取得した内容がnullでなければ適切にmapする - argumentBucket.putIfAbsent(param.param, value?.let { mapObject(param, it) }) + argumentBucket.putIfAbsent(param.param, value?.let { param.mapObject(value) }) // 終了判定 if (argumentBucket.isInitialized) return } @@ -69,7 +69,7 @@ class PlainKMapper private constructor( private fun bindArguments(argumentBucket: ArgumentBucket, srcPair: Pair<*, *>) { parameterMap[srcPair.first.toString()]?.let { - argumentBucket.putIfAbsent(it.param, srcPair.second?.let { value -> mapObject(it, value) }) + argumentBucket.putIfAbsent(it.param, srcPair.second?.let { value -> it.mapObject(value) }) } } From 1d9fcbc6c227e494a5af2591c240f54cf8c0f6e7 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 11 Apr 2020 22:42:59 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=E3=82=B9=E3=82=B3=E3=83=BC=E3=83=97?= =?UTF-8?q?=E3=82=92=E9=81=A9=E5=88=87=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt b/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt index e2bea94..9c95bb3 100644 --- a/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt +++ b/src/main/kotlin/com/mapk/kmapper/PlainParameterForMap.kt @@ -7,8 +7,8 @@ import kotlin.reflect.KParameter import kotlin.reflect.full.isSubclassOf import kotlin.reflect.full.isSuperclassOf -internal class PlainParameterForMap private constructor(val param: KParameter, val clazz: KClass) { - val javaClazz: Class by lazy { +internal class PlainParameterForMap private constructor(val param: KParameter, private val clazz: KClass) { + private val javaClazz: Class by lazy { clazz.java } // リストの長さが小さいと期待されるためこの形で実装しているが、理想的にはmap的なものが使いたい @@ -36,7 +36,7 @@ internal class PlainParameterForMap private constructor(val param: KPar } // 引数の型がconverterに対して入力可能ならconverterを返す - fun getConverter(input: KClass): KFunction? = + private fun getConverter(input: KClass): KFunction? = converters.find { (key, _) -> input.isSubclassOf(key) }?.second companion object {