arrow-meta icon indicating copy to clipboard operation
arrow-meta copied to clipboard

[BUG] refined-type-plugin is not getting applied when evaluating dynamic variables at compile time

Open lenguyenthanh opened this issue 3 years ago • 1 comments

Describe the bug refined-type-plugin is not getting applied when evaluating dynamic variables at compile time

To Reproduce Update demo code with

data class PositiveIntEven private constructor(val value: Int) {
    companion object : Refined<Int, PositiveIntEven>(::PositiveIntEven, PositiveInt, Even)
}

fun main() {
    val n = -1
    val result = PositiveInt(n).value
}

It is still compiled and throw an exception in runtime.

Output:

Exception in thread "main" java.lang.IllegalArgumentException: -1 should be > 0
	at io.arrowkt.example.ContextKt.main(Context.kt:22)
	at io.arrowkt.example.ContextKt.main(Context.kt)

Expected behavior The code above should cause a compiler error:

error: Prefer a safe alternative such as PositiveInt.orNull(n) or for explicit use of exceptions `PositiveInt.require(n)`

lenguyenthanh avatar Jun 12 '21 07:06 lenguyenthanh

Thanks @lenguyenthanh !

I think refined-type-plugin is properly published and it's being applied. It seems the issue comes from the plugin.

Including some cases here.

Example 1

Case 1.1 - Expected result

Input

val result = PositiveInt(-1).value

Compilation output

-1 should be > 0 : arrow.refinement.numbers.PositiveInt.Companion.invoke

It's the expected output. The plugin is being applied.

Case 1.2 - Expected result

Input

fun main() {
    val result = PositiveInt(-1).value
}

Compilation output

-1 should be > 0 : arrow.refinement.numbers.PositiveInt.Companion.invoke

It's the expected output. The plugin is being applied.

Example 2

Case 2.1 - Expected result

Input

val n = -1
val result = PositiveInt(n).value

Compilation output

val n = -1 can't be verified at compile time. Use `Predicate.orNull(val n = -1)` for safe
access or `Predicate.require(val n = -1)` for explicit unsafe instantiation

It's the expected output according to this test of the plugin. The plugin is being applied.

Case 2.2 - NOT expected result

Input

fun main() {
    val n = -1
    val result = PositiveInt(n).value
}

main or any other function.

Compilation output

BUILD SUCCESSFUL

It's not the expected output. The plugin doesn't show the same behavior as before.

rachelcarmena avatar Jun 26 '21 15:06 rachelcarmena