Skip to content

Commit 2ba2340

Browse files
committed
refactor: gradle options?
1 parent f406e64 commit 2ba2340

File tree

6 files changed

+295
-163
lines changed

6 files changed

+295
-163
lines changed
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
package love.forte.plugin.suspendtrans
2+
3+
import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption
4+
import kotlin.reflect.KMutableProperty
5+
6+
private typealias ExcludeAnnotation = SuspendTransformConfiguration.ExcludeAnnotation
7+
8+
private const val REPEAT_MARK = "\$&+"
9+
10+
private fun includeAnnotationEncode(value: List<SuspendTransformConfiguration.IncludeAnnotation>): String {
11+
return value.joinToString(",") { if (it.repeatable) "${it.name}$REPEAT_MARK" else it.name }
12+
}
13+
14+
private fun includeAnnotationDecode(value: String): List<SuspendTransformConfiguration.IncludeAnnotation> {
15+
return value.split(",").map {
16+
val annotationName = it.substringBeforeLast(REPEAT_MARK)
17+
val repeat = annotationName == it
18+
SuspendTransformConfiguration.IncludeAnnotation(annotationName, repeat)
19+
}
20+
}
21+
22+
object CliOptions {
23+
24+
const val CONFIGURATION = "configuration"
25+
val ENABLED = option("enabled") {
26+
inc { enabled = it.toBoolean() }
27+
out { enabled.toString() }
28+
}
29+
30+
object Jvm {
31+
32+
val ORIGIN_FUNCTION_INCLUDE_ANNOTATIONS = option("jvm.originFunctionIncludeAnnotations") {
33+
inc { jvm.originFunctionIncludeAnnotations = includeAnnotationDecode(it) }
34+
out { includeAnnotationEncode(jvm.originFunctionIncludeAnnotations) }
35+
}
36+
37+
38+
//region blocking
39+
val JVM_BLOCKING_FUNCTION_NAME = option("jvm.jvmBlockingFunctionName") {
40+
withProp { jvm::jvmBlockingFunctionName }
41+
}
42+
43+
//region blocking mark
44+
const val JVM_BLOCKING_MARK_ANNOTATION = "jvm.jvmBlockingMarkAnnotation"
45+
46+
val JVM_BLOCKING_MARK_ANNOTATION_ANNOTATION_NAME =
47+
JVM_BLOCKING_MARK_ANNOTATION.option("annotationName") {
48+
withProp { jvm.jvmBlockingMarkAnnotation::annotationName }
49+
}
50+
val JVM_BLOCKING_MARK_ANNOTATION_BASE_NAME_PROPERTY =
51+
JVM_BLOCKING_MARK_ANNOTATION.option("baseNameProperty") {
52+
withProp { jvm.jvmBlockingMarkAnnotation::baseNameProperty }
53+
}
54+
val JVM_BLOCKING_MARK_ANNOTATION_SUFFIX_PROPERTY =
55+
JVM_BLOCKING_MARK_ANNOTATION.option("suffixProperty") {
56+
withProp { jvm.jvmBlockingMarkAnnotation::suffixProperty }
57+
}
58+
val JVM_BLOCKING_MARK_ANNOTATION_AS_PROPERTY_PROPERTY =
59+
JVM_BLOCKING_MARK_ANNOTATION.option("asPropertyProperty") {
60+
withProp { jvm.jvmBlockingMarkAnnotation::asPropertyProperty }
61+
}
62+
//endregion
63+
64+
val COPY_ANNOTATIONS_TO_SYNTHETIC_BLOCKING_FUNCTION =
65+
option("jvm.copyAnnotationsToSyntheticBlockingFunction") {
66+
inc { jvm.copyAnnotationsToSyntheticBlockingFunction = it.toBoolean() }
67+
out { jvm.copyAnnotationsToSyntheticBlockingFunction.toString() }
68+
}
69+
const val COPY_ANNOTATIONS_TO_SYNTHETIC_BLOCKING_FUNCTION_EXCLUDES =
70+
"jvm.copyAnnotationsToSyntheticBlockingFunctionExcludes"
71+
72+
val COPY_ANNOTATIONS_TO_SYNTHETIC_BLOCKING_FUNCTION_EXCLUDES_NAME =
73+
COPY_ANNOTATIONS_TO_SYNTHETIC_BLOCKING_FUNCTION_EXCLUDES.option("name") {
74+
inc { jvm.copyAnnotationsToSyntheticBlockingFunctionExcludes = it.split(",").map(::ExcludeAnnotation) }
75+
out { jvm.copyAnnotationsToSyntheticBlockingFunctionExcludes.joinToString(",") { it.name } }
76+
77+
}
78+
79+
val SYNTHETIC_BLOCKING_FUNCTION_INCLUDE_ANNOTATIONS =
80+
option("jvm.syntheticBlockingFunctionIncludeAnnotations") {
81+
inc { jvm.syntheticBlockingFunctionIncludeAnnotations = includeAnnotationDecode(it) }
82+
out { includeAnnotationEncode(jvm.syntheticBlockingFunctionIncludeAnnotations) }
83+
}
84+
85+
//endregion
86+
87+
88+
//region async
89+
val JVM_ASYNC_FUNCTION_NAME = option("jvm.jvmAsyncFunctionName") {
90+
withProp { jvm::jvmAsyncFunctionName }
91+
}
92+
93+
//region async mark
94+
const val JVM_ASYNC_MARK_ANNOTATION = "jvm.jvmAsyncMarkAnnotation"
95+
96+
val JVM_ASYNC_MARK_ANNOTATION_ANNOTATION_NAME =
97+
JVM_ASYNC_MARK_ANNOTATION.option("annotationName") {
98+
withProp { jvm.jvmAsyncMarkAnnotation::annotationName }
99+
}
100+
val JVM_ASYNC_MARK_ANNOTATION_BASE_NAME_PROPERTY =
101+
JVM_ASYNC_MARK_ANNOTATION.option("baseNameProperty") {
102+
withProp { jvm.jvmAsyncMarkAnnotation::baseNameProperty }
103+
}
104+
val JVM_ASYNC_MARK_ANNOTATION_SUFFIX_PROPERTY =
105+
JVM_ASYNC_MARK_ANNOTATION.option("suffixProperty") {
106+
withProp { jvm.jvmAsyncMarkAnnotation::suffixProperty }
107+
}
108+
val JVM_ASYNC_MARK_ANNOTATION_AS_PROPERTY_PROPERTY =
109+
JVM_ASYNC_MARK_ANNOTATION.option("asPropertyProperty") {
110+
withProp { jvm.jvmAsyncMarkAnnotation::asPropertyProperty }
111+
}
112+
//endregion
113+
114+
115+
val SYNTHETIC_ASYNC_FUNCTION_INCLUDE_ANNOTATIONS = option("jvm.syntheticAsyncFunctionIncludeAnnotations") {
116+
inc { jvm.syntheticAsyncFunctionIncludeAnnotations = includeAnnotationDecode(it) }
117+
out { includeAnnotationEncode(jvm.syntheticAsyncFunctionIncludeAnnotations) }
118+
}
119+
120+
val COPY_ANNOTATIONS_TO_SYNTHETIC_ASYNC_FUNCTION =
121+
option("jvm.copyAnnotationsToSyntheticAsyncFunction") {
122+
inc { jvm.copyAnnotationsToSyntheticAsyncFunction = it.toBoolean() }
123+
out { jvm.copyAnnotationsToSyntheticAsyncFunction.toString() }
124+
}
125+
const val COPY_ANNOTATIONS_TO_SYNTHETIC_ASYNC_FUNCTION_EXCLUDES =
126+
"jvm.copyAnnotationsToSyntheticAsyncFunctionExcludes"
127+
128+
val COPY_ANNOTATIONS_TO_SYNTHETIC_ASYNC_FUNCTION_EXCLUDES_NAME =
129+
COPY_ANNOTATIONS_TO_SYNTHETIC_ASYNC_FUNCTION_EXCLUDES.option("name") {
130+
inc { jvm.copyAnnotationsToSyntheticAsyncFunctionExcludes = it.split(",").map(::ExcludeAnnotation) }
131+
out { jvm.copyAnnotationsToSyntheticAsyncFunctionExcludes.joinToString(",") { it.name } }
132+
}
133+
134+
//endregion
135+
136+
137+
}
138+
139+
object Js
140+
141+
142+
val allOptions: List<ICliOption> = listOf(
143+
ENABLED,
144+
Jvm.ORIGIN_FUNCTION_INCLUDE_ANNOTATIONS,
145+
Jvm.JVM_BLOCKING_FUNCTION_NAME,
146+
Jvm.JVM_BLOCKING_MARK_ANNOTATION_ANNOTATION_NAME,
147+
Jvm.JVM_BLOCKING_MARK_ANNOTATION_BASE_NAME_PROPERTY,
148+
Jvm.JVM_BLOCKING_MARK_ANNOTATION_SUFFIX_PROPERTY,
149+
Jvm.JVM_BLOCKING_MARK_ANNOTATION_AS_PROPERTY_PROPERTY,
150+
Jvm.COPY_ANNOTATIONS_TO_SYNTHETIC_BLOCKING_FUNCTION,
151+
Jvm.COPY_ANNOTATIONS_TO_SYNTHETIC_BLOCKING_FUNCTION_EXCLUDES_NAME,
152+
Jvm.SYNTHETIC_BLOCKING_FUNCTION_INCLUDE_ANNOTATIONS,
153+
Jvm.JVM_ASYNC_FUNCTION_NAME,
154+
Jvm.JVM_ASYNC_MARK_ANNOTATION_ANNOTATION_NAME,
155+
Jvm.JVM_ASYNC_MARK_ANNOTATION_BASE_NAME_PROPERTY,
156+
Jvm.JVM_ASYNC_MARK_ANNOTATION_SUFFIX_PROPERTY,
157+
Jvm.JVM_ASYNC_MARK_ANNOTATION_AS_PROPERTY_PROPERTY,
158+
Jvm.SYNTHETIC_ASYNC_FUNCTION_INCLUDE_ANNOTATIONS,
159+
Jvm.COPY_ANNOTATIONS_TO_SYNTHETIC_ASYNC_FUNCTION,
160+
Jvm.COPY_ANNOTATIONS_TO_SYNTHETIC_ASYNC_FUNCTION_EXCLUDES_NAME,
161+
)
162+
val allOptionsMap = allOptions.associateBy { it.oName }
163+
164+
}
165+
166+
private class ResolveBuilder {
167+
var outc: SuspendTransformConfiguration.() -> String = { error("no outc") }
168+
var inc: SuspendTransformConfiguration.(String) -> Unit = { error("no inc") }
169+
170+
fun inc(block: SuspendTransformConfiguration.(String) -> Unit) {
171+
inc = block
172+
}
173+
174+
fun out(block: SuspendTransformConfiguration.() -> String) {
175+
outc = block
176+
}
177+
178+
fun withProp(block: SuspendTransformConfiguration.() -> KMutableProperty<String>) {
179+
inc { block().setter.call(it) }
180+
out { block().getter.call() }
181+
}
182+
}
183+
184+
private fun option(
185+
name: String,
186+
valueDescription: String = name,
187+
description: String = name,
188+
required: Boolean = false,
189+
allowMultipleOccurrences: Boolean = false,
190+
block: ResolveBuilder.() -> Unit
191+
): SimpleCliOption {
192+
val builder = ResolveBuilder().also(block)
193+
return SimpleCliOption(
194+
optionName = name,
195+
valueDescription = valueDescription,
196+
description = description,
197+
required = required,
198+
allowMultipleOccurrences = allowMultipleOccurrences,
199+
builder.outc,
200+
builder.inc
201+
)
202+
}
203+
204+
private fun String.option(
205+
subName: String,
206+
valueDescription: String = subName,
207+
description: String = "",
208+
required: Boolean = false,
209+
allowMultipleOccurrences: Boolean = false,
210+
block: ResolveBuilder.() -> Unit
211+
): SimpleCliOption {
212+
return option(
213+
name = "$this.$subName",
214+
valueDescription = valueDescription,
215+
description = description,
216+
required = required,
217+
allowMultipleOccurrences = allowMultipleOccurrences,
218+
block
219+
)
220+
}
221+
222+
interface ICliOption {
223+
val oName: String
224+
fun resolveToValue(configuration: SuspendTransformConfiguration): String
225+
fun resolveFromValue(configuration: SuspendTransformConfiguration, value: String)
226+
}
227+
228+
class SimpleCliOption(
229+
override val optionName: String,
230+
override val valueDescription: String,
231+
override val description: String,
232+
override val required: Boolean = true,
233+
override val allowMultipleOccurrences: Boolean = false,
234+
private val _resolveToValue: SuspendTransformConfiguration.() -> String,
235+
private val _resolveFromValue: SuspendTransformConfiguration.(String) -> Unit
236+
) : ICliOption, AbstractCliOption {
237+
override val oName: String
238+
get() = optionName
239+
240+
override fun resolveToValue(configuration: SuspendTransformConfiguration): String = _resolveToValue(configuration)
241+
override fun resolveFromValue(configuration: SuspendTransformConfiguration, value: String) =
242+
_resolveFromValue(configuration, value)
243+
}

0 commit comments

Comments
 (0)