Skip to content
Prototype of generating `copyDynamic` extension functions for kotlin data classes
Kotlin Shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
.buildscript Add release configuration stuff and a basic test Jun 16, 2018
copydynamic-annotations Use modern -progressive May 26, 2019
gradle Truth 1.0 Sep 8, 2019
metric Shadow 5.1.0 Sep 8, 2019
sample Shade kotlinx-metadata (#12) Jun 19, 2019
.gitignore Code drop Jun 9, 2018
.travis.yml Use trusty dist to fix CI Sep 14, 2019 Parens Oct 5, 2018
LICENSE.txt Update dependencies and revamp metadata (#11) May 26, 2019
build.gradle Update dependencies and revamp metadata (#11) May 26, 2019 Disable includeCompileClasspath May 26, 2019
gradlew Update dependencies and revamp metadata (#11) May 26, 2019
gradlew.bat Update dependencies and revamp metadata (#11) May 26, 2019
settings.gradle Introduce Metric (#13) May 26, 2019


Build Status

Prototype of generating copyDynamic extension functions for data classes, such that you can do this:

data class Foo(val bar: String = "bar", val baz: String = "baz", val fizz: String = "fizz")

And have a copyDynamic extension function generated to allow for dynamic setting of variables in a copy call.

val foo = Foo()

val newFoo = foo.copyDynamic {
  bar = "newBar"
  if (someCondition) baz = "newBaz"


You can optionally specify a copydynamic.generated annotation processing option with a value of either "javax.annotation.processing.Generated" (JDK 9+) or "javax.annotation.Generated" (JDK <9).

Incremental annotation processing is disabled by default (as Kapt doesn't formally support this when generating Kotlin sources currently). This does appear to work in Android projects though with Kotlin 1.3.30+. If you want to try this, you can enable it via copdynamic.useFiler.

kapt {
  arguments {
    arg("copydynamic.generated", "javax.annotation.Generated")
    arg("copydynamic.useFiler", "true")


  • The generated intermediate builder has internal visibility for its constructor, which can be considered a bit of a leaky API. If you use this, it's recommended to put your models in a separate module to avoid leaking this.
  • Properties must be internal or public visibility.


Maven Central

kapt 'io.sweers.copydynamic:copydynamic:x.y.z'
compileOnly 'io.sweers.copydynamic:copydynamic-annotations:x.y.z'

KDocs can be found here:


Copyright (C) 2018 Zac Sweers

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
See the License for the specific language governing permissions and
limitations under the License.
You can’t perform that action at this time.