diff --git a/src/main/kotlin/app/revanced/patcher/patch/PatchOption.kt b/src/main/kotlin/app/revanced/patcher/patch/PatchOption.kt index 61fdae6a..95adb736 100644 --- a/src/main/kotlin/app/revanced/patcher/patch/PatchOption.kt +++ b/src/main/kotlin/app/revanced/patcher/patch/PatchOption.kt @@ -101,11 +101,13 @@ sealed class PatchOption( * Gets the value of the option. * Please note that using the wrong value type results in a runtime error. */ - inline operator fun getValue(thisRef: Any?, property: KProperty<*>) = - value as? V ?: throw InvalidTypeException( + inline operator fun getValue(thisRef: Any?, property: KProperty<*>): V? { + if (value !is V?) throw InvalidTypeException( V::class.java.canonicalName, value?.let { it::class.java.canonicalName } ?: "null" ) + return value as? V? + } /** * Gets the value of the option. diff --git a/src/test/kotlin/app/revanced/patcher/issues/Issue98.kt b/src/test/kotlin/app/revanced/patcher/issues/Issue98.kt new file mode 100644 index 00000000..9e095b5f --- /dev/null +++ b/src/test/kotlin/app/revanced/patcher/issues/Issue98.kt @@ -0,0 +1,18 @@ +package app.revanced.patcher.issues + +import app.revanced.patcher.patch.PatchOption +import org.junit.jupiter.api.Test +import kotlin.test.assertNull + +internal class Issue98 { + companion object { + var key1: String? by PatchOption.StringOption( + "key1", null, "title", "description" + ) + } + + @Test + fun `should infer nullable type correctly`() { + assertNull(key1) + } +} \ No newline at end of file diff --git a/src/test/kotlin/app/revanced/patcher/patch/PatchOptionsTest.kt b/src/test/kotlin/app/revanced/patcher/patch/PatchOptionsTest.kt index 04f4e659..6f6667d8 100644 --- a/src/test/kotlin/app/revanced/patcher/patch/PatchOptionsTest.kt +++ b/src/test/kotlin/app/revanced/patcher/patch/PatchOptionsTest.kt @@ -48,7 +48,7 @@ internal class PatchOptionsTest { @Test fun `should return a different value when changed`() { - var value: String by options["key1"] + var value: String? by options["key1"] val current = value + "" // force a copy value = "Hello, world!" assertNotEquals(current, value) diff --git a/src/test/kotlin/app/revanced/patcher/usage/bytecode/ExampleBytecodePatch.kt b/src/test/kotlin/app/revanced/patcher/usage/bytecode/ExampleBytecodePatch.kt index 454283a9..030272de 100644 --- a/src/test/kotlin/app/revanced/patcher/usage/bytecode/ExampleBytecodePatch.kt +++ b/src/test/kotlin/app/revanced/patcher/usage/bytecode/ExampleBytecodePatch.kt @@ -171,32 +171,32 @@ class ExampleBytecodePatch : BytecodePatch(listOf(ExampleFingerprint)) { } companion object : OptionsContainer() { - private var key1: String by option( + private var key1: String? by option( PatchOption.StringOption( "key1", "default", "title", "description", true ) ) - private var key2: Boolean by option( + private var key2: Boolean? by option( PatchOption.BooleanOption( "key2", true, "title", "description" // required defaults to false ) ) - private var key3: String by option( + private var key3: String? by option( PatchOption.StringListOption( "key3", "TEST", listOf("TEST", "TEST1", "TEST2"), "title", "description" ) ) - private var key4: Int by option( + private var key4: Int? by option( PatchOption.IntListOption( "key4", 1, listOf(1, 2, 3), "title", "description" ) ) - private var key5: Path by option( + private var key5: Path? by option( PatchOption.PathOption( "key5", File("test.txt").toPath(), "title", "description" ) ) - private var key6: String by option( + private var key6: String? by option( PatchOption.StringOption( "key6", null, "title", "description", true )