Skip to content

Commit

Permalink
Add diagnostics/missing-data-class tests
Browse files Browse the repository at this point in the history
  • Loading branch information
JavierSegoviaCordoba committed Apr 16, 2024
1 parent e4dc633 commit ac12cce
Show file tree
Hide file tree
Showing 14 changed files with 617 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,23 @@ internal object FirKopyExpressionCheckers : ExpressionCheckers() {
setOf(
BreakingCallsChecker,
)
// override val variableAssignmentCheckers: Set<FirVariableAssignmentChecker> =
// setOf(
// BreakingVariableAssignmentChecker,
// )
}

// private object BreakingVariableAssignmentChecker :
// FirVariableAssignmentChecker(MppCheckerKind.Common) {
// override fun check(
// expression: FirVariableAssignment,
// context: CheckerContext,
// reporter: DiagnosticReporter
// ) {
// TODO("Report assignments issues (same way we report `set` function issues")
// }
// }

private object BreakingCallsChecker : FirCallChecker(MppCheckerKind.Common) {

override fun check(expression: FirCall, context: CheckerContext, reporter: DiagnosticReporter) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
FILE: simple-1-level-deep-update-each.kt
package com.javiersc.kotlin.kopy.playground

public final fun diagnostics(): R|kotlin/Unit| {
lval qux0: R|com/javiersc/kotlin/kopy/playground/Qux| = R|com/javiersc/kotlin/kopy/playground/Qux.Qux|(Int(7))
lval baz0: R|com/javiersc/kotlin/kopy/playground/Baz| = R|com/javiersc/kotlin/kopy/playground/Baz.Baz|(R|<local>/qux0|, R|kotlin/collections/listOf|<R|kotlin/String|>(vararg(String(Random 0), String(Random 1))))
lval bar0: R|com/javiersc/kotlin/kopy/playground/Bar| = R|com/javiersc/kotlin/kopy/playground/Bar.Bar|(R|<local>/baz0|, Boolean(true))
lval foo0: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(R|<local>/bar0|, Char(W))
lval foo61: R|com/javiersc/kotlin/kopy/playground/Foo| = R|<local>/foo0|.R|SubstitutionOverride<com/javiersc/kotlin/kopy/playground/Foo.invoke: R|com/javiersc/kotlin/kopy/playground/Foo|>|(<L> = foo0@fun R|com/javiersc/kotlin/kopy/playground/Foo|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
(this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.bar|.R|com/javiersc/kotlin/kopy/playground/Bar.baz|.R|com/javiersc/kotlin/kopy/playground/Baz.texts|).R|SubstitutionOverride<com/javiersc/kotlin/kopy/playground/Foo.updateEach: R|kotlin/Unit|>|<R|kotlin/String|>(<L> = updateEach@fun <anonymous>(it: R|kotlin/String|): R|kotlin/String| <inline=NoInline> {
^ <strcat>(R|<local>/it|, String( foo))
}
)
}
)
}
@R|com/javiersc/kotlin/kopy/Kopy|() public final data class Qux : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Qux>| {
public constructor(number: R|kotlin/Int|): R|com/javiersc/kotlin/kopy/playground/Qux| {
super<R|kotlin/Any|>()
}

public final val number: R|kotlin/Int| = R|<local>/number|
public get(): R|kotlin/Int|

public final operator fun component1(): R|kotlin/Int|

public final fun copy(number: R|kotlin/Int| = this@R|com/javiersc/kotlin/kopy/playground/Qux|.R|com/javiersc/kotlin/kopy/playground/Qux.number|): R|com/javiersc/kotlin/kopy/playground/Qux|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Qux>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Qux>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Qux>|

}
@R|com/javiersc/kotlin/kopy/Kopy|() public final class Baz : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Baz>| {
public constructor(qux: R|com/javiersc/kotlin/kopy/playground/Qux|, texts: R|kotlin/collections/List<kotlin/String>|): R|com/javiersc/kotlin/kopy/playground/Baz| {
super<R|kotlin/Any|>()
}

public final val qux: R|com/javiersc/kotlin/kopy/playground/Qux| = R|<local>/qux|
public get(): R|com/javiersc/kotlin/kopy/playground/Qux|

public final val texts: R|kotlin/collections/List<kotlin/String>| = R|<local>/texts|
public get(): R|kotlin/collections/List<kotlin/String>|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Baz>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Baz>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Baz>|

}
@R|com/javiersc/kotlin/kopy/Kopy|() public final data class Bar : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Bar>| {
public constructor(baz: R|com/javiersc/kotlin/kopy/playground/Baz|, isValid: R|kotlin/Boolean|): R|com/javiersc/kotlin/kopy/playground/Bar| {
super<R|kotlin/Any|>()
}

public final val baz: R|com/javiersc/kotlin/kopy/playground/Baz| = R|<local>/baz|
public get(): R|com/javiersc/kotlin/kopy/playground/Baz|

public final val isValid: R|kotlin/Boolean| = R|<local>/isValid|
public get(): R|kotlin/Boolean|

public final operator fun component1(): R|com/javiersc/kotlin/kopy/playground/Baz|

public final operator fun component2(): R|kotlin/Boolean|

public final fun copy(baz: R|com/javiersc/kotlin/kopy/playground/Baz| = this@R|com/javiersc/kotlin/kopy/playground/Bar|.R|com/javiersc/kotlin/kopy/playground/Bar.baz|, isValid: R|kotlin/Boolean| = this@R|com/javiersc/kotlin/kopy/playground/Bar|.R|com/javiersc/kotlin/kopy/playground/Bar.isValid|): R|com/javiersc/kotlin/kopy/playground/Bar|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Bar>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Bar>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Bar>|

}
@R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Foo>| {
public constructor(bar: R|com/javiersc/kotlin/kopy/playground/Bar|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo| {
super<R|kotlin/Any|>()
}

public final val bar: R|com/javiersc/kotlin/kopy/playground/Bar| = R|<local>/bar|
public get(): R|com/javiersc/kotlin/kopy/playground/Bar|

public final val letter: R|kotlin/Char| = R|<local>/letter|
public get(): R|kotlin/Char|

public final operator fun component1(): R|com/javiersc/kotlin/kopy/playground/Bar|

public final operator fun component2(): R|kotlin/Char|

public final fun copy(bar: R|com/javiersc/kotlin/kopy/playground/Bar| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.bar|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.letter|): R|com/javiersc/kotlin/kopy/playground/Foo|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Foo>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Foo>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Foo>|

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// !LANGUAGE: +ContextReceivers
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS

package com.javiersc.kotlin.kopy.playground

import com.javiersc.kotlin.kopy.Kopy

fun diagnostics() {
val qux0 = Qux(number = 7)
val baz0 = Baz(qux = qux0, texts = listOf("Random 0", "Random 1"))
val bar0 = Bar(baz = baz0, isValid = true)
val foo0 = Foo(bar = bar0, letter = 'W')

val foo61 = foo0 {
bar.<!MISSING_DATA_CLASS!>baz<!>.texts.updateEach { "$it foo" }
}
}

@Kopy data class Qux(val number: Int)
<!NON_DATA_CLASS_KOPY_ANNOTATED!>@Kopy<!> class Baz(val qux: Qux, val texts: List<String>)
@Kopy data class Bar(val baz: Baz, val isValid: Boolean)
@Kopy data class Foo(val bar: Bar, val letter: Char)
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
FILE: simple-1-level-deep-update.kt
package com.javiersc.kotlin.kopy.playground

public final fun diagnostics(): R|kotlin/Unit| {
lval qux0: R|com/javiersc/kotlin/kopy/playground/Qux| = R|com/javiersc/kotlin/kopy/playground/Qux.Qux|(Int(7))
lval baz0: R|com/javiersc/kotlin/kopy/playground/Baz| = R|com/javiersc/kotlin/kopy/playground/Baz.Baz|(R|<local>/qux0|, String(Random))
lval bar0: R|com/javiersc/kotlin/kopy/playground/Bar| = R|com/javiersc/kotlin/kopy/playground/Bar.Bar|(R|<local>/baz0|, Boolean(true))
lval foo0: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(R|<local>/bar0|, Char(W))
lval foo61: R|com/javiersc/kotlin/kopy/playground/Foo| = R|<local>/foo0|.R|SubstitutionOverride<com/javiersc/kotlin/kopy/playground/Foo.invoke: R|com/javiersc/kotlin/kopy/playground/Foo|>|(<L> = foo0@fun R|com/javiersc/kotlin/kopy/playground/Foo|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
(this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.bar|.R|com/javiersc/kotlin/kopy/playground/Bar.baz|.R|com/javiersc/kotlin/kopy/playground/Baz.text|).R|SubstitutionOverride<com/javiersc/kotlin/kopy/playground/Foo.update: R|kotlin/Unit|>|<R|kotlin/String|>(<L> = update@fun <anonymous>(it: R|kotlin/String|): R|kotlin/String| <inline=NoInline> {
^ <strcat>(R|<local>/it|, String( 2))
}
)
}
)
}
@R|com/javiersc/kotlin/kopy/Kopy|() public final data class Qux : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Qux>| {
public constructor(number: R|kotlin/Int|): R|com/javiersc/kotlin/kopy/playground/Qux| {
super<R|kotlin/Any|>()
}

public final val number: R|kotlin/Int| = R|<local>/number|
public get(): R|kotlin/Int|

public final operator fun component1(): R|kotlin/Int|

public final fun copy(number: R|kotlin/Int| = this@R|com/javiersc/kotlin/kopy/playground/Qux|.R|com/javiersc/kotlin/kopy/playground/Qux.number|): R|com/javiersc/kotlin/kopy/playground/Qux|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Qux>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Qux>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Qux>|

}
@R|com/javiersc/kotlin/kopy/Kopy|() public final class Baz : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Baz>| {
public constructor(qux: R|com/javiersc/kotlin/kopy/playground/Qux|, text: R|kotlin/String|): R|com/javiersc/kotlin/kopy/playground/Baz| {
super<R|kotlin/Any|>()
}

public final val qux: R|com/javiersc/kotlin/kopy/playground/Qux| = R|<local>/qux|
public get(): R|com/javiersc/kotlin/kopy/playground/Qux|

public final val text: R|kotlin/String| = R|<local>/text|
public get(): R|kotlin/String|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Baz>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Baz>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Baz>|

}
@R|com/javiersc/kotlin/kopy/Kopy|() public final data class Bar : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Bar>| {
public constructor(baz: R|com/javiersc/kotlin/kopy/playground/Baz|, isValid: R|kotlin/Boolean|): R|com/javiersc/kotlin/kopy/playground/Bar| {
super<R|kotlin/Any|>()
}

public final val baz: R|com/javiersc/kotlin/kopy/playground/Baz| = R|<local>/baz|
public get(): R|com/javiersc/kotlin/kopy/playground/Baz|

public final val isValid: R|kotlin/Boolean| = R|<local>/isValid|
public get(): R|kotlin/Boolean|

public final operator fun component1(): R|com/javiersc/kotlin/kopy/playground/Baz|

public final operator fun component2(): R|kotlin/Boolean|

public final fun copy(baz: R|com/javiersc/kotlin/kopy/playground/Baz| = this@R|com/javiersc/kotlin/kopy/playground/Bar|.R|com/javiersc/kotlin/kopy/playground/Bar.baz|, isValid: R|kotlin/Boolean| = this@R|com/javiersc/kotlin/kopy/playground/Bar|.R|com/javiersc/kotlin/kopy/playground/Bar.isValid|): R|com/javiersc/kotlin/kopy/playground/Bar|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Bar>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Bar>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Bar>|

}
@R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any|, R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Foo>| {
public constructor(bar: R|com/javiersc/kotlin/kopy/playground/Bar|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo| {
super<R|kotlin/Any|>()
}

public final val bar: R|com/javiersc/kotlin/kopy/playground/Bar| = R|<local>/bar|
public get(): R|com/javiersc/kotlin/kopy/playground/Bar|

public final val letter: R|kotlin/Char| = R|<local>/letter|
public get(): R|kotlin/Char|

public final operator fun component1(): R|com/javiersc/kotlin/kopy/playground/Bar|

public final operator fun component2(): R|kotlin/Char|

public final fun copy(bar: R|com/javiersc/kotlin/kopy/playground/Bar| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.bar|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.letter|): R|com/javiersc/kotlin/kopy/playground/Foo|

public open override fun _initKopyable(): R|com/javiersc/kotlin/kopy/runtime/Kopyable<com/javiersc/kotlin/kopy/playground/Foo>| {
}

public open override val _atomic: R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Foo>|
public get(): R|kotlinx/atomicfu/AtomicRef<com/javiersc/kotlin/kopy/playground/Foo>|

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// !LANGUAGE: +ContextReceivers
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS

package com.javiersc.kotlin.kopy.playground

import com.javiersc.kotlin.kopy.Kopy

fun diagnostics() {
val qux0 = Qux(number = 7)
val baz0 = Baz(qux = qux0, text = "Random")
val bar0 = Bar(baz = baz0, isValid = true)
val foo0 = Foo(bar = bar0, letter = 'W')

val foo61 = foo0 {
bar.<!MISSING_DATA_CLASS!>baz<!>.text.update { "$it 2" }
}
}

@Kopy data class Qux(val number: Int)
<!NON_DATA_CLASS_KOPY_ANNOTATED!>@Kopy<!> class Baz(val qux: Qux, val text: String)
@Kopy data class Bar(val baz: Baz, val isValid: Boolean)
@Kopy data class Foo(val bar: Bar, val letter: Char)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// !LANGUAGE: +ContextReceivers
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS

package com.javiersc.kotlin.kopy.playground

import com.javiersc.kotlin.kopy.Kopy

fun diagnostics() {
val qux0 = Qux(number = 7)
val baz0 = Baz(qux = qux0, text = "Random")
val bar0 = Bar(baz = baz0, isValid = true)
val foo0 = Foo(bar = bar0, letter = 'W')

val foo61 = foo0 {
bar.<!MISSING_DATA_CLASS!>baz<!>.qux.number.set(10)
}
}

@Kopy data class Qux(val number: Int)
<!NON_DATA_CLASS_KOPY_ANNOTATED!>@Kopy<!> class Baz(val qux: Qux, val text: String)
@Kopy data class Bar(val baz: Baz, val isValid: Boolean)
@Kopy data class Foo(val bar: Bar, val letter: Char)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// !LANGUAGE: +ContextReceivers
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS

package com.javiersc.kotlin.kopy.playground

import com.javiersc.kotlin.kopy.Kopy

fun diagnostics() {
val house = House(
squareMeters = 100,
kitchen = Kitchen(
cat = Cat(
name = "Garfield",
age = 5,
),
squareMeters = 10,
)
)

val house2 = house copy {
<!MISSING_DATA_CLASS!>kitchen<!>.cat.age = 6
<!MISSING_DATA_CLASS!>kitchen<!>.squareMeters = 45
}
}

@Kopy data class House(val squareMeters: Int, val kitchen: Kitchen)
class Kitchen(val cat: Cat, val squareMeters: Int)
data class Cat(val name: String, val age: Int)
Loading

0 comments on commit ac12cce

Please sign in to comment.