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