Skip to content

Commit fc7dace

Browse files
committed
Extract BaseMokkeryGradlePlugin.kt
1 parent 82b6140 commit fc7dace

3 files changed

Lines changed: 137 additions & 64 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package dev.mokkery.gradle
2+
3+
import dev.mokkery.annotations.InternalMokkeryApi
4+
import dev.mokkery.internal.options.MokkeryOptionProjection
5+
import dev.mokkery.internal.options.MokkeryOptionsContainer
6+
import org.gradle.api.Project
7+
import org.gradle.api.provider.Provider
8+
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
9+
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin
10+
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
11+
12+
@InternalMokkeryApi
13+
public abstract class BaseMokkeryGradlePlugin: KotlinCompilerPluginSupportPlugin {
14+
15+
public abstract val options: MokkeryOptionsContainer
16+
17+
public abstract fun optionProjection(project: Project): MokkeryOptionProjection<MokkeryGradleProperty<Any>>
18+
19+
public abstract fun rule(project: Project): ApplicationRule
20+
21+
public fun applyOptionConventions(project: Project) {
22+
val projection = optionProjection(project)
23+
options.forEach {
24+
projection.project(it).convention(it.defaultValues)
25+
}
26+
}
27+
28+
override fun applyToCompilation(kotlinCompilation: KotlinCompilation<*>): Provider<List<SubpluginOption>> {
29+
val project = kotlinCompilation.target.project
30+
val projection = optionProjection(project)
31+
return project.provider {
32+
options.flatMap { option ->
33+
val values = projection.project(option).get()
34+
values.map {
35+
SubpluginOption(option.name, option.type.serializer.serialize(it))
36+
}
37+
}
38+
}
39+
}
40+
41+
override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean {
42+
val project = kotlinCompilation.target.project
43+
val sourceSet = runCatching { kotlinCompilation.defaultSourceSet }
44+
.getOrNull()
45+
?: return run {
46+
val unsupportedCompilationWarning = project
47+
.findProperty("dev.mokkery.unsupportedCompilationWarnings")
48+
.toString()
49+
.toBooleanStrictOrNull()
50+
?: true
51+
if (unsupportedCompilationWarning) {
52+
val log = "w: Compilation {} might not support compiler plugins (e.g. known issue with Android test fixtures compilations)!" +
53+
" Mokkery might not work correctly in associated source set!" +
54+
" To hide this message, add 'dev.mokkery.unsupportedCompilationWarnings=false' to the Gradle properties."
55+
project.logger.warn(log, kotlinCompilation.name)
56+
}
57+
false
58+
}
59+
return rule(project).isApplicable(sourceSet)
60+
}
61+
}

mokkery-gradle/src/main/kotlin/dev/mokkery/gradle/MokkeryGradlePlugin.kt

