• Stars
    star
    280
  • Rank 147,492 (Top 3 %)
  • Language
    Kotlin
  • License
    MIT License
  • Created about 6 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

DeepCopy extensions for Kotlin Data class. Provide Reflection, Apt, Ksp and Kcp implementations.

License: MIT Maven Central

KotlinDeepCopy

Provide an easy way to generate DeepCopy function for data class. DeepCopy only takes effect on the component members i.e. the members declared in the primary constructor.

Reflection

Use Kotlin Reflection to provide an extension function for DeepCopyable so that any data class which implements DeepCopyable can simply call deepCopy() to copy itsself.

See the test code below:

data class Speaker(val name: String, val age: Int): DeepCopyable

data class Talk(val name: String, val speaker: Speaker): DeepCopyable

class DeepCopyTest {
    @Test
    fun test() {
        val talk = Talk("DataClass in Action", Speaker("Benny Huo", 30))
        val newTalk = talk.deepCopy()
        assert(talk == newTalk)
        assert(talk !== newTalk)
    }
}

talk equals newTalk since the values of their members are equal while they do not ref to the same object.

How to Setup

This library has been deloyed to maven center.

implementation("com.bennyhuo.kotlin:deepcopy-reflect:<latest-version>")

Apt & Ksp

If you concern about the runtime efficiency, apt may be the solution. You can simply annotate the data class you want to deep copy with a DeepCopy annotation:

@DeepCopy
data class Speaker(val name: String, val age: Int)
@DeepCopy
data class Talk(val name: String, val speaker: Speaker)

Extension function deepCopy will be generated according to the components:

fun Talk.deepCopy(name: String = this.name, speaker: Speaker = this.speaker): Talk = Talk(name, speaker.deepCopy())

fun Speaker.deepCopy(
    name: String = this.name,
    age: Int = this.age,
    company: Company = this.company
): Speaker = Speaker(name, age, company.deepCopy()) 

Notice that deepCopy is called recursively if the member type is also a data class annotated with a DeepCopy annotation. Hence, if you remove the annotation for Speaker, generated function would be like:

fun Talk.deepCopy(name: String = this.name, speaker: Speaker = this.speaker): Talk = Talk(name, speaker)

//And no deepCopy for Speaker.

How to Setup

The artifacts have been deployed to maven central repository. Set up your project by adding these lines:

plugins {
    id("com.google.devtools.ksp") version "1.8.20-1.0.11" // ksp
    id "org.jetbrains.kotlin.kapt" // kapt
}
...

dependencies {
    ksp("com.bennyhuo.kotlin:deepcopy-compiler-ksp:<latest-version>")) // ksp
    kapt("com.bennyhuo.kotlin:deepcopy-compiler-kapt:<latest-version>") // kapt
    implementation("com.bennyhuo.kotlin:deepcopy-runtime:<latest-version>")
}

KCP

This is a nearly perfect version I think. It works like copy does. You can install this IntelliJ plugin: DeepCopy and setup your project like this:

plugins {
    kotlin("jvm") version "1.8.20"
    id("com.bennyhuo.kotlin.plugin.deepcopy") version "<latest-version>"
}

dependencies {
    implementation("com.bennyhuo.kotlin:deepcopy-runtime:<latest-version>")
}

And then try to call the deepCopy function directly!

Change Log

v1.8.20-1.0.1

Fix dependencies error #19.

v1.8.20-1.0.0

Build with Kotlin 1.8.20.

v1.7.10.0

Build with Kotlin 1.7.10.

Runtime

  • Rename DeepCopiable to DeepCopyable which seems more widely used.

Reflect

  • Make deepCopy function available to DeepCopyable only.
  • [NEW] Add support for Kotlin JS.

APT & KSP

  • Support multi-module project in a unified way.

KCP

  • Generate a copy-like function deepCopy for data classes annotated with @DeepCopy.
  • Generate implementation of deepCopy for data classes implemented DeepCopyable.
  • Add super type DeepCopyable to those data classes annotated with @DeepCopy.
  • Carefully handle manually written deepCopy function.
  • Add support for Collections.

v1.5.0 Reflect & Apt

Compiles on Kotlin v1.5.0. Update kotlinx-metadata-jvm to v0.3.0.

v1.3.72 Apt

Build with Kotlin v1.3.72.

  • [Bug] Fixed: rewriting DeepCopy.kt.
  • [Bug] Fixed: maven dependency scope with runtime module.

v1.3.0 Apt

  • [Feature] Collections/Maps are supported.
  • [Feature] Prebuilt types are supported by annotation DeepCopyConfig. See Prebuilt
  • [Bug] Fixed: Data classes with their dependencies should be place into the same package.
  • [Bug] Fixed: Improperly import a type variable when component type is not reified.

v1.2.0 Apt

  • [Feature] Add support for nullable types. It will allow copy loop sematically and an exception will be thrown to respond when compiling. See Recursive.kt.

v1.1.0 Apt

  • [Feature] Add default values to generated deepCopy functions.

License

MIT License

Copyright (c) 2018 Bennyhuo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

More Repositories

1

Kotlin-Tutorials

仓库持续记录以 Kotlin 为基础的视频内容的制作过程
Kotlin
4,107
star
2

DiveIntoKotlinCoroutines-Sources

《深入理解 Kotlin 协程》源码
Kotlin
289
star
3

TieGuanYin

Activity Builder.
Kotlin
183
star
4

CoroutineLite

Simple implementation of kotlinx.coroutines to clarify the design of Kotlin Coroutines.
Kotlin
166
star
5

CppCoroutines

C++
141
star
6

NewDataClassAction

This is a IntelliJ plugin for Kotlin. You may use this to create a data class from a Json string.
Java
93
star
7

