Skip to content

Commit 895aa44

Browse files
authored
Merge pull request #365 from wuseal/code-builder-refactor
Code builder refactor
2 parents 7cb0467 + 855e6f9 commit 895aa44

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+653
-562
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package extensions.nstd
2+
3+
import wu.seal.jsontokotlin.model.builder.IKotlinDataClassCodeBuilder
4+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
5+
import wu.seal.jsontokotlin.utils.addIndent
6+
import wu.seal.jsontokotlin.utils.getCommentCode
7+
import wu.seal.jsontokotlin.utils.toAnnotationComments
8+
9+
/**
10+
* kotlin class code generator
11+
*
12+
* Created by Nstd on 2020/6/29 15:40.
13+
*/
14+
class DataClassCodeBuilderForNoConstructorMemberFields(private val kotlinDataClassCodeBuilder: IKotlinDataClassCodeBuilder) :
15+
IKotlinDataClassCodeBuilder {
16+
17+
override fun DataClass.genBody(): String {
18+
val delegateBody = kotlinDataClassCodeBuilder.run { genBody() }
19+
val noConstructorMemberFields = genNoConstructorProperties()
20+
return buildString {
21+
if (delegateBody.isEmpty()) {
22+
append(noConstructorMemberFields)
23+
} else{
24+
appendLine(noConstructorMemberFields)
25+
append(delegateBody)
26+
}
27+
}
28+
}
29+
30+
override fun DataClass.genClassComment(): String {
31+
return kotlinDataClassCodeBuilder.run { genClassComment() }
32+
}
33+
34+
override fun DataClass.genClassAnnotations(): String {
35+
return kotlinDataClassCodeBuilder.run { genClassAnnotations() }
36+
}
37+
38+
override fun DataClass.genClassName(): String {
39+
return kotlinDataClassCodeBuilder.run { genClassName() }
40+
}
41+
42+
43+
override fun DataClass.genParentClass(): String {
44+
return kotlinDataClassCodeBuilder.run { genParentClass() }
45+
}
46+
47+
override fun DataClass.genPrimaryConstructorProperties(): String {
48+
return ""
49+
}
50+
51+
private fun DataClass.genNoConstructorProperties(): String {
52+
return buildString {
53+
properties.filterNot { excludedProperties.contains(it.name) }.forEachIndexed { index, property ->
54+
val addIndentCode = property.getCode().addIndent(indent)
55+
val commentCode = getCommentCode(property.comment)
56+
if (fromJsonSchema && commentCode.isNotBlank()) {
57+
append(commentCode.toAnnotationComments(indent))
58+
}
59+
append(addIndentCode)
60+
if (!fromJsonSchema && commentCode.isNotBlank()) append(" // ").append(commentCode)
61+
}
62+
}
63+
}
64+
}

src/main/kotlin/extensions/nstd/ReplaceConstructorParametersByMemberVariablesSupport.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package extensions.nstd
22

33
import extensions.Extension
44
import wu.seal.jsontokotlin.model.builder.CodeBuilderConfig
5-
import wu.seal.jsontokotlin.model.builder.KotlinCodeBuilder
5+
import wu.seal.jsontokotlin.model.builder.KotlinDataClassCodeBuilder
6+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
67
import wu.seal.jsontokotlin.model.classscodestruct.KotlinClass
78
import wu.seal.jsontokotlin.ui.jCheckBox
89
import wu.seal.jsontokotlin.ui.jHorizontalLinearLayout
@@ -36,19 +37,19 @@ object ReplaceConstructorParametersByMemberVariablesSupport : Extension() {
3637

3738
return jHorizontalLinearLayout {
3839
jCheckBox(
39-
"Replace constructor parameters by member variables",
40-
getConfig(configKey).toBoolean(),
41-
{ isSelected -> setConfig(configKey, isSelected.toString()) }
40+
"Replace constructor parameters by member variables",
41+
getConfig(configKey).toBoolean(),
42+
{ isSelected -> setConfig(configKey, isSelected.toString()) }
4243
)
4344
fillSpace()
4445
}
4546
}
4647