Lines changed: 25 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,10 @@ import dev.mokkery.internal.MokkeryConfig.RUNTIME_DEPENDENCY
77
import dev.mokkery.internal.MokkeryConfig.VERSION
88
import dev.mokkery.internal.options.MokkeryOptionProjection
99
import dev.mokkery.internal.options.MokkeryOptions
10-
import dev.mokkery.internal.options.get
10+
import dev.mokkery.internal.options.MokkeryOptionsContainer
1111
import org.gradle.api.Project
12-
import org.gradle.api.provider.Property
13-
import org.gradle.api.provider.Provider
1412
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
15-
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
16-
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin
1713
import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact
18-
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
1914
import org.jetbrains.kotlin.gradle.plugin.kotlinToolingVersion
2015
import org.jetbrains.kotlin.tooling.core.KotlinToolingVersion
2116
import org.jetbrains.kotlin.tooling.core.toKotlinVersion
@@ -25,34 +20,41 @@ import org.jetbrains.kotlin.tooling.core.toKotlinVersion
2520
* * Adding runtime dependency
2621
* * Adding configured compiler plugin
2722
*/
28-
public class MokkeryGradlePlugin : KotlinCompilerPluginSupportPlugin {
23+
public class MokkeryGradlePlugin : BaseMokkeryGradlePlugin() {
24+
25+
override val options: MokkeryOptionsContainer = MokkeryOptions
26+
27+
override fun rule(project: Project): ApplicationRule = project.mokkery.rule.get()
28+
29+
override fun optionProjection(project: Project): MokkeryOptionProjection<MokkeryGradleProperty<Any>> {
30+
val extension = project.mokkery
31+
return MokkeryOptionProjection { option ->
32+
val property = when (option) {
33+
MokkeryOptions.Core.defaultMockMode -> extension.defaultMockMode
34+
MokkeryOptions.Core.defaultVerifyMode -> extension.defaultVerifyMode
35+
MokkeryOptions.Core.ignoreFinalMembers -> extension.ignoreFinalMembers
36+
MokkeryOptions.Core.ignoreInlineMembers -> extension.ignoreInlineMembers
37+
MokkeryOptions.Core.enableFirDiagnostics -> extension.enableFirDiagnostics
38+
MokkeryOptions.Stubs.allowClassInheritance -> extension.stubs.allowClassInheritance
39+
MokkeryOptions.Stubs.allowConcreteClassInstantiation -> extension.stubs.allowConcreteClassInstantiation
40+
MokkeryOptions.Annotations.copyToMock -> extension.annotations.copyToMock
41+
else -> error("Missing mapping for option $option")
42+
}
43+
MokkeryGradleProperty.fromAsAny(property)
44+
}
45+
}
2946

3047
override fun apply(target: Project) {
3148
target.checkKotlinSetup()
3249
val mokkery = target
3350
.extensions
3451
.create("mokkery", MokkeryGradleExtension::class.java)
3552
mokkery.rule.convention(ApplicationRule.AllTests)
36-
val gradleProperty = gradlePropertyProjection(target)
37-
MokkeryOptions.forEach {
38-
it.get(gradleProperty)?.convention(it.defaultValues.singleOrNull())
39-
}
53+
applyOptionConventions(target)
4054
target.configureDependencies()
4155
super.apply(target)
4256
}
4357

44-
override fun applyToCompilation(
45-
kotlinCompilation: KotlinCompilation<*>
46-
): Provider<List<SubpluginOption>> = kotlinCompilation.run {
47-
target.project.provider {
48-
val gradleProperty = gradlePropertyProjection(project)
49-
MokkeryOptions.mapNotNull {
50-
val value = it.get(gradleProperty)?.get() ?: return@mapNotNull null
51-
SubpluginOption(it.name, it.type.serializer.serialize(value))
52-
}
53-
}
54-
}
55-
5658
override fun getCompilerPluginId(): String = MokkeryConfig.PLUGIN_ID
5759

5860
override fun getPluginArtifact(): SubpluginArtifact {
@@ -63,27 +65,6 @@ public class MokkeryGradlePlugin : KotlinCompilerPluginSupportPlugin {
6365
)
6466
}
6567

66-
override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean {
67-
val project = kotlinCompilation.target.project
68-
val sourceSet = runCatching { kotlinCompilation.defaultSourceSet }
69-
.getOrNull()
70-
?: return run {
71-
val unsupportedCompilationWarning = project
72-
.findProperty("dev.mokkery.unsupportedCompilationWarnings")
73-
.toString()
74-
.toBooleanStrictOrNull()
75-
?: true
76-
if (unsupportedCompilationWarning) {
77-
val log = "w: Compilation {} might not support compiler plugins (e.g. known issue with Android test fixtures compilations)!" +
78-
" Mokkery might not work correctly in associated source set!" +
79-
" To hide this message, add 'dev.mokkery.unsupportedCompilationWarnings=false' to the Gradle properties."
80-
project.logger.warn(log, kotlinCompilation.name)
81-
}
82-
false
83-
}
84-
return project.mokkery.rule.get().isApplicable(sourceSet)
85-
}
86-
8768
private fun Project.checkKotlinSetup() {
8869
if (extensions.findByName("kotlin") == null) {
8970
error("Kotlin plugin not applied! Mokkery requires kotlin plugin!")
@@ -130,24 +111,4 @@ public class MokkeryGradlePlugin : KotlinCompilerPluginSupportPlugin {
130111
private fun KotlinVersion(string: String): KotlinVersion = KotlinToolingVersion(string).toKotlinVersion()
131112
}
132113

133-
@Suppress("UNCHECKED_CAST")
134-
private fun gradlePropertyProjection(
135-
project: Project
136-
) : MokkeryOptionProjection<Property<Any>?> {
137-
val extension = project.mokkery
138-
return MokkeryOptionProjection {
139-
when (it) {
140-
MokkeryOptions.Core.defaultMockMode -> extension.defaultMockMode
141-
MokkeryOptions.Core.defaultVerifyMode -> extension.defaultVerifyMode
142-
MokkeryOptions.Core.ignoreFinalMembers -> extension.ignoreFinalMembers
143-
MokkeryOptions.Core.ignoreInlineMembers -> extension.ignoreInlineMembers
144-
MokkeryOptions.Core.enableFirDiagnostics -> extension.enableFirDiagnostics
145-
MokkeryOptions.Stubs.allowClassInheritance -> extension.stubs.allowClassInheritance
146-
MokkeryOptions.Stubs.allowConcreteClassInstantiation -> extension.stubs.allowConcreteClassInstantiation
147-
MokkeryOptions.Annotations.copyToMock -> extension.annotations.copyToMock
148-
else -> null
149-
} as? Property<Any>
150-
}
151-
}
152-
153114
private val Project.mokkery get() = extensions.getByType(MokkeryGradleExtension::class.java)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package dev.mokkery.gradle
2+
3+
import dev.mokkery.annotations.InternalMokkeryApi
4+
import org.gradle.api.provider.ListProperty
5+
import org.gradle.api.provider.Property
6+
7+
@InternalMokkeryApi
8+
public interface MokkeryGradleProperty<T> {
9+
10+
public fun get(): List<T>
11+
12+
public fun convention(values: List<T>)
13+
14+
public companion object {
15+
16+
public fun <T : Any> from(
17+
property: Property<T>
18+
): MokkeryGradleProperty<T> = object : MokkeryGradleProperty<T> {
19+
20+
override fun get(): List<T> = listOfNotNull(property.orNull)
21+
22+
override fun convention(values: List<T>) {
23+
values.singleOrNull()?.let {
24+
property.convention(it)
25+
}
26+
}
27+
}
28+
29+
@Suppress("UNCHECKED_CAST")
30+
public fun <T : Any> fromAsAny(
31+
property: Property<T>
32+
): MokkeryGradleProperty<Any> = from(property) as MokkeryGradleProperty<Any>
33+
34+
public fun <T : Any> from(
35+
property: ListProperty<T>
36+
): MokkeryGradleProperty<T> = object : MokkeryGradleProperty<T> {
37+
38+
override fun get(): List<T> = property.orNull.orEmpty()
39+
40+
override fun convention(values: List<T>) {
41+
if (values.isEmpty()) return
42+
property.convention(values)
43+
}
44+
}
45+
46+
@Suppress("UNCHECKED_CAST")
47+
public fun <T : Any> fromAsAny(
48+
property: ListProperty<T>
49+
): MokkeryGradleProperty<Any> = from(property) as MokkeryGradleProperty<Any>
50+
}
51+
}

0 commit comments

Comments
 (0)