Skip to content

Commit bd9252b

Browse files
authored
Kotlin 2.3.0 support (#49)
1 parent 0b93164 commit bd9252b

File tree

13 files changed

+75
-71
lines changed

13 files changed

+75
-71
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ buildscript {
3333
}
3434
3535
dependencies {
36-
classpath 'com.jeppeman.mockposable:mockposable-gradle:0.15'
36+
classpath 'com.jeppeman.mockposable:mockposable-gradle:0.16'
3737
}
3838
}
3939

gradle/libs.versions.toml

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,60 @@
11
[versions]
2-
kotlin = '2.2.20'
3-
compose-ui = '1.8.3'
4-
google-ksp = '2.2.20-2.0.3' # https://mvnrepository.com/artifact/com.google.devtools.ksp/com.google.devtools.ksp.gradle.plugin?repo=central
5-
activity = '1.10.1'
6-
agp = '8.9.3'
7-
espresso = '3.6.1'
8-
mockk = '1.13.12'
9-
mockito = '4.8.1'
2+
kotlin = '2.3.0'
3+
compose-ui = '1.10.0'
4+
google-ksp = '2.3.3' # https://mvnrepository.com/artifact/com.google.devtools.ksp/com.google.devtools.ksp.gradle.plugin?repo=central
5+
activity = '1.12.1'
6+
agp = '8.11.2'
7+
espresso = '3.7.0'
8+
mockk = '1.14.7'
109

1110
[libraries]
1211
kotlin-gradle = { module = 'org.jetbrains.kotlin:kotlin-gradle-plugin', version.ref = 'kotlin' }
1312
kotlin-compiler = { module = 'org.jetbrains.kotlin:kotlin-compiler-embeddable', version.ref = 'kotlin' }
1413

1514
androidx-activity = { module = 'androidx.activity:activity', version.ref = 'activity' }
16-
androidx-appcompat = { module = 'androidx.appcompat:appcompat', version = '1.7.0' }
15+
androidx-appcompat = { module = 'androidx.appcompat:appcompat', version = '1.7.1' }
1716
androidx-activity-compose = { module = 'androidx.activity:activity-compose', version.ref = 'activity' }
18-
androidx-lifecycle-viewmodel-compose = { module = 'androidx.lifecycle:lifecycle-viewmodel-compose', version = '2.8.7' }
19-
androidx-test-runner = { module = 'androidx.test:runner', version = '1.6.2'}
17+
androidx-lifecycle-viewmodel-compose = { module = 'androidx.lifecycle:lifecycle-viewmodel-compose', version = '2.10.0' }
18+
androidx-test-runner = { module = 'androidx.test:runner', version = '1.7.0' }
2019
androidx-test-espresso-core = { module = 'androidx.test.espresso:espresso-core', version.ref = 'espresso' }
2120
androidx-test-annotation = { module = 'androidx.test:annotation', version = '1.0.1' }
22-
androidx-fragment-testing = { module = 'androidx.fragment:fragment-testing', version = '1.8.6' }
21+
androidx-fragment-testing = { module = 'androidx.fragment:fragment-testing', version = '1.8.9' }
2322

2423
compose-compiler = { module = 'org.jetbrains.kotlin:kotlin-compose-compiler-plugin-embeddable', version.ref = 'kotlin' }
2524
compose-compiler-gradle = { module = 'org.jetbrains.kotlin.plugin.compose:org.jetbrains.kotlin.plugin.compose.gradle.plugin', version.ref = 'kotlin' }
26-
compose-runtime = { module = 'org.jetbrains.compose.runtime:runtime', version = '1.6.11' }
25+
compose-runtime = { module = 'org.jetbrains.compose.runtime:runtime', version = '1.9.3' }
2726
compose-ui = { module = 'androidx.compose.ui:ui', version.ref = 'compose-ui' }
28-
compose-material = { module = 'androidx.compose.material:material', version = '1.7.8' }
29-
compose-foundation = { module = 'androidx.compose.foundation:foundation', version = '1.7.8' }
27+
compose-material = { module = 'androidx.compose.material:material', version = '1.10.0' }
28+
compose-foundation = { module = 'androidx.compose.foundation:foundation', version = '1.10.0' }
3029
compose-ui-test-junit4 = { module = 'androidx.compose.ui:ui-test-junit4', version.ref = 'compose-ui' }
3130
compose-ui-test-manifest = { module = 'androidx.compose.ui:ui-test-manifest', version.ref = 'compose-ui' }
3231