4748
override fun intercept(kotlinClass: KotlinClass): KotlinClass {
48-
CodeBuilderConfig.instance.setConfig(
49-
KotlinCodeBuilder.CONF_KOTLIN_IS_USE_CONSTRUCTOR_PARAMETER,
50-
!getConfig(configKey).toBoolean()
51-
)
49+
if (getConfig(configKey).toBoolean())
50+
if (kotlinClass is DataClass) {
51+
return kotlinClass.copy(codeBuilder = DataClassCodeBuilderForNoConstructorMemberFields(kotlinClass.codeBuilder))
52+
}
5253
return kotlinClass
5354
}
5455
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package extensions.wu.seal
2+
3+
import wu.seal.jsontokotlin.model.builder.IKotlinDataClassCodeBuilder
4+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
5+
6+
/**
7+
* kotlin class code generator with internal modifier before class
8+
*
9+
* Created by Seal on 2020/7/7 21:40.
10+
*/
11+
class DataClassCodeBuilderDisableDataClass(private val kotlinDataClassCodeBuilder: IKotlinDataClassCodeBuilder) :
12+
IKotlinDataClassCodeBuilder {
13+
override fun DataClass.genClassComment(): String {
14+
return kotlinDataClassCodeBuilder.run { genClassComment() }
15+
}
16+
17+
override fun DataClass.genClassAnnotations(): String {
18+
return kotlinDataClassCodeBuilder.run { genClassAnnotations() }
19+
}
20+
21+
override fun DataClass.genClassName(): String {
22+
val originClassName = kotlinDataClassCodeBuilder.run { genClassName() }
23+
return originClassName.replace("data ", "")
24+
}
25+
26+
override fun DataClass.genParentClass(): String {
27+
return kotlinDataClassCodeBuilder.run { genParentClass() }
28+
}
29+
30+
override fun DataClass.genBody(): String {
31+
return kotlinDataClassCodeBuilder.run { genBody() }
32+
}
33+
34+
override fun DataClass.genPrimaryConstructorProperties(): String {
35+
return kotlinDataClassCodeBuilder.run { genPrimaryConstructorProperties() }
36+
}
37+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package extensions.wu.seal
2+
3+
import wu.seal.jsontokotlin.model.builder.IKotlinDataClassCodeBuilder
4+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
5+
6+
/**
7+
* kotlin class code generator with internal modifier before class
8+
*
9+
* Created by Seal on 2020/7/7 21:40.
10+
*/
11+
class DataClassCodeBuilderForInternalClass(private val kotlinDataClassCodeBuilder: IKotlinDataClassCodeBuilder) :
12+
IKotlinDataClassCodeBuilder {
13+
14+
override fun DataClass.genClassName(): String {
15+
val originClassName = kotlinDataClassCodeBuilder.run { genClassName() }
16+
return "internal $originClassName"
17+
}
18+
override fun DataClass.genClassComment(): String {
19+
return kotlinDataClassCodeBuilder.run { genClassComment() }
20+
}
21+
22+
override fun DataClass.genClassAnnotations(): String {
23+
return kotlinDataClassCodeBuilder.run { genClassAnnotations() }
24+
}
25+
26+
override fun DataClass.genParentClass(): String {
27+
return kotlinDataClassCodeBuilder.run { genParentClass() }
28+
}
29+
30+
override fun DataClass.genBody(): String {
31+
return kotlinDataClassCodeBuilder.run { genBody() }
32+
}
33+
34+
override fun DataClass.genPrimaryConstructorProperties(): String {
35+
return kotlinDataClassCodeBuilder.run { genPrimaryConstructorProperties() }
36+
}
37+
}

src/main/kotlin/extensions/wu/seal/DisableDataClassSupport.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package extensions.wu.seal
22

33
import extensions.Extension
44
import wu.seal.jsontokotlin.model.builder.CodeBuilderConfig
5-
import wu.seal.jsontokotlin.model.builder.KotlinCodeBuilder
5+
import wu.seal.jsontokotlin.model.builder.KotlinDataClassCodeBuilder
6+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
67
import wu.seal.jsontokotlin.model.classscodestruct.KotlinClass
78
import wu.seal.jsontokotlin.ui.jCheckBox
89
import wu.seal.jsontokotlin.ui.jHorizontalLinearLayout
@@ -18,16 +19,19 @@ object DisableDataClassSupport : Extension() {
1819
override fun createUI(): JPanel {
1920

2021
return jHorizontalLinearLayout {
21-
jCheckBox("Disable Kotlin Data Class", getConfig(configKey).toBoolean(), { isSelected -> setConfig(configKey, isSelected.toString()) })
22+
jCheckBox(
23+
"Disable Kotlin Data Class",
24+
getConfig(configKey).toBoolean(),
25+
{ isSelected -> setConfig(configKey, isSelected.toString()) })
2226
fillSpace()
2327
}
2428
}
2529

2630
override fun intercept(kotlinClass: KotlinClass): KotlinClass {
27-
CodeBuilderConfig.instance.setConfig(
28-
KotlinCodeBuilder.CONF_KOTLIN_IS_DATA_CLASS,
29-
!getConfig(configKey).toBoolean()
30-
)
31+
if (getConfig(configKey).toBoolean())
32+
if (kotlinClass is DataClass) {
33+
return kotlinClass.copy(codeBuilder = DataClassCodeBuilderDisableDataClass(kotlinClass.codeBuilder))
34+
}
3135
return kotlinClass
3236
}
3337
}

src/main/kotlin/extensions/wu/seal/InternalModifierSupport.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package extensions.wu.seal
22

33
import extensions.Extension
4-
import wu.seal.jsontokotlin.model.builder.CodeBuilderConfig
4+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
55
import wu.seal.jsontokotlin.model.classscodestruct.KotlinClass
66
import wu.seal.jsontokotlin.ui.jCheckBox
77
import wu.seal.jsontokotlin.ui.jHorizontalLinearLayout
@@ -23,10 +23,10 @@ object InternalModifierSupport : Extension() {
2323
}
2424

2525
override fun intercept(kotlinClass: KotlinClass): KotlinClass {
26-
CodeBuilderConfig.instance.setConfig(
27-
CONFIG_KEY,
28-
getConfig(CONFIG_KEY).toBoolean()
29-
)
26+
if (getConfig(CONFIG_KEY).toBoolean())
27+
if (kotlinClass is DataClass) {
28+
return kotlinClass.copy(codeBuilder = DataClassCodeBuilderForInternalClass(kotlinClass.codeBuilder))
29+
}
3030
return kotlinClass
3131
}
3232
}

