Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Support for mapping to nested classes.

Choose a tag to compare

@k163377 k163377 released this 08 May 20:26
· 91 commits to master since this release
0985a5b

機能追加

以下のように、Dstの引数に複数の引数を要求する型が有った場合にも呼び出せるように全体の構造の修正を行った。

data class InnerDst(val foo: Any, val bar: Any)
data class Dst(val baz: InnerDst, val qux: Any)

ネストしたクラスへのマッピングについて

ネストしたクラスへのマッピングは、パラメータにKParameterFlattenアノテーションを付与することで行う。
ここで呼ばれる関数は、KConstructorアノテーションを付与したものとなる。

以下のように宣言した場合、functionは引数名としてbazFoo, bazBar, quxの3つを要求する。

data class InnerDst(val foo: Any, val bar: Any)
data class Dst(@KParameterFlatten val baz: InnerDst, val qux: Any)

val function: KFunctionForCall<Dst> = KFunctionForCall(::Dst)

プレフィックスが必要ない場合

KParameterFlattenの処理では、デフォルトでフィールド名をプレフィックスにする。

フィールド名をプレフィックスにする必要が無い場合、fieldNameToPrefixを指定すればよい。

以下の例では、functionは引数名としてfoo, bar, quxの3つを要求する。

data class InnerDst(val foo: Any, val bar: Any)
data class Dst(
    @KParameterFlatten(fieldNameToPrefix = false)
    val baz: InnerDst,
    val qux: Any
)

val function: KFunctionForCall<Dst> = KFunctionForCall(::Dst, ::toKebabMethod)

パラメータ名変換が絡む場合

KParameterFlattenの処理では、デフォルトでパラメータ名結合にキャメルケースを用いる。

Srcのネーミングがケバブケースだった場合など、結合方法を変更する必要が有る場合は、nameJoinerパラメータにNameJoinerクラスを継承したobjectを渡すことで、結合方法を変更できる。
NameJoinerは、デフォルトではNameJoiner.CamelNameJoiner.KebabNameJoiner.Snakeの3種類を用意している。

以下の例では、functionは引数名としてbaz-foo, baz-bar, quxの3つを要求する。

data class InnerDst(val foo: Any, val bar: Any)
data class Dst(
    @KParameterFlatten(nameJoiner = NameJoiner.Kebab::class)
    val baz: InnerDst,
    val qux: Any
)

val function: KFunctionForCall<Dst> = KFunctionForCall(::Dst, ::toKebabMethod)

関数の呼び出し方について

今までSharedモジュールではKParameterをキーに引数をバインドすることで関数呼び出しを行っていたが、これからは引数名をキーに引数をバインドすることで関数呼び出しを行う形となる。

その他修正

  • 今回の変更により外から呼ばれなくなったものをinternal
  • gradleで、アノテーションライブラリのスコープが無駄に広かった問題を修正
  • アノテーションで@MustBeDocumentedが抜けていたため修正
  • エイリアス等によって引数名が重複した場合KFunctionForCallの宣言時点で落ちるように修正