Skip to content

Commit

Permalink
Add KopyOptIn
Browse files Browse the repository at this point in the history
  • Loading branch information
JavierSegoviaCordoba committed Aug 19, 2024
1 parent 76d6fc0 commit 422d38c
Show file tree
Hide file tree
Showing 65 changed files with 223 additions and 55 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

### Added

- `kopy` and `invoke` calls are now marked as errors if the plugin is not applied to the project.

### Changed

### Deprecated
Expand Down
13 changes: 9 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ data class Cat(val name: String, val age: Int)

### `copy` or `invoke`

`copy` and `invoke` creates a new instance of your data class with the content you specify. There is
`copy` and `invoke` create a new instance of your data class with the content you specify. There is
no difference between both functions.

### `set` or `=`
Expand Down Expand Up @@ -147,10 +147,15 @@ val house2: House = house.copy {

## How it works

The plugin transform the lambda into what you would do manually with `copy` functions, that means
the `copy` or `invoke` lambda can only work if the plugin is applied on the project it is being
The plugin transforms the lambda into what you would do manually with `copy` functions, that means
the `copy` or `invoke` lambda can only work if the plugin is applied to the project it is being
called.

If the plugin is not applied, the `copy` and `invoke` function calls will be marked as
errors. Don't suppress them without applying the plugin as they will not work.

You don't need to suppress them, the Gradle plugin will suppress them for you.

There is no reflection or mutability, your class will have some new functions and properties added,
as it will extend under the hood the `Kopyable` interface.

Expand All @@ -173,7 +178,7 @@ the number of properties and methods added to your data class will be reduced to
- `invoke` function

A new `KopyableScope` will be created, and it will be used to store the rest of properties, and it
will be added as context parameter to the `copy` and `invoke` lambdas:
will be added as a context parameter to the `copy` and `invoke` lambdas:

```kotlin
data class House(val squareMeters: Int, val kitchen: Kitchen) {
Expand Down
1 change: 0 additions & 1 deletion kopy-compiler/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion

hubdle {
config {
Expand Down
10 changes: 10 additions & 0 deletions kopy-compiler/test-data/box/edge/simple-1.fir.ir.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:House modality:FINAL visibility:public [data] superTypes:[kotlin.Any; com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.House>]'
FUN FAKE_OVERRIDE name:copy visibility:public modality:OPEN <> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.House>, copy:@[ExtensionFunctionType] kotlin.Function1<com.javiersc.kotlin.kopy.playground.House, kotlin.Unit>) returnType:com.javiersc.kotlin.kopy.playground.House [fake_override,infix]
annotations:
KopyOptIn
KopyFunctionCopy
overridden:
public open fun copy (copy: @[ExtensionFunctionType] kotlin.Function1<T of com.javiersc.kotlin.kopy.runtime.Kopyable, kotlin.Unit>): T of com.javiersc.kotlin.kopy.runtime.Kopyable declared in com.javiersc.kotlin.kopy.runtime.Kopyable
Expand All @@ -64,13 +65,15 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
FUN FAKE_OVERRIDE name:invoke visibility:public modality:OPEN <> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.House>, copy:@[ExtensionFunctionType] kotlin.Function1<com.javiersc.kotlin.kopy.playground.House, kotlin.Unit>) returnType:com.javiersc.kotlin.kopy.playground.House [fake_override,operator,infix]
annotations:
KopyFunctionInvoke
KopyOptIn
overridden:
public open fun invoke (copy: @[ExtensionFunctionType] kotlin.Function1<T of com.javiersc.kotlin.kopy.runtime.Kopyable, kotlin.Unit>): T of com.javiersc.kotlin.kopy.runtime.Kopyable declared in com.javiersc.kotlin.kopy.runtime.Kopyable
$this: VALUE_PARAMETER name:<this> type:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.House>
VALUE_PARAMETER name:copy index:0 type:@[ExtensionFunctionType] kotlin.Function1<com.javiersc.kotlin.kopy.playground.House, kotlin.Unit>
FUN FAKE_OVERRIDE name:set visibility:public modality:OPEN <D> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.House>, $receiver:D of com.javiersc.kotlin.kopy.playground.House.set, other:D of com.javiersc.kotlin.kopy.playground.House.set) returnType:kotlin.Unit [fake_override,infix]
annotations:
KopyFunctionSet
KopyOptIn
overridden:
public open fun set <D> (other: D of com.javiersc.kotlin.kopy.runtime.Kopyable.set): kotlin.Unit declared in com.javiersc.kotlin.kopy.runtime.Kopyable
TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] reified:false
Expand All @@ -87,6 +90,7 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
FUN FAKE_OVERRIDE name:update visibility:public modality:OPEN <D> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.House>, $receiver:D of com.javiersc.kotlin.kopy.playground.House.update, other:kotlin.Function1<D of com.javiersc.kotlin.kopy.playground.House.update, D of com.javiersc.kotlin.kopy.playground.House.update>) returnType:kotlin.Unit [fake_override,infix]
annotations:
KopyFunctionUpdate
KopyOptIn
overridden:
public open fun update <D> (other: kotlin.Function1<D of com.javiersc.kotlin.kopy.runtime.Kopyable.update, D of com.javiersc.kotlin.kopy.runtime.Kopyable.update>): kotlin.Unit declared in com.javiersc.kotlin.kopy.runtime.Kopyable
TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] reified:false
Expand All @@ -96,6 +100,7 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
FUN FAKE_OVERRIDE name:updateEach visibility:public modality:OPEN <D> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.House>, $receiver:kotlin.collections.Iterable<D of com.javiersc.kotlin.kopy.playground.House.updateEach>, other:kotlin.Function1<D of com.javiersc.kotlin.kopy.playground.House.updateEach, D of com.javiersc.kotlin.kopy.playground.House.updateEach>) returnType:kotlin.Unit [fake_override,infix]
annotations:
KopyFunctionUpdateEach
KopyOptIn
overridden:
public open fun updateEach <D> (other: kotlin.Function1<D of com.javiersc.kotlin.kopy.runtime.Kopyable.updateEach, D of com.javiersc.kotlin.kopy.runtime.Kopyable.updateEach>): kotlin.Unit declared in com.javiersc.kotlin.kopy.runtime.Kopyable
TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] reified:false
Expand Down Expand Up @@ -270,6 +275,7 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Pet modality:FINAL visibility:public [data] superTypes:[kotlin.Any; com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.Pet>]'
FUN FAKE_OVERRIDE name:copy visibility:public modality:OPEN <> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.Pet>, copy:@[ExtensionFunctionType] kotlin.Function1<com.javiersc.kotlin.kopy.playground.Pet, kotlin.Unit>) returnType:com.javiersc.kotlin.kopy.playground.Pet [fake_override,infix]
annotations:
KopyOptIn
KopyFunctionCopy
overridden:
public open fun copy (copy: @[ExtensionFunctionType] kotlin.Function1<T of com.javiersc.kotlin.kopy.runtime.Kopyable, kotlin.Unit>): T of com.javiersc.kotlin.kopy.runtime.Kopyable declared in com.javiersc.kotlin.kopy.runtime.Kopyable
Expand All @@ -284,13 +290,15 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
FUN FAKE_OVERRIDE name:invoke visibility:public modality:OPEN <> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.Pet>, copy:@[ExtensionFunctionType] kotlin.Function1<com.javiersc.kotlin.kopy.playground.Pet, kotlin.Unit>) returnType:com.javiersc.kotlin.kopy.playground.Pet [fake_override,operator,infix]
annotations:
KopyFunctionInvoke
KopyOptIn
overridden:
public open fun invoke (copy: @[ExtensionFunctionType] kotlin.Function1<T of com.javiersc.kotlin.kopy.runtime.Kopyable, kotlin.Unit>): T of com.javiersc.kotlin.kopy.runtime.Kopyable declared in com.javiersc.kotlin.kopy.runtime.Kopyable
$this: VALUE_PARAMETER name:<this> type:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.Pet>
VALUE_PARAMETER name:copy index:0 type:@[ExtensionFunctionType] kotlin.Function1<com.javiersc.kotlin.kopy.playground.Pet, kotlin.Unit>
FUN FAKE_OVERRIDE name:set visibility:public modality:OPEN <D> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.Pet>, $receiver:D of com.javiersc.kotlin.kopy.playground.Pet.set, other:D of com.javiersc.kotlin.kopy.playground.Pet.set) returnType:kotlin.Unit [fake_override,infix]
annotations:
KopyFunctionSet
KopyOptIn
overridden:
public open fun set <D> (other: D of com.javiersc.kotlin.kopy.runtime.Kopyable.set): kotlin.Unit declared in com.javiersc.kotlin.kopy.runtime.Kopyable
TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] reified:false
Expand All @@ -307,6 +315,7 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
FUN FAKE_OVERRIDE name:update visibility:public modality:OPEN <D> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.Pet>, $receiver:D of com.javiersc.kotlin.kopy.playground.Pet.update, other:kotlin.Function1<D of com.javiersc.kotlin.kopy.playground.Pet.update, D of com.javiersc.kotlin.kopy.playground.Pet.update>) returnType:kotlin.Unit [fake_override,infix]
annotations:
KopyFunctionUpdate
KopyOptIn
overridden:
public open fun update <D> (other: kotlin.Function1<D of com.javiersc.kotlin.kopy.runtime.Kopyable.update, D of com.javiersc.kotlin.kopy.runtime.Kopyable.update>): kotlin.Unit declared in com.javiersc.kotlin.kopy.runtime.Kopyable
TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] reified:false
Expand All @@ -316,6 +325,7 @@ FILE fqName:com.javiersc.kotlin.kopy.playground fileName:/simple-1.kt
FUN FAKE_OVERRIDE name:updateEach visibility:public modality:OPEN <D> ($this:com.javiersc.kotlin.kopy.runtime.Kopyable<com.javiersc.kotlin.kopy.playground.Pet>, $receiver:kotlin.collections.Iterable<D of com.javiersc.kotlin.kopy.playground.Pet.updateEach>, other:kotlin.Function1<D of com.javiersc.kotlin.kopy.playground.Pet.updateEach, D of com.javiersc.kotlin.kopy.playground.Pet.updateEach>) returnType:kotlin.Unit [fake_override,infix]
annotations:
KopyFunctionUpdateEach
KopyOptIn
overridden:
public open fun updateEach <D> (other: kotlin.Function1<D of com.javiersc.kotlin.kopy.runtime.Kopyable.updateEach, D of com.javiersc.kotlin.kopy.runtime.Kopyable.updateEach>): kotlin.Unit declared in com.javiersc.kotlin.kopy.runtime.Kopyable
TYPE_PARAMETER name:D index:0 variance: superTypes:[kotlin.Any?] reified:false
Expand Down
2 changes: 1 addition & 1 deletion kopy-compiler/test-data/box/edge/simple-1.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// !LANGUAGE: +ContextReceivers
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS
// OPT_IN: com.javiersc.kotlin.kopy.KopyOptIn

package com.javiersc.kotlin.kopy.playground

Expand Down
Loading

0 comments on commit 422d38c

Please sign in to comment.