3332
android-gradle = { module = 'com.android.tools.build:gradle', version.ref = 'agp' }
3433

35-
autoservice-ksp = { module = 'dev.zacsweers.autoservice:auto-service-ksp', version = '1.0.0' }
34+
autoservice-ksp = { module = 'dev.zacsweers.autoservice:auto-service-ksp', version = '1.2.0' }
3635
autoservice-annotations = { module = 'com.google.auto.service:auto-service-annotations', version = '1.1.1' }
3736

3837
google-ksp = { module = 'com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin', version.ref = 'google-ksp' }
3938

4039
# compile-testing = { module = 'com.github.tschuchortdev:kotlin-compile-testing', version = '1.5.0' }
41-
compile-testing = { module = 'dev.zacsweers.kctfork:core', version = '0.7.1' }
40+
compile-testing = { module = 'dev.zacsweers.kctfork:core', version = '0.12.0' }
4241

4342
junit = { module = 'androidx.test.ext:junit', version = '1.1.3' }
4443

45-
robolectric = { module = 'org.robolectric:robolectric', version = '4.13' }
44+
robolectric = { module = 'org.robolectric:robolectric', version = '4.16' }
4645

47-
molecule = { module = 'app.cash.molecule:molecule-runtime', version = '2.0.0' }
46+
molecule = { module = 'app.cash.molecule:molecule-runtime', version = '2.2.0' }
4847

4948
hamcrest = { module = 'org.hamcrest:hamcrest', version = '2.2' }
5049

5150
mockk-core = { module = 'io.mockk:mockk', version.ref = 'mockk' }
5251
mockk-android = { module = 'io.mockk:mockk-android', version.ref = 'mockk' }
5352

54-
mockito-kotlin = { module = 'org.mockito.kotlin:mockito-kotlin', version = '5.4.0' }
55-
mockito-inline = { module = 'org.mockito:mockito-inline', version.ref = 'mockito' }
56-
mockito-android = { module = 'org.mockito:mockito-android', version.ref = 'mockito' }
53+
mockito-kotlin = { module = 'org.mockito.kotlin:mockito-kotlin', version = '6.1.0' }
54+
mockito-inline = { module = 'org.mockito:mockito-inline', version = '5.2.0' }
55+
mockito-android = { module = 'org.mockito:mockito-android', version = '5.21.0' }
5756

58-
paparazzi = { module = 'app.cash.paparazzi:paparazzi-gradle-plugin', version = '1.3.5' }
57+
paparazzi = { module = 'app.cash.paparazzi:paparazzi-gradle-plugin', version = '2.0.0-alpha02' }
5958

6059
[plugins]
6160
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#Tue Oct 18 11:21:10 CEST 2022
22
distributionBase=GRADLE_USER_HOME
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
44
distributionPath=wrapper/dists
55
zipStorePath=wrapper/dists
66
zipStoreBase=GRADLE_USER_HOME

integration-tests/android/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ mockposable {
1515
}
1616

