Skip to content

Commit 3a61fac

Browse files
committed
Add factory implementations for transformer and spec creation
Introduce `SuspendTransformPluginExtensionSpecFactory` and its implementation to modularize the creation of various specs. Refactor related methods to leverage the factory for cleaner and more consistent object instantiation.
1 parent a387786 commit 3a61fac

File tree

1 file changed

+135
-29
lines changed

1 file changed

+135
-29
lines changed

plugins/suspend-transform-plugin-gradle/src/main/kotlin/love/forte/plugin/suspendtrans/gradle/SuspendTransformPluginExtension.kt

+135-29
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
package love.forte.plugin.suspendtrans.gradle
32

43
import love.forte.plugin.suspendtrans.configuration.*
@@ -12,6 +11,7 @@ import org.gradle.api.provider.ListProperty
1211
import org.gradle.api.provider.Property
1312
import org.gradle.api.provider.Provider
1413
import org.gradle.api.provider.ProviderFactory
14+
import java.util.*
1515
import javax.inject.Inject
1616

1717
/**
@@ -26,29 +26,119 @@ annotation class SuspendTransformPluginExtensionSpecDslMarker
2626
@SuspendTransformPluginExtensionSpecDslMarker
2727
interface SuspendTransformPluginExtensionSpec
2828

29+
/**
30+
* @since 0.12.0
31+
*/
2932
@SuspendTransformPluginExtensionSpecDslMarker
3033
interface SuspendTransformPluginExtensionClassInfoSpec : SuspendTransformPluginExtensionSpec {
3134
fun classInfo(action: Action<in ClassInfoSpec>)
3235
fun classInfo(action: ClassInfoSpec.() -> Unit)
3336
}
3437

