From 94d8a5d01da4c00dc39dc09b24c8dc20ccb30fef Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 14 Mar 2020 22:08:16 +0900 Subject: [PATCH 1/5] =?UTF-8?q?shared=E3=81=AE=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 65221ed..0bcffbe 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,7 +30,7 @@ repositories { dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation(kotlin("reflect")) - implementation("com.github.ProjectMapK:Shared:0.5") + implementation("com.github.ProjectMapK:Shared:0.6") // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter testImplementation(group = "org.junit.jupiter", name = "junit-jupiter", version = "5.6.0") { From 74a3d75598a44e7db38f4487756342fe84fc00e1 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 14 Mar 2020 22:08:50 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=A2=E3=83=83=E3=83=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0bcffbe..a26b7af 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "com.mapk" -version = "0.10" +version = "0.15" java { sourceCompatibility = JavaVersion.VERSION_1_8 From ba8382141ce946d5d6f825ae2a871d09d540cb53 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 14 Mar 2020 22:09:36 +0900 Subject: [PATCH 3/5] =?UTF-8?q?shared=E3=81=8B=E3=82=89=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/annotations/KConverter.kt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/kotlin/com/mapk/annotations/KConverter.kt diff --git a/src/main/kotlin/com/mapk/annotations/KConverter.kt b/src/main/kotlin/com/mapk/annotations/KConverter.kt new file mode 100644 index 0000000..35034f7 --- /dev/null +++ b/src/main/kotlin/com/mapk/annotations/KConverter.kt @@ -0,0 +1,6 @@ +package com.mapk.annotations + +@Target(AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +@MustBeDocumented +annotation class KConverter From cb4ede1e16e6625b9be85deb3515fc11af4b72ab Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 14 Mar 2020 22:12:14 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E5=90=8D=E5=89=8D=E3=81=AE=E5=8F=96?= =?UTF-8?q?=E3=82=8A=E6=96=B9=E3=82=92Shared=E3=81=A7=E5=85=B1=E9=80=9A?= =?UTF-8?q?=E5=8C=96=E3=81=97=E3=81=9F=E3=82=82=E3=81=AE=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ついでにコンバータは絶対かけるように修正(実際にアノテーションを振る場合はキャメルケースに合わせたいだろうという判断から) --- src/main/kotlin/com/mapk/kmapper/KMapper.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/com/mapk/kmapper/KMapper.kt b/src/main/kotlin/com/mapk/kmapper/KMapper.kt index b6d7b6c..00bab0c 100644 --- a/src/main/kotlin/com/mapk/kmapper/KMapper.kt +++ b/src/main/kotlin/com/mapk/kmapper/KMapper.kt @@ -3,17 +3,16 @@ package com.mapk.kmapper import com.mapk.annotations.KConstructor import com.mapk.annotations.KGetterAlias import com.mapk.annotations.KGetterIgnore -import com.mapk.annotations.KParameterAlias import com.mapk.core.ArgumentBucket import com.mapk.core.EnumMapper import com.mapk.core.KFunctionForCall +import com.mapk.core.getAliasOrName import java.lang.reflect.Method import kotlin.reflect.KClass import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.KVisibility import kotlin.reflect.full.companionObjectInstance -import kotlin.reflect.full.findAnnotation import kotlin.reflect.full.functions import kotlin.reflect.full.isSuperclassOf import kotlin.reflect.full.memberProperties @@ -34,10 +33,7 @@ class KMapper private constructor( private val parameterMap: Map> = function.parameters .filter { it.kind != KParameter.Kind.INSTANCE } - .associate { - (it.findAnnotation()?.value ?: propertyNameConverter(it.name!!)) to - ParameterForMap.newInstance(it) - } + .associate { (propertyNameConverter(it.getAliasOrName()!!)) to ParameterForMap.newInstance(it) } private fun bindArguments(argumentBucket: ArgumentBucket, src: Any) { src::class.memberProperties.forEach outer@{ property -> From 8f20c7c0d274f262975573c66a9947378c78b198 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 14 Mar 2020 23:20:19 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Shared=E3=81=AB=E7=A7=BB=E6=A4=8D=E3=81=AE?= =?UTF-8?q?=E3=81=9F=E3=82=81=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mapk/annotations/KConstructor.kt | 6 -- src/main/kotlin/com/mapk/kmapper/KMapper.kt | 30 +------- .../kotlin/com/mapk/kmapper/GetTargetTest.kt | 69 ------------------- 3 files changed, 2 insertions(+), 103 deletions(-) delete mode 100644 src/main/kotlin/com/mapk/annotations/KConstructor.kt delete mode 100644 src/test/kotlin/com/mapk/kmapper/GetTargetTest.kt diff --git a/src/main/kotlin/com/mapk/annotations/KConstructor.kt b/src/main/kotlin/com/mapk/annotations/KConstructor.kt deleted file mode 100644 index 6ea3720..0000000 --- a/src/main/kotlin/com/mapk/annotations/KConstructor.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.mapk.annotations - -@Target(AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION) -@Retention(AnnotationRetention.RUNTIME) -@MustBeDocumented -annotation class KConstructor diff --git a/src/main/kotlin/com/mapk/kmapper/KMapper.kt b/src/main/kotlin/com/mapk/kmapper/KMapper.kt index 00bab0c..bf03103 100644 --- a/src/main/kotlin/com/mapk/kmapper/KMapper.kt +++ b/src/main/kotlin/com/mapk/kmapper/KMapper.kt @@ -1,22 +1,19 @@ package com.mapk.kmapper -import com.mapk.annotations.KConstructor 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.toKConstructor import java.lang.reflect.Method import kotlin.reflect.KClass import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.KVisibility -import kotlin.reflect.full.companionObjectInstance -import kotlin.reflect.full.functions import kotlin.reflect.full.isSuperclassOf import kotlin.reflect.full.memberProperties -import kotlin.reflect.full.primaryConstructor import kotlin.reflect.jvm.javaGetter class KMapper private constructor( @@ -28,7 +25,7 @@ class KMapper private constructor( ) constructor(clazz: KClass, propertyNameConverter: (String) -> String = { it }) : this( - getTarget(clazz), propertyNameConverter + clazz.toKConstructor(), propertyNameConverter ) private val parameterMap: Map> = function.parameters @@ -113,29 +110,6 @@ class KMapper private constructor( } } -@Suppress("UNCHECKED_CAST") -internal fun getTarget(clazz: KClass): KFunctionForCall { - val factoryConstructor: List> = - clazz.companionObjectInstance?.let { companionObject -> - companionObject::class.functions - .filter { it.annotations.any { annotation -> annotation is KConstructor } } - .map { KFunctionForCall( - it, - companionObject - ) as KFunctionForCall } - } ?: emptyList() - - val constructors: List> = factoryConstructor + clazz.constructors - .filter { it.annotations.any { annotation -> annotation is KConstructor } } - .map { KFunctionForCall(it) } - - if (constructors.size == 1) return constructors.single() - - if (constructors.isEmpty()) return KFunctionForCall(clazz.primaryConstructor!!) - - throw IllegalArgumentException("Find multiple target.") -} - private fun mapObject(param: ParameterForMap, value: T): Any? { val valueClazz: KClass<*> = value::class diff --git a/src/test/kotlin/com/mapk/kmapper/GetTargetTest.kt b/src/test/kotlin/com/mapk/kmapper/GetTargetTest.kt deleted file mode 100644 index 60d2fb1..0000000 --- a/src/test/kotlin/com/mapk/kmapper/GetTargetTest.kt +++ /dev/null @@ -1,69 +0,0 @@ -@file:Suppress("unused") - -package com.mapk.kmapper - -import com.mapk.annotations.KConstructor -import com.mapk.core.KFunctionForCall -import kotlin.reflect.KFunction -import kotlin.reflect.full.memberProperties -import kotlin.reflect.full.primaryConstructor -import kotlin.reflect.jvm.isAccessible -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows - -private class SecondaryConstructorDst(val argument: Int) { - @KConstructor constructor(argument: Number) : this(argument.toInt()) -} -class CompanionFactoryDst(val argument: IntArray) { - companion object { - @KConstructor - fun factory(csv: String): CompanionFactoryDst { - return csv.split(",").map { it.toInt() }.toIntArray().let { CompanionFactoryDst(it) } - } - } -} -private class ConstructorDst(val argument: String) -class MultipleConstructorDst @KConstructor constructor(val argument: Int) { - @KConstructor constructor(argument: String) : this(argument.toInt()) -} - -@Suppress("UNCHECKED_CAST") -@DisplayName("クラスからのコンストラクタ抽出関連テスト") -class GetTargetTest { - private fun KFunctionForCall.getTargetFunction(): KFunction { - return this::class.memberProperties.first { it.name == "function" }.getter.let { - it.isAccessible = true - it.call(this) as KFunction - } - } - - @Test - @DisplayName("セカンダリコンストラクタからの取得テスト") - fun testGetFromSecondaryConstructor() { - val function = getTarget(SecondaryConstructorDst::class).getTargetFunction() - assertTrue(function.annotations.any { it is KConstructor }) - } - - @Test - @DisplayName("ファクトリーメソッドからの取得テスト") - fun testGetFromFactoryMethod() { - val function = getTarget(SecondaryConstructorDst::class).getTargetFunction() - assertTrue(function.annotations.any { it is KConstructor }) - } - - @Test - @DisplayName("無指定でプライマリコンストラクタからの取得テスト") - fun testGetFromPrimaryConstructor() { - val function = getTarget(ConstructorDst::class).getTargetFunction() - assertEquals(ConstructorDst::class.primaryConstructor, function) - } - - @Test - @DisplayName("対象を複数指定した場合のテスト") - fun testMultipleDeclareConstructor() { - assertThrows { getTarget(MultipleConstructorDst::class) } - } -}