Skip to content

Commit c16c42c

Browse files
authored
Merge pull request #11 from skydoves/feature/contract
Feature: contract
2 parents 77059e4 + 79ce138 commit c16c42c

File tree

11 files changed

+401
-119
lines changed

11 files changed

+401
-119
lines changed

dependencies.gradle

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ ext.versions = [
55
versionCode : 11,
66
versionName : '1.1.0',
77

8-
gradleBuildTool : '4.1.3',
9-
spotlessGradle : '5.14.0',
8+
gradleBuildTool : '7.0.2',
9+
spotlessGradle : '5.15.0',
1010
ktlintGradle : '0.41.0',
1111
dokkaGradle : '1.4.30',
1212
binaryValidator : '0.7.1',
1313
mavenPublish : '0.15.1',
1414

15-
kotlin : '1.4.31',
15+
kotlin : '1.5.30',
1616
androidxAppcompat: '1.3.0',
1717

1818
// for demo

gradle/wrapper/gradle-wrapper.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip

whatif-android/build.gradle

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ android {
2424
}
2525

2626
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
27-
kotlinOptions.freeCompilerArgs += ["-Xexplicit-api=strict"]
27+
kotlinOptions.freeCompilerArgs += [
28+
"-Xexplicit-api=strict",
29+
"-Xopt-in=kotlin.contracts.ExperimentalContracts"
30+
]
2831
}
2932

3033
dependencies {

whatif-android/src/main/java/com/skydoves/whatif_android/WhatIfActivity.kt

+58-16
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import android.os.Parcelable
2727
import com.skydoves.whatif.whatIfNotNull
2828
import com.skydoves.whatif.whatIfNotNullAs
2929
import java.io.Serializable
30+
import kotlin.contracts.InvocationKind
31+
import kotlin.contracts.contract
3032

3133
/**
3234
* An expression for invoking [whatIf] when the [Activity]'s intent extras is not null and not empty.
@@ -38,7 +40,9 @@ import java.io.Serializable
3840
public inline fun Activity.whatIfHasExtras(
3941
whatIf: (Bundle) -> Unit
4042
) {
41-
43+
contract {
44+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
45+
}
4246
this.whatIfHasExtras(
4347
whatIf = whatIf,
4448
whatIfNot = { }
@@ -58,7 +62,10 @@ public inline fun Activity.whatIfHasExtras(
5862
whatIf: (Bundle) -> Unit,
5963
whatIfNot: () -> Unit
6064
) {
61-
65+
contract {
66+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
67+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
68+
}
6269
this.intent.extras.whatIfNotNull(
6370
whatIf = {
6471
if (!it.isEmpty) {
@@ -81,7 +88,9 @@ public inline fun Activity.whatIfHasExtras(
8188
name: String,
8289
whatIf: () -> Unit
8390
) {
84-
91+
contract {
92+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
93+
}
8594
this.whatIfHasExtras(
8695
name = name,
8796
whatIf = whatIf,
@@ -104,7 +113,10 @@ public inline fun Activity.whatIfHasExtras(
104113
whatIf: () -> Unit,
105114
whatIfNot: () -> Unit
106115
) {
107-
116+
contract {
117+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
118+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
119+
}
108120
if (intent.hasExtra(name)) {
109121
whatIf()
110122
} else {
@@ -124,7 +136,9 @@ public inline fun Activity.whatIfHasStringExtra(
124136
name: String,
125137
whatIf: (String) -> Unit
126138
) {
127-
139+
contract {
140+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
141+
}
128142
this.intent.getStringExtra(name).whatIfNotNull(
129143
whatIf = whatIf,
130144
whatIfNot = { }
@@ -146,7 +160,10 @@ public inline fun Activity.whatIfHasStringExtra(
146160
whatIf: (String) -> Unit,
147161
whatIfNot: () -> Unit
148162
) {
149-
163+
contract {
164+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
165+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
166+
}
150167
this.intent.getStringExtra(name).whatIfNotNull(
151168
whatIf = whatIf,
152169
whatIfNot = whatIfNot
@@ -165,7 +182,9 @@ public inline fun Activity.whatIfHasCharSequenceExtra(
165182
name: String,
166183
whatIf: (CharSequence) -> Unit
167184
) {
168-
185+
contract {
186+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
187+
}
169188
this.intent.getCharSequenceExtra(name).whatIfNotNull(
170189
whatIf = whatIf,
171190
whatIfNot = { }
@@ -187,7 +206,10 @@ public inline fun Activity.whatIfHasCharSequenceExtra(
187206
whatIf: (CharSequence) -> Unit,
188207
whatIfNot: () -> Unit
189208
) {
190-
209+
contract {
210+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
211+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
212+
}
191213
this.intent.getCharSequenceExtra(name).whatIfNotNull(
192214
whatIf = whatIf,
193215
whatIfNot = whatIfNot
@@ -206,7 +228,9 @@ public inline fun <reified T : Serializable> Activity.whatIfHasSerializableExtra
206228
name: String,
207229
whatIf: (T) -> Unit
208230
) {
209-
231+
contract {
232+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
233+
}
210234
this.intent.getSerializableExtra(name).whatIfNotNullAs(
211235
whatIf = whatIf,
212236
whatIfNot = { }
@@ -228,7 +252,10 @@ public inline fun <reified T : Serializable> Activity.whatIfHasSerializableExtra
228252
whatIf: (T) -> Unit,
229253
whatIfNot: () -> Unit
230254
) {
231-
255+
contract {
256+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
257+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
258+
}
232259
this.intent.getSerializableExtra(name).whatIfNotNullAs(
233260
whatIf = whatIf,
234261
whatIfNot = whatIfNot
@@ -247,7 +274,9 @@ public inline fun <reified T : Parcelable> Activity.whatIfHasParcelableExtra(
247274
name: String,
248275
whatIf: (T) -> Unit
249276
) {
250-
277+
contract {
278+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
279+
}
251280
this.intent.getParcelableExtra<T>(name).whatIfNotNull(
252281
whatIf = whatIf,
253282
whatIfNot = { }
@@ -269,7 +298,10 @@ public inline fun <reified T : Parcelable> Activity.whatIfHasParcelableExtra(
269298
whatIf: (T) -> Unit,
270299
whatIfNot: () -> Unit
271300
) {
272-
301+
contract {
302+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
303+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
304+
}
273305
this.intent.getParcelableExtra<T>(name).whatIfNotNull(
274306
whatIf = whatIf,
275307
whatIfNot = whatIfNot
@@ -288,7 +320,9 @@ public inline fun <reified T : Parcelable> Activity.whatIfHasParcelableArrayList
288320
name: String,
289321
whatIf: (ArrayList<T>) -> Unit
290322
) {
291-
323+
contract {
324+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
325+
}
292326
this.intent.getParcelableArrayListExtra<T>(name).whatIfNotNull(
293327
whatIf = whatIf,
294328
whatIfNot = { }
@@ -310,7 +344,10 @@ public inline fun <reified T : Parcelable> Activity.whatIfHasParcelableArrayList
310344
whatIf: (ArrayList<T>) -> Unit,
311345
whatIfNot: () -> Unit
312346
) {
313-
347+
contract {
348+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
349+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
350+
}
314351
this.intent.getParcelableArrayListExtra<T>(name).whatIfNotNull(
315352
whatIf = whatIf,
316353
whatIfNot = whatIfNot
@@ -327,7 +364,9 @@ public inline fun <reified T : Parcelable> Activity.whatIfHasParcelableArrayList
327364
public inline fun Activity.whatIfHasDeepLinkUri(
328365
whatIf: (Uri) -> Unit
329366
) {
330-
367+
contract {
368+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
369+
}
331370
this.whatIfHasDeepLinkUri(whatIf, { })
332371
}
333372

@@ -344,6 +383,9 @@ public inline fun Activity.whatIfHasDeepLinkUri(
344383
whatIf: (Uri) -> Unit,
345384
whatIfNot: () -> Unit
346385
) {
347-
386+
contract {
387+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
388+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
389+
}
348390
this.intent.data.whatIfNotNull(whatIf, whatIfNot)
349391
}

whatif-android/src/main/java/com/skydoves/whatif_android/WhatIfFragment.kt

+26-7
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import androidx.fragment.app.Fragment
2727
import androidx.fragment.app.FragmentActivity
2828
import com.skydoves.whatif.whatIfNotNull
2929
import com.skydoves.whatif.whatIfNotNullAs
30+
import kotlin.contracts.InvocationKind
31+
import kotlin.contracts.contract
3032

3133
/**
3234
* @author skydoves (Jaewoong Eum)
@@ -40,7 +42,9 @@ import com.skydoves.whatif.whatIfNotNullAs
4042
public inline fun Fragment?.whatIfNotNullContext(
4143
whatIf: (Context) -> Unit
4244
) {
43-
45+
contract {
46+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
47+
}
4448
this?.context.whatIfNotNull {
4549
whatIf(it)
4650
}
@@ -80,7 +84,9 @@ public inline fun Fragment?.whatIfNotNullContext(
8084
public inline fun Fragment?.whatIfNotNullActivity(
8185
whatIf: (FragmentActivity) -> Unit
8286
) {
83-
87+
contract {
88+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
89+
}
8490
this?.activity.whatIfNotNull {
8591
whatIf(it)
8692
}
@@ -101,7 +107,10 @@ public inline fun Fragment?.whatIfNotNullActivity(
101107
whatIf: (FragmentActivity) -> Unit,
102108
whatIfNot: () -> Unit
103109
) {
104-
110+
contract {
111+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
112+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
113+
}
105114
this?.activity.whatIfNotNull(
106115
whatIf = whatIf,
107116
whatIfNot = whatIfNot
@@ -120,7 +129,9 @@ public inline fun Fragment?.whatIfNotNullActivity(
120129
public inline fun Fragment?.whatIfHasArguments(
121130
whatIf: (Bundle) -> Unit
122131
) {
123-
132+
contract {
133+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
134+
}
124135
whatIfHasArguments(whatIf) { }
125136
}
126137

@@ -138,7 +149,10 @@ public inline fun Fragment?.whatIfHasArguments(
138149
whatIf: (Bundle) -> Unit,
139150
whatIfNot: () -> Unit
140151
) {
141-
152+
contract {
153+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
154+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
155+
}
142156
this?.arguments.whatIfNotNull(whatIf, whatIfNot)
143157
}
144158

@@ -154,7 +168,9 @@ public inline fun Fragment?.whatIfHasArguments(
154168
public inline fun <reified T> Fragment?.whatIfFindParentInterface(
155169
whatIf: (T) -> Unit
156170
) {
157-
171+
contract {
172+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
173+
}
158174
whatIfFindParentInterface(whatIf) { }
159175
}
160176

@@ -172,6 +188,9 @@ public inline fun <reified T> Fragment?.whatIfFindParentInterface(
172188
whatIf: (T) -> Unit,
173189
whatIfNot: () -> Unit
174190
) {
175-
191+
contract {
192+
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
193+
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
194+
}
176195
this?.activity.whatIfNotNullAs(whatIf, whatIfNot)
177196
}

whatif-android/src/main/java/com/skydoves/whatif_android/WhatIfFragmentActivity.kt

+14
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import androidx.annotation.IdRes
2020
import androidx.fragment.app.Fragment
2121
import androidx.fragment.app.FragmentActivity
2222
import com.skydoves.whatif.whatIfNotNullAs
23+
import kotlin.contracts.InvocationKind
24+
import kotlin.contracts.contract
2325

2426
/**
2527
* @author skydoves (Jaewoong Eum)
@@ -35,6 +37,9 @@ public inline fun <reified T : Fragment> FragmentActivity.whatIfFindFragment(
3537
@IdRes id: Int,
3638
whatIf: (T) -> Unit
3739
) {
40+
contract {
41+
callsInPlace(whatIf, InvocationKind.EXACTLY_ONCE)
42+
}
3843
whatIfFindFragment(id, whatIf, {})
3944
}
4045

@@ -55,6 +60,9 @@ public inline fun <reified T : Fragment> FragmentActivity.whatIfFindFragment(
5560
whatIf: (T) -> Unit,
5661
whatIfNot: () -> Unit
5762
) {
63+
contract {
64+
callsInPlace(whatIf, InvocationKind.EXACTLY_ONCE)
65+
}
5866
supportFragmentManager.findFragmentById(id).whatIfNotNullAs(whatIf, whatIfNot)
5967
}
6068

@@ -72,6 +80,9 @@ public inline fun <reified T : Fragment> FragmentActivity.whatIfFindFragment(
7280
tag: String?,
7381
whatIf: (T) -> Unit
7482
) {
83+
contract {
84+
callsInPlace(whatIf, InvocationKind.EXACTLY_ONCE)
85+
}
7586
whatIfFindFragment(tag, whatIf, {})
7687
}
7788

@@ -92,5 +103,8 @@ public inline fun <reified T : Fragment> FragmentActivity.whatIfFindFragment(
92103
whatIf: (T) -> Unit,
93104
whatIfNot: () -> Unit
94105
) {
106+
contract {
107+
callsInPlace(whatIf, InvocationKind.EXACTLY_ONCE)
108+
}
95109
supportFragmentManager.findFragmentByTag(tag).whatIfNotNullAs(whatIf, whatIfNot)
96110
}

whatif/build.gradle

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
apply plugin: 'java-library'
21
apply plugin: 'kotlin'
32
apply plugin: 'org.jetbrains.dokka'
43
apply plugin: 'binary-compatibility-validator'
@@ -21,6 +20,13 @@ task coverageReport(type: JacocoReport, dependsOn: 'test') {
2120
}
2221
}
2322

23+
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
24+
kotlinOptions.freeCompilerArgs += [
25+
"-Xexplicit-api=strict",
26+
"-Xopt-in=kotlin.contracts.ExperimentalContracts"
27+
]
28+
}
29+
2430
dependencies {
2531
testImplementation "junit:junit:$versions.junit"
2632
}

0 commit comments

Comments
 (0)