1717
android {
18-
compileSdk = 35
18+
compileSdk = 36
1919
namespace = "com.jeppeman.mockposable.integrationtests.android"
2020

2121
defaultConfig {
2222
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
23-
minSdk = 21
23+
minSdk = 23
2424
val taskNames = project.gradle
2525
.startParameter
2626
.taskNames

integration-tests/android/src/test/kotlin/com/jeppeman/mockposable/integrationtests/android/SnapshotTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class SnapshotTest {
3333
deviceConfig = DeviceConfig.PIXEL_5,
3434
theme = "Theme.Material",
3535
environment = detectEnvironment().copy(
36-
compileSdkVersion = 35
36+
compileSdkVersion = 36
3737
)
3838
)
3939

mockposable/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
VERSION_NAME=0.16-SNAPSHOT
1+
VERSION_NAME=0.17-SNAPSHOT
22
GROUP=com.jeppeman.mockposable
33

44
POM_DESCRIPTION=A tool that enables stubbing and verification of @Composable-annotated functions

mockposable/mockposable-compiler/src/main/java/com/jeppeman/mockposable/compiler/MockKIrGenerationExtension.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ package com.jeppeman.mockposable.compiler
44

55
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
66
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
7-
import org.jetbrains.kotlin.backend.common.IrValidatorConfig
87
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
98
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
10-
import org.jetbrains.kotlin.backend.common.validateIr
119
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
1210
import org.jetbrains.kotlin.cli.common.messages.toLogger
1311
import org.jetbrains.kotlin.config.IrVerificationMode
@@ -26,6 +24,8 @@ import org.jetbrains.kotlin.ir.util.dump
2624
import org.jetbrains.kotlin.ir.util.dumpKotlinLike
2725
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
2826
import org.jetbrains.kotlin.ir.util.getSimpleFunction
27+
import org.jetbrains.kotlin.ir.validation.IrValidatorConfig
28+
import org.jetbrains.kotlin.ir.validation.validateIr
2929
import org.jetbrains.kotlin.name.FqName
3030
import org.jetbrains.kotlin.util.Logger
3131

@@ -53,14 +53,14 @@ class MockKIrGenerationExtension(
5353
transformers.forEach { transformer -> moduleFragment.transform(transformer, null) }
5454
val afterTransform = moduleFragment.dump()
5555
if (beforeTransform != afterTransform) {
56-
validateIr(messageCollector, IrVerificationMode.ERROR) {
57-
performBasicIrValidation(
58-
moduleFragment,
59-
pluginContext.irBuiltIns,
60-
"MockK transformation",
61-
IrValidatorConfig(),
62-
)
63-
}
56+
validateIr(
57+
element = moduleFragment,
58+
irBuiltIns = pluginContext.irBuiltIns,
59+
validatorConfig = IrValidatorConfig(),
60+
messageCollector = messageCollector,
61+
mode = IrVerificationMode.ERROR,
62+
phaseName = "MockK transformation",
63+
)
6464
}
6565
}
6666
}

mockposable/mockposable-compiler/src/main/java/com/jeppeman/mockposable/compiler/MockitoIrGenerationExtension.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ package com.jeppeman.mockposable.compiler
44

55
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
66
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
7-
import org.jetbrains.kotlin.backend.common.IrValidatorConfig
87
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
98
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
10-
import org.jetbrains.kotlin.backend.common.validateIr
119
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
1210
import org.jetbrains.kotlin.cli.common.messages.toLogger
1311
import org.jetbrains.kotlin.config.IrVerificationMode
@@ -17,7 +15,10 @@ import org.jetbrains.kotlin.ir.expressions.IrCall
1715
import org.jetbrains.kotlin.ir.expressions.IrExpression
1816
import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
1917
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
18+
import org.jetbrains.kotlin.ir.util.dump
2019
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
20+
import org.jetbrains.kotlin.ir.validation.IrValidatorConfig
21+
import org.jetbrains.kotlin.ir.validation.validateIr
2122
import org.jetbrains.kotlin.name.FqName
2223
import org.jetbrains.kotlin.util.Logger
2324

@@ -41,13 +42,17 @@ class MockitoIrGenerationExtension(
4142
OnComposableElementTransformer(logger, pluginContext),
4243
MockitoVerifyComposableElementTransformer(logger, pluginContext)
4344
)
45+
val beforeTransform = moduleFragment.dump()
4446
transformers.forEach { transformer -> moduleFragment.transform(transformer, null) }
45-
validateIr(messageCollector, IrVerificationMode.ERROR) {
46-
performBasicIrValidation(
47-
moduleFragment,
48-
pluginContext.irBuiltIns,
49-
"Mockito transformation",
50-
IrValidatorConfig(),
47+
val afterTransform = moduleFragment.dump()
48+
if (beforeTransform != afterTransform) {
49+
validateIr(
50+
element = moduleFragment,
51+
irBuiltIns = pluginContext.irBuiltIns,
52+
validatorConfig = IrValidatorConfig(),
53+
messageCollector = messageCollector,
54+
mode = IrVerificationMode.ERROR,
55+
phaseName = "Mockito transformation",
5156
)
5257
}
5358
}

mockposable/mockposable-compiler/src/main/java/com/jeppeman/mockposable/compiler/MockposableCommandLineProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
99
import org.jetbrains.kotlin.config.CompilerConfigurationKey
1010

1111
private const val ARG_NAME_MOCK_PLUGINS = "plugins"
12+
const val MOCKPOSABLE_PLUGIN_ID = "com.jeppeman.mockposable"
1213

1314
val KEY_MOCK_PLUGINS = CompilerConfigurationKey<String>(ARG_NAME_MOCK_PLUGINS)
1415

1516
@OptIn(ExperimentalCompilerApi::class)
1617
@Suppress("unused") // Invoked by the compiler
1718
@AutoService(CommandLineProcessor::class)
1819
class MockposableCommandLineProcessor : CommandLineProcessor {
19-
override val pluginId: String = "com.jeppeman.mockposable"
20+
override val pluginId: String = MOCKPOSABLE_PLUGIN_ID
2021

2122
override val pluginOptions: Collection<AbstractCliOption> = listOf(
2223
CliOption(ARG_NAME_MOCK_PLUGINS, "String", "", required = true)

mockposable/mockposable-compiler/src/main/java/com/jeppeman/mockposable/compiler/MockposablePlugin.kt

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,19 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
66
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
77
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation
88
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
9-
import org.jetbrains.kotlin.cli.common.messages.toLogger
10-
import org.jetbrains.kotlin.com.intellij.mock.MockProject
11-
import org.jetbrains.kotlin.com.intellij.openapi.extensions.LoadingOrder
12-
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
9+
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
1310
import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
1411
import org.jetbrains.kotlin.config.CompilerConfiguration
1512

1613
@OptIn(ExperimentalCompilerApi::class)
1714
@Suppress("unused") // Invoked by kotlinc
18-
@AutoService(ComponentRegistrar::class)
19-
class MockposablePlugin : ComponentRegistrar {
15+
@AutoService(CompilerPluginRegistrar::class)
16+
class MockposablePlugin : CompilerPluginRegistrar() {
17+
override val pluginId: String = MOCKPOSABLE_PLUGIN_ID
2018
override val supportsK2: Boolean
2119
get() = true
2220

23-
override fun registerProjectComponents(
24-
project: MockProject,
25-
configuration: CompilerConfiguration
26-
) {
21+
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
2722
val plugins = configuration.get(KEY_MOCK_PLUGINS, "").split(";")
2823
val messageCollector = MockposableMessageCollector(
2924
configuration.get(
@@ -36,7 +31,7 @@ class MockposablePlugin : ComponentRegistrar {
3631
// No extra transformations needed for compose-ui
3732
if (extension == "compose-ui") continue
3833

39-
project.registerIrLast(
34+
IrGenerationExtension.registerExtension(
4035
when (extension) {
4136
"mockito" -> MockitoIrGenerationExtension(messageCollector)
4237
"mockk" -> MockKIrGenerationExtension(messageCollector)
@@ -47,11 +42,6 @@ class MockposablePlugin : ComponentRegistrar {
4742
}
4843
}
4944

50-
private fun MockProject.registerIrLast(extension: IrGenerationExtension) {
51-
extensionArea.getExtensionPoint(IrGenerationExtension.extensionPointName)
52-
.registerExtension(extension, LoadingOrder.LAST, this)
53-
}
54-
5545
private class MockposableMessageCollector(
5646
private val proxy: MessageCollector
5747
) : MessageCollector by proxy {

0 commit comments

Comments
 (0)