hello-kni

Demo for Jni call Kotlin-Native lib.
Kotlin
93
star
8

kotlin-coroutines-android

Useful extensions for coroutines. AutoDispose + MainScope
Kotlin
87
star
9

Apt-Tutorials

注解处理器教程,使用 Kotlin 编写
Kotlin
71
star
10

HackRetrofit

A hacked edition of Retrofit 2.0.2.
Java
53
star
11

Klue

Kotlin
51
star
12

KotlinBlogTranslation

Kotlin 官方博客翻译计划
Python
49
star
13

aMysqlClient

一个类似于Navicat的Mysql Android客户端
Java
44
star
14

Kotlin-Trim-Indent

This is a Kotlin compiler plugin for a compile-time indent trim of raw String.
Kotlin
41
star
15

kotlin-ir-printer

Kotlin
39
star
16

Mixin

An annotation processor to mix Java or Kotlin Classes up into a single Class. Also a sample of X Processing which is an abstract layer of apt and ksp.
Kotlin
30
star
17

KotlinMetaProgrammingInAction-Sources

Kotlin
28
star
18

ReleasableVar

A delegate for those non null vars of which values need to be cleared at the end of the lifecycle.
Java
28
star
19

Android-LuaJavax

Powerful Kotlin style API for Android Lua.
C
26
star
20

KotlinTuples

Kotlin tuples.
Kotlin
20
star
21

TryRun

Kotlin
19
star
22

PortableAndroidHandler

Pure Java implementation of Android Handler.
Java
18
star
23

Shell

Android Shell run without root. Just like adb shell does
Kotlin
16
star
24

Apt-Utils

This is a util library to help you setup apt project easily. Simply call AptContext.init(env) in your Processor, and you can access to the Filer/Messager/Types/Elements from AptContext.
Kotlin
16
star
25

kotlin-code-analyzer

Kotlin
15
star
26

CodeViewer

Android 手机代码阅读器
Java
14
star
27

Kotliner

Kotliner.cn 页面源码
Shell
13
star
28

Kotlin-Native-Demo

A Kotlin-Native Demo with gradle and makefile.
Makefile
11
star
29

SwipeFinishableActivity

Swipable support for Activity to finish itself like Wechat App does.
Java
11
star
30

Cpp-Tutorials

C++
10
star
31

ObjectPropertyDelegate

ObjectPropertyDelegate for Kotlin class properties & functions.
Kotlin
10
star
32

HackViewBinding

Java
9
star
33

Bennyhuo

HTML
8
star
34

enbandari.github.io

这是 www.kotliner.cn 页面仓库
HTML
8
star
35

kotlin-compile-testing-extensions

Kotlin
8
star
36

RetroApollo-Android

Apollo-Android wrapper like Retrofit for GraphQL.
Kotlin
7
star
37

kotlinp

Kotlin
7
star
38

ActivityStack

Kotlin
7
star
39

Kotlin1.4FeaturesSample

Kotlin
6
star
40

jumpcutter2

jumpcutter with edl supports.
Python
5
star
41

KotlinValueDef

Kotlin
4
star
42

Symbol-Processing-Utils

Kotlin
4
star
43

EffectiveJavaInAction

Effective Java 这本书在业界非常流行,连 Java 之父 Gosling 都赞不绝口。可是,这本书本身也存在问题:Java 的初学者往往因为经验缺乏,读起来会有『你说得好有道理哦,可你说的都是什么』的感觉。基于这一点,我计划录制一套视频,从我自己的视角来解读一下这本书,希望让经典更通俗易懂。
4
star
44

kotlin-compiler-plugin-template

Kotlin
3
star
45

SimplePlugin

A simple plugin for intellij platform. This is the demo project from http://www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support
Java
3
star
46

kotlin-compiler-plugin-embeddable-plugin

Kotlin
3
star
47

text-cover-simple

Rust
3
star
48

Magic-C-Programming

C
3
star
49

QCloudImageUploaderForMarkDown

Use this to help you upload images to QCloud and replace images urls in you markdown files.
Kotlin
3
star
50

SwiftCoroutinesSample

Swift
2
star
51

kotlin-grammar-tools

Java
2
star
52

rust-learning

Rust
2
star
53

symbol-processing-module-support

Kotlin
2
star
54

ByrWifiConnector

北邮校园网无线认证助手
Java
2
star
55

text-cover

Rust
2
star
56

Images

Images is a tool set to process images.
JavaScript
2
star
57

Kotlin-Coroutine-HelloWorld

This is a very first sample of Kotlin Coroutine I used in the meetup of Beijing. Hello World!
Kotlin
2
star
58

k2-issues

Kotlin
2
star
59

TensorflowDemo

Tensorflow demo by Kotlin Native. Organised by CMake.
CMake
1
star
60

HelloDart

Dart
1
star
61

kotlin-strip-metadata

Kotlin
1
star
62

image-resize-tool

Rust
1
star
63

bilibili-parser

1
star
64

k2-bugs

1
star
65

KmmSample

Kotlin
1
star
66

java-new

Java
1
star
67

SwiftCoroutinesDemo

Swift
1
star
68

HelloFlutter

Dart
1
star
69

anko-legacy

Kotlin
1
star
70

CodeAnalyzer

代码分析工具(主要是统计);Analyzer of our code ( mainly about statistics so far)
Java
1
star
71

EasyDroid-Files

Easy way to access file.
Java
1
star
72

GradleRepositoriesPlugin

A bunch of maven repositories with predefined functions for Gradle.
Kotlin
1
star
73

TouchAssistant

Kotlin
1
star
74

ItemAnimatableListView

If you wanna animate your items when you operate them (add/remove) in a ListView/ExpandableListView, you should check this.
Java
1
star