src/main/kotlin/extensions/wu/seal/KeepAnnotationSupportForAndroidX.kt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package extensions.wu.seal
22

33
import extensions.Extension
44
import wu.seal.jsontokotlin.model.classscodestruct.Annotation
5-
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
65
import wu.seal.jsontokotlin.model.classscodestruct.KotlinClass
76
import wu.seal.jsontokotlin.ui.jCheckBox
87
import wu.seal.jsontokotlin.ui.jHorizontalLinearLayout
8+
import wu.seal.jsontokotlin.utils.runWhenDataClass
99
import javax.swing.JPanel
1010

1111
/**
@@ -30,23 +30,20 @@ object KeepAnnotationSupportForAndroidX : Extension() {
3030

3131
override fun intercept(kotlinClass: KotlinClass): KotlinClass {
3232

33-
if (kotlinClass is DataClass) {
34-
return if (getConfig(configKey).toBoolean()) {
33+
return kotlinClass.runWhenDataClass {
34+
if (getConfig(configKey).toBoolean()) {
3535

3636
val classAnnotationString = "@Keep"
3737

3838
val classAnnotation = Annotation.fromAnnotationString(classAnnotationString)
3939

40-
val newAnnotations = mutableListOf(classAnnotation).also { it.addAll(kotlinClass.annotations) }
40+
val newAnnotations = mutableListOf(classAnnotation).also { it.addAll(annotations) }
4141

42-
return kotlinClass.copy(annotations = newAnnotations)
42+
copy(annotations = newAnnotations)
4343
} else {
44-
kotlinClass
44+
this
4545
}
46-
} else {
47-
return kotlinClass
48-
}
49-
46+
} ?: kotlinClass
5047
}
5148

5249
override fun intercept(originClassImportDeclaration: String): String {

src/main/kotlin/extensions/yuan/varenyzc/BuildFromJsonObjectSupport.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package extensions.yuan.varenyzc
22

33
import extensions.Extension
44
import wu.seal.jsontokotlin.model.builder.CodeBuilderConfig
5-
import wu.seal.jsontokotlin.model.builder.KotlinCodeBuilder
5+
import wu.seal.jsontokotlin.model.builder.KotlinDataClassCodeBuilder
6+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
67
import wu.seal.jsontokotlin.model.classscodestruct.KotlinClass
78
import wu.seal.jsontokotlin.ui.jCheckBox
89
import wu.seal.jsontokotlin.ui.jHorizontalLinearLayout
@@ -20,16 +21,21 @@ object BuildFromJsonObjectSupport : Extension() {
2021
getConfig(configKey).toBoolean(),
2122
{ isSelected -> setConfig(configKey, isSelected.toString()) }
2223
)
23-
add(jLink("Know about this extension", "https://github.com/wuseal/JsonToKotlinClass/blob/master/build_from_jsonobject_tip.md"))
24+
add(
25+
jLink(
26+
"Know about this extension",
27+
"https://github.com/wuseal/JsonToKotlinClass/blob/master/build_from_jsonobject_tip.md"
28+
)
29+
)
2430
fillSpace()
2531
}
2632
}
2733

2834
override fun intercept(kotlinClass: KotlinClass): KotlinClass {
29-
CodeBuilderConfig.instance.setConfig(
30-
KotlinCodeBuilder.CONF_BUILD_FROM_JSON_OBJECT,
31-
getConfig(configKey).toBoolean()
32-
)
35+
if (getConfig(configKey).toBoolean())
36+
if (kotlinClass is DataClass) {
37+
return kotlinClass.copy(codeBuilder = DataClassCodeBuilderForAddingBuildFromJsonObject(kotlinClass.codeBuilder))
38+
}
3339
return kotlinClass
3440
}
3541

0 commit comments

Comments
 (0)