Compare commits

...

9 Commits
v0.4 ... master

8 changed files with 153 additions and 4 deletions

View File

@ -1,3 +1,4 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.*
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin.xomrk
@ -14,7 +15,7 @@ buildscript {
}
group = "ru.landgrafhomyak.utility"
version = "0.4"
version = "0.5"
repositories {
mavenCentral()
@ -24,8 +25,72 @@ xomrk {
kotlin {
setCompatibilityWithKotlin(KotlinVersion.KOTLIN_2_0)
optInContracts()
noWarnExpectActual()
warningsAsErrors()
defineAllMultiplatformTargets()
jvmToolchain(8)
jvm {
withJava()
compilations.configureEach {
compileJavaTaskProvider?.configure {
targetCompatibility = "1.8"
}
compileTaskProvider.configure {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
}
}
}
tasks.named { t -> t == "${this@jvm.name}Test" }.configureEach {
this as Test
useTestNG()
}
}
sourceSets {
// if use kotlin("stdlib") gitea ui brokes at paragraph with dependency versions
val kotlinStdlibDependency = "org.jetbrains.kotlin:kotlin-stdlib:${this@kotlin.coreLibrariesVersion}"
val commonMain by getting {
dependencies {
compileOnly(kotlinStdlibDependency)
}
}
val jvmMain by getting {
dependsOn(commonMain)
dependencies {
compileOnly(kotlinStdlibDependency)
}
}
val nonJvmMain by creating {
dependsOn(commonMain)
dependencies {
implementation(kotlinStdlibDependency)
}
}
jvmTest {
dependencies {
implementation("org.testng:testng:7.5.1")
}
}
configureEach {
when {
// commonMain !in dependsOn -> return@configureEach
!name.endsWith("Main") -> return@configureEach
this@configureEach === commonMain -> return@configureEach
this@configureEach === jvmMain -> return@configureEach
this@configureEach === nonJvmMain -> return@configureEach
}
dependsOn(nonJvmMain)
}
}
}
publishing {

View File

@ -1 +1,6 @@
kotlin.code.style=official
kotlin.stdlib.default.dependency=false
kotlin.mpp.applyDefaultHierarchyTemplate=false
kotlin.native.enableKlibsCrossCompilation=true
# compileOnly dependencies from commonMain still throw warning
kotlin.suppressGradlePluginWarnings=IncorrectCompileOnlyDependencyWarning
kotlin.js.stdlib.dom.api.included=false

View File

@ -0,0 +1,7 @@
package ru.landgrafhomyak.utility.highlevel_try_finally
@PublishedApi
internal expect object ExceptionsKt {
@PublishedApi
internal fun addSuppressed(e1: Throwable?, e2: Throwable?)
}

View File

@ -12,7 +12,7 @@ class TryFinallyChainScope @PublishedApi internal constructor() {
this._actualException?.let { e -> throw e }
}
inline fun action(fn: () -> Unit) {
inline fun action(fn: () -> Unit): TryFinallyChainScope {
contract {
callsInPlace(fn, InvocationKind.EXACTLY_ONCE)
}
@ -21,5 +21,6 @@ class TryFinallyChainScope @PublishedApi internal constructor() {
onError = { err -> this._actualException?.addSuppressed(err) ?: run { this._actualException = err } },
action = fn
)
return this
}
}

View File

@ -86,7 +86,7 @@ inline fun <R> safeAutoClose3e(
try {
onError(e1)
} catch (e2: Throwable) {
e1.addSuppressed(e2)
ExceptionsKt.addSuppressed(e1, e2)
}
throw e1
} finally {

View File

@ -0,0 +1,12 @@
package ru.landgrafhomyak.utility.highlevel_try_finally
@PublishedApi
internal actual object ExceptionsKt {
@PublishedApi
@JvmStatic
internal actual fun addSuppressed(e1: Throwable?, e2: Throwable?) {
if (e1 == null) throw NullPointerException("e1")
if (e2 == null) throw NullPointerException("e2")
(java.lang.Throwable::addSuppressed)(e1 as java.lang.Throwable, e2)
}
}

View File

@ -0,0 +1,48 @@
package ru.landgrafhomyak.utility.highlevel_try_finally.tests
import org.testng.annotations.Test
import ru.landgrafhomyak.utility.highlevel_try_finally.safeAutoClose1
@Test
class KotlinStdlibDependencyTest {
@Test
fun testNoKotlinStdlib() {
try {
if (KotlinVersion.CURRENT.major != -1)
throw AssertionError("Kotlin stdlib still in runtime classpath")
} catch (_: LinkageError) {
}
}
private class CustomTestException : RuntimeException()
private object CustomUnit
private fun throw7throwFn() {
safeAutoClose1(finally = { throw CustomTestException() }, action = { throw CustomTestException() })
}
@Suppress("NOTHING_TO_INLINE")
private inline fun throw7throwIn() {
safeAutoClose1(finally = { throw CustomTestException() }, action = { throw CustomTestException() })
}
@Test(dependsOnMethods = ["testNoKotlinStdlib"])
fun testAutoCloseFn() {
try {
throw7throwFn()
} catch (_: CustomTestException) {
} catch (le: LinkageError) {
throw AssertionError("safeAutoClose still has dependency on kotlin stdlib", le)
}
}
@Test(dependsOnMethods = ["testNoKotlinStdlib"])
fun testAutoCloseIn() {
try {
throw7throwIn()
} catch (_: CustomTestException) {
} catch (le: LinkageError) {
throw AssertionError("safeAutoClose still has dependency on kotlin stdlib", le)
}
}
}

View File

@ -0,0 +1,11 @@
package ru.landgrafhomyak.utility.highlevel_try_finally
import kotlin.addSuppressed as kotlinAddSuppressed
@PublishedApi
internal actual object ExceptionsKt {
@PublishedApi
internal actual fun addSuppressed(e1: Throwable?, e2: Throwable?) {
e1!!.kotlinAddSuppressed(e2!!)
}
}