35-
// TODO
36-
// interface SuspendTransformPluginExtensionSpecFactory {
37-
// fun createClassInfo(): ClassInfoSpec
38-
// fun createMarkAnnotation(): MarkAnnotationSpec
39-
// fun createFunctionInfo(): FunctionInfoSpec
40-
// fun createIncludeAnnotation(): IncludeAnnotationSpec
41-
// fun createCopyAnnotationExclude(): CopyAnnotationExcludeSpec
42-
// fun createRuntimeDependency(): RuntimeDependencySpec
43-
// fun createAnnotationDependency(): AnnotationDependencySpec
44-
// fun createTransformFunctionInfo(): TransformFunctionInfoSpec
45-
// fun createTransformReturnType(): TransformReturnTypeSpec
46-
// fun createTransformer(): TransformerSpec
47-
// }
48-
//
49-
// interface SuspendTransformPluginExtensionSpecFactoryAware {
50-
// val factory: SuspendTransformPluginExtensionSpecFactory
51-
// }
38+
/**
39+
* @since 0.12.0
40+
*/
41+
@Suppress("unused")
42+
interface SuspendTransformPluginExtensionSpecFactory {
43+
fun createClassInfo(action: Action<in ClassInfoSpec>): ClassInfoSpec
44+
fun createClassInfo(action: ClassInfoSpec.() -> Unit): ClassInfoSpec =
45+
createClassInfo(Action(action))
46+
47+
fun createClassInfo(): ClassInfoSpec =
48+
createClassInfo { }
49+
50+
fun createMarkAnnotation(action: Action<in MarkAnnotationSpec>): MarkAnnotationSpec
51+
fun createMarkAnnotation(action: MarkAnnotationSpec.() -> Unit): MarkAnnotationSpec =
52+
createMarkAnnotation(Action(action))
53+
54+
fun createMarkAnnotation(): MarkAnnotationSpec =
55+
createMarkAnnotation { }
56+
57+
fun createFunctionInfo(action: Action<in FunctionInfoSpec>): FunctionInfoSpec
58+
fun createFunctionInfo(action: FunctionInfoSpec.() -> Unit): FunctionInfoSpec =
59+
createFunctionInfo(Action(action))
60+
61+
fun createFunctionInfo(): FunctionInfoSpec =
62+
createFunctionInfo { }
63+
64+
fun createIncludeAnnotation(action: Action<in IncludeAnnotationSpec>): IncludeAnnotationSpec
65+
fun createIncludeAnnotation(action: IncludeAnnotationSpec.() -> Unit): IncludeAnnotationSpec =
66+
createIncludeAnnotation(Action(action))
67+
68+
fun createIncludeAnnotation(): IncludeAnnotationSpec =
69+
createIncludeAnnotation { }
70+
71+
fun createRuntimeDependency(action: Action<in RuntimeDependencySpec>): RuntimeDependencySpec
72+
fun createRuntimeDependency(action: RuntimeDependencySpec.() -> Unit): RuntimeDependencySpec =
73+
createRuntimeDependency(Action(action))
74+
75+
fun createRuntimeDependency(): RuntimeDependencySpec =
76+
createRuntimeDependency { }
77+
78+
fun createAnnotationDependency(action: Action<in AnnotationDependencySpec>): AnnotationDependencySpec
79+
fun createAnnotationDependency(action: AnnotationDependencySpec.() -> Unit): AnnotationDependencySpec =
80+
createAnnotationDependency(Action(action))
81+
82+
fun createAnnotationDependency(): AnnotationDependencySpec =
83+
createAnnotationDependency { }
84+
85+
fun createTransformFunctionInfo(action: Action<in FunctionInfoSpec>): FunctionInfoSpec
86+
fun createTransformFunctionInfo(action: FunctionInfoSpec.() -> Unit): FunctionInfoSpec =
87+
createTransformFunctionInfo(Action(action))
88+
89+
fun createTransformFunctionInfo(): FunctionInfoSpec =
90+
createTransformFunctionInfo { }
91+
92+
fun createTransformer(action: Action<in TransformerSpec>): TransformerSpec
93+
fun createTransformer(action: TransformerSpec.() -> Unit): TransformerSpec =
94+
createTransformer(Action(action))
95+
96+
fun createTransformer(): TransformerSpec =
97+
createTransformer { }
98+
}
99+
100+
/**
101+
* @since 0.12.0
102+
*/
103+
interface SuspendTransformPluginExtensionSpecFactoryAware {
104+
val factory: SuspendTransformPluginExtensionSpecFactory
105+
}
106+
107+
private class SuspendTransformPluginExtensionSpecFactoryImpl(
108+
private val objects: ObjectFactory,
109+
) : SuspendTransformPluginExtensionSpecFactory {
110+
override fun createClassInfo(action: Action<in ClassInfoSpec>): ClassInfoSpec {
111+
return objects.newInstance<ClassInfoSpec>().also(action::execute)
112+
}
113+
114+
override fun createAnnotationDependency(action: Action<in AnnotationDependencySpec>): AnnotationDependencySpec {
115+
return objects.newInstance<AnnotationDependencySpec>().also(action::execute)
116+
}
117+
118+
override fun createMarkAnnotation(action: Action<in MarkAnnotationSpec>): MarkAnnotationSpec {
119+
return objects.newInstance<MarkAnnotationSpec>().also(action::execute)
120+
}
121+
122+
override fun createFunctionInfo(action: Action<in FunctionInfoSpec>): FunctionInfoSpec {
123+
return objects.newInstance<FunctionInfoSpec>().also(action::execute)
124+
}
125+
126+
override fun createIncludeAnnotation(action: Action<in IncludeAnnotationSpec>): IncludeAnnotationSpec {
127+
return objects.newInstance<IncludeAnnotationSpec>().also(action::execute)
128+
}
129+
130+
override fun createRuntimeDependency(action: Action<in RuntimeDependencySpec>): RuntimeDependencySpec {
131+
return objects.newInstance<RuntimeDependencySpec>().also(action::execute)
132+
}
133+
134+
override fun createTransformFunctionInfo(action: Action<in FunctionInfoSpec>): FunctionInfoSpec {
135+
return objects.newInstance<FunctionInfoSpec>().also(action::execute)
136+
}
137+
138+
override fun createTransformer(action: Action<in TransformerSpec>): TransformerSpec {
139+
return objects.newInstance<TransformerSpec>().also(action::execute)
140+
}
141+
}
52142

53143
/**
54144
* @since 0.12.0
@@ -57,11 +147,27 @@ interface SuspendTransformPluginExtensionClassInfoSpec : SuspendTransformPluginE
57147
abstract class TransformersContainer
58148
@Inject constructor(
59149
private val objects: ObjectFactory
60-
) : SuspendTransformPluginExtensionSpec {
150+
) : SuspendTransformPluginExtensionSpec,
151+
SuspendTransformPluginExtensionSpecFactoryAware {
152+
override val factory: SuspendTransformPluginExtensionSpecFactory =
153+
SuspendTransformPluginExtensionSpecFactoryImpl(objects)
154+
155+
// mutableMapOf()
61156
internal val containers: MutableMap<TargetPlatform, ListProperty<TransformerSpec>> =
62-
mutableMapOf()
157+
EnumMap(TargetPlatform::class.java)
158+
// TODO Maybe ...
159+
// containers: NamedDomainObjectContainer<TransformerSpecContainer> =
160+
// objects.domainObjectContainer(TransformerSpecContainer::class.java) { name ->
161+
// objects.newInstance(TransformerSpecContainer::class.java, name)
162+
// }
163+
// abstract class TransformerSpecContainer @Inject constructor(name: String) {
164+
// val targetPlatform: TargetPlatform = TargetPlatform.valueOf(name)
165+
// abstract val transformerSet: DomainObjectSet<TransformerSpec>
166+
// }
167+
63168

64169
private fun getTransformersInternal(platform: TargetPlatform): ListProperty<TransformerSpec> {
170+
// return containers.maybeCreate(platform.name).transformerSet
65171
return containers.computeIfAbsent(platform) { objects.listProperty(TransformerSpec::class.java) }
66172
}
67173

@@ -76,27 +182,27 @@ abstract class TransformersContainer
76182
* Create a [TransformerSpec] but not add.
77183
*/
78184
fun createTransformer(action: TransformerSpec.() -> Unit): TransformerSpec {
79-
return objects.newInstance<TransformerSpec>().also(action)
185+
return factory.createTransformer(action)
80186
}
81187

82188
fun add(platform: TargetPlatform, action: Action<in TransformerSpec>) {
83-
val listProperty = getTransformersInternal(platform)
84-
listProperty.add(createTransformer(action))
189+
val transformerSpecs = getTransformersInternal(platform)
190+
transformerSpecs.add(createTransformer(action))
85191
}
86192

87193
fun add(platform: TargetPlatform, action: TransformerSpec.() -> Unit) {
88-
val listProperty = getTransformersInternal(platform)
89-
listProperty.add(createTransformer(action))
194+
val transformerSpecs = getTransformersInternal(platform)
195+
transformerSpecs.add(createTransformer(action))
90196
}
91197

92198
fun add(platform: TargetPlatform, transformer: TransformerSpec) {
93-
val listProperty = getTransformersInternal(platform)
94-
listProperty.add(transformer)
199+
val transformerSpecs = getTransformersInternal(platform)
200+
transformerSpecs.add(transformer)
95201
}
96202

97203
fun add(platform: TargetPlatform, transformer: Provider<TransformerSpec>) {
98-
val listProperty = getTransformersInternal(platform)
99-
listProperty.add(transformer)
204+
val transformerSpecs = getTransformersInternal(platform)
205+
transformerSpecs.add(transformer)
100206
}
101207

102208
fun add(platform: TargetPlatform, transformer: Transformer) {

0 commit comments

Comments
 (0)