Skip to content

Commit 26970d8

Browse files
authored
Add contract for action/block (#1582)
1 parent 195f840 commit 26970d8

File tree

8 files changed

+87
-7
lines changed

8 files changed

+87
-7
lines changed

okio/build.gradle.kts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ kotlin {
5959
languageSettings.apply {
6060
// Required for CPointer etc. since Kotlin 1.9.
6161
optIn("kotlinx.cinterop.ExperimentalForeignApi")
62+
// Required for Contract API. since Kotlin 1.3.
63+
optIn("kotlin.contracts.ExperimentalContracts")
6264
}
6365
}
6466

@@ -141,12 +143,20 @@ kotlin {
141143
.also { nativeMain ->
142144
nativeMain.dependsOn(zlibMain)
143145
nativeMain.dependsOn(systemFileSystemMain)
144-
createSourceSet("mingwMain", parent = nativeMain, children = mingwTargets).also { mingwMain ->
146+
createSourceSet(
147+
"mingwMain",
148+
parent = nativeMain,
149+
children = mingwTargets,
150+
).also { mingwMain ->
145151
mingwMain.dependsOn(nonAppleMain)
146152
}
147153
createSourceSet("unixMain", parent = nativeMain)
148154
.also { unixMain ->
149-
createSourceSet("linuxMain", parent = unixMain, children = linuxTargets).also { linuxMain ->
155+
createSourceSet(
156+
"linuxMain",
157+
parent = unixMain,
158+
children = linuxTargets,
159+
).also { linuxMain ->
150160
linuxMain.dependsOn(nonAppleMain)
151161
}
152162
createSourceSet("appleMain", parent = unixMain, children = appleTargets)

okio/src/commonMain/kotlin/okio/Okio.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
package okio
2222

23+
import kotlin.contracts.InvocationKind
24+
import kotlin.contracts.contract
2325
import kotlin.jvm.JvmMultifileClass
2426
import kotlin.jvm.JvmName
2527

@@ -49,6 +51,10 @@ private class BlackholeSink : Sink {
4951

5052
/** Execute [block] then close this. This will be closed even if [block] throws. */
5153
inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
54+
contract {
55+
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
56+
}
57+
5258
var thrown: Throwable? = null
5359

5460
val result = try {

okio/src/jsMain/kotlin/okio/FileSystem.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package okio
1717

18+
import kotlin.contracts.InvocationKind
19+
import kotlin.contracts.contract
1820
import okio.Path.Companion.toPath
1921
import okio.internal.commonCopy
2022
import okio.internal.commonCreateDirectories
@@ -50,6 +52,10 @@ actual abstract class FileSystem : Closeable {
5052
actual abstract fun source(file: Path): Source
5153

5254
actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
55+
contract {
56+
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
57+
}
58+
5359
return source(file).buffer().use {
5460
it.readerAction()
5561
}
@@ -62,6 +68,10 @@ actual abstract class FileSystem : Closeable {
6268
mustCreate: Boolean,
6369
writerAction: BufferedSink.() -> T,
6470
): T {
71+
contract {
72+
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
73+
}
74+
6575
return sink(file, mustCreate).buffer().use {
6676
it.writerAction()
6777
}
@@ -71,7 +81,8 @@ actual abstract class FileSystem : Closeable {
7181

7282
actual abstract fun createDirectory(dir: Path, mustCreate: Boolean)
7383

74-
actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit = commonCreateDirectories(dir, mustCreate)
84+
actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit =
85+
commonCreateDirectories(dir, mustCreate)
7586

7687
actual abstract fun atomicMove(source: Path, target: Path)
7788

okio/src/jvmMain/kotlin/okio/-JvmPlatform.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package okio
1818

1919
import java.util.concurrent.locks.ReentrantLock
2020
import kotlin.concurrent.withLock as jvmWithLock
21+
import kotlin.contracts.InvocationKind
22+
import kotlin.contracts.contract
2123

2224
internal actual fun ByteArray.toUtf8String(): String = String(this, Charsets.UTF_8)
2325

@@ -30,7 +32,13 @@ actual typealias Lock = ReentrantLock
3032

3133
internal actual fun newLock(): Lock = ReentrantLock()
3234

33-
actual inline fun <T> Lock.withLock(action: () -> T): T = jvmWithLock(action)
35+
actual inline fun <T> Lock.withLock(action: () -> T): T {
36+
contract {
37+
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
38+
}
39+
40+
return jvmWithLock(action)
41+
}
3442

3543
actual typealias IOException = java.io.IOException
3644

okio/src/jvmMain/kotlin/okio/FileSystem.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package okio
1717

1818
import java.nio.file.FileSystem as JavaNioFileSystem
19+
import kotlin.contracts.InvocationKind
20+
import kotlin.contracts.contract
1921
import okio.Path.Companion.toPath
2022
import okio.internal.ResourceFileSystem
2123
import okio.internal.commonCopy
@@ -64,6 +66,10 @@ actual abstract class FileSystem : Closeable {
6466
@Throws(IOException::class)
6567
@JvmName("-read")
6668
actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
69+
contract {
70+
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
71+
}
72+
6773
return source(file).buffer().use {
6874
it.readerAction()
6975
}
@@ -77,7 +83,15 @@ actual abstract class FileSystem : Closeable {
7783

7884
@Throws(IOException::class)
7985
@JvmName("-write")
80-
actual inline fun <T> write(file: Path, mustCreate: Boolean, writerAction: BufferedSink.() -> T): T {
86+
actual inline fun <T> write(
87+
file: Path,
88+
mustCreate: Boolean,
89+
writerAction: BufferedSink.() -> T,
90+
): T {
91+
contract {
92+
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
93+
}
94+
8195
return sink(file, mustCreate = mustCreate).buffer().use {
8296
it.writerAction()
8397
}

okio/src/nativeMain/kotlin/okio/FileSystem.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package okio
1717

18+
import kotlin.contracts.InvocationKind
19+
import kotlin.contracts.contract
1820
import okio.internal.commonCopy
1921
import okio.internal.commonCreateDirectories
2022
import okio.internal.commonDeleteRecursively
@@ -58,6 +60,10 @@ actual abstract class FileSystem : Closeable {
5860

5961
@Throws(IOException::class)
6062
actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
63+
contract {
64+
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
65+
}
66+
6167
return source(file).buffer().use {
6268
it.readerAction()
6369
}
@@ -72,6 +78,10 @@ actual abstract class FileSystem : Closeable {
7278
mustCreate: Boolean,
7379
writerAction: BufferedSink.() -> T,
7480
): T {
81+
contract {
82+
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
83+
}
84+
7585
return sink(file, mustCreate).buffer().use {
7686
it.writerAction()
7787
}
@@ -84,7 +94,8 @@ actual abstract class FileSystem : Closeable {
8494
actual abstract fun createDirectory(dir: Path, mustCreate: Boolean)
8595

8696
@Throws(IOException::class)
87-
actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit = commonCreateDirectories(dir, mustCreate)
97+
actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit =
98+
commonCreateDirectories(dir, mustCreate)
8899

89100
@Throws(IOException::class)
90101
actual abstract fun atomicMove(source: Path, target: Path)

okio/src/nonJvmMain/kotlin/okio/NonJvmPlatform.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package okio
1818

19+
import kotlin.contracts.InvocationKind
20+
import kotlin.contracts.contract
1921
import okio.internal.commonAsUtf8ToByteArray
2022
import okio.internal.commonToUtf8String
2123

@@ -37,7 +39,13 @@ actual class Lock {
3739

3840
internal actual fun newLock(): Lock = Lock.instance
3941

40-
actual inline fun <T> Lock.withLock(action: () -> T): T = action()
42+
actual inline fun <T> Lock.withLock(action: () -> T): T {
43+
contract {
44+
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
45+
}
46+
47+
return action()
48+
}
4149

4250
actual open class IOException actual constructor(
4351
message: String?,

okio/src/wasmMain/kotlin/okio/FileSystem.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package okio
1717

18+
import kotlin.contracts.ExperimentalContracts
19+
import kotlin.contracts.InvocationKind
20+
import kotlin.contracts.contract
1821
import okio.Path.Companion.toPath
1922
import okio.internal.commonCopy
2023
import okio.internal.commonCreateDirectories
@@ -23,6 +26,7 @@ import okio.internal.commonExists
2326
import okio.internal.commonListRecursively
2427
import okio.internal.commonMetadata
2528

29+
@OptIn(ExperimentalContracts::class)
2630
actual abstract class FileSystem : Closeable {
2731
actual abstract fun canonicalize(path: Path): Path
2832

@@ -50,6 +54,10 @@ actual abstract class FileSystem : Closeable {
5054
actual abstract fun source(file: Path): Source
5155

5256
actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
57+
contract {
58+
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
59+
}
60+
5361
return source(file).buffer().use {
5462
it.readerAction()
5563
}
@@ -62,6 +70,10 @@ actual abstract class FileSystem : Closeable {
6270
mustCreate: Boolean,
6371
writerAction: BufferedSink.() -> T,
6472
): T {
73+
contract {
74+
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
75+
}
76+
6577
return sink(file, mustCreate).buffer().use {
6678
it.writerAction()
6779
}

0 commit comments

Comments
 (0)