Skip to content

Commit 94c4606

Browse files
committed
refactor code builder module complete third step with 2 test cases not passed
1 parent 1c9c006 commit 94c4606

21 files changed

+401
-207
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: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package extensions.nstd
33
import extensions.Extension
44
import wu.seal.jsontokotlin.model.builder.CodeBuilderConfig
55
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-
KotlinDataClassCodeBuilder.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: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package extensions.wu.seal
33
import extensions.Extension
44
import wu.seal.jsontokotlin.model.builder.CodeBuilderConfig
55
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-
KotlinDataClassCodeBuilder.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/yuan/varenyzc/BuildFromJsonObjectSupport.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package extensions.yuan.varenyzc
33
import extensions.Extension
44
import wu.seal.jsontokotlin.model.builder.CodeBuilderConfig
55
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-
KotlinDataClassCodeBuilder.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

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package extensions.yuan.varenyzc
2+
3+
import wu.seal.jsontokotlin.model.builder.IKotlinDataClassCodeBuilder
4+
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
5+
import wu.seal.jsontokotlin.utils.newLine
6+
import wu.seal.jsontokotlin.utils.times
7+
8+
/**
9+
* kotlin class code generator for adding buildFromJsonObject function
10+
*
11+
* Created by Seal on 2020/7/7 21:45.
12+
*/
13+
class DataClassCodeBuilderForAddingBuildFromJsonObject(private val kotlinDataClassCodeBuilder: IKotlinDataClassCodeBuilder) :
14+
IKotlinDataClassCodeBuilder {
15+
16+
private val baseTypeList = listOf<String>("Int", "String", "Boolean", "Double", "Float", "Long")
17+
18+
override fun DataClass.genBody(): String {
19+
val delegateBody = kotlinDataClassCodeBuilder.run { genBody() }
20+
val buildFromJsonObjectFunctionCode = genBuildFromJsonObjectCode()
21+
return buildString {
22+
if (delegateBody.isEmpty()) {
23+
append(buildFromJsonObjectFunctionCode)
24+
}else{
25+
appendLine(delegateBody)
26+
append(buildFromJsonObjectFunctionCode)
27+
}
28+
}
29+
}
30+
31+
private fun DataClass.genBuildFromJsonObjectCode(): String {
32+
return buildString {
33+
append(indent * 1).append("companion object {").newLine()
34+
append(indent * 2).append("@JvmStatic").newLine()
35+
append(indent * 2).append("fun buildFromJson(jsonObject: JSONObject?): $name? {").newLine().newLine()
36+
append(indent * 3).append("jsonObject?.run {").newLine()
37+
append(indent * 4).append("return $name(").newLine()
38+
properties.filterNot { excludedProperties.contains(it.name) }.forEachIndexed { index, property ->
39+
when {
40+
baseTypeList.contains(property.type.replace("?", "")) -> {
41+
append(indent * 5).append("opt${property.type.replace("?", "")}(\"${property.originName}\")")
42+
}
43+
property.type.contains("List<") -> {
44+
val type = property.type.substring(property.type.indexOf('<') + 1, property.type.indexOf('>'))
45+
append(indent * 5).append("Array${property.type.replace("?", "")}().apply {").newLine()
46+
append(indent * 6).append("optJSONArray(\"${property.originName}\")?.let {").newLine()
47+
append(indent * 7).append("for(i in 0 until it.length()) {").newLine()
48+
append(indent * 8).append("this.add($type.buildFromJson(it.getJSONObject(i)))").newLine()
49+
append(indent * 7).append("}").newLine()
50+
append(indent * 6).append("}").newLine()
51+
append(indent * 5).append("}")
52+
}
53+
else -> {
54+
append(indent * 5).append(
55+
"${
56+
property.type.replace(
57+
"?",
58+
""
59+
)
60+
}.buildFromJson(optJSONObject(\"${property.originName}\"))"
61+
)
62+
}
63+
}
64+
65+
if (index < properties.size - 1) {
66+
append(",")
67+
}
68+
newLine()
69+
}
70+
append(indent * 4).append(")").newLine()
71+
append(indent * 3).append("}").newLine()
72+
append(indent * 3).append("return null").newLine()
73+
append(indent * 2).append("}").newLine()
74+
append(indent * 1).append("}")
75+
}
76+
}
77+
78+
override fun DataClass.genClassName(): String {
79+
return kotlinDataClassCodeBuilder.run { genClassName() }
80+
}
81+
82+
override fun DataClass.genClassComment(): String {
83+
return kotlinDataClassCodeBuilder.run { genClassComment() }
84+
}
85+
86+
override fun DataClass.genClassAnnotations(): String {
87+
return kotlinDataClassCodeBuilder.run { genClassAnnotations() }
88+
}
89+
90+
override fun DataClass.genParentClass(): String {
91+
return kotlinDataClassCodeBuilder.run { genParentClass() }
92+
}
93+
94+
override fun DataClass.genPrimaryConstructorProperties(): String {
95+
return kotlinDataClassCodeBuilder.run { genPrimaryConstructorProperties() }
96+
}
97+
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package extensions.yuan.varenyzc
22

3-
import com.intellij.util.ui.JBDimension
43
import extensions.Extension
54
import wu.seal.jsontokotlin.model.classscodestruct.DataClass
65
import wu.seal.jsontokotlin.model.classscodestruct.KotlinClass

src/main/kotlin/wu/seal/jsontokotlin/model/builder/ICodeBuilder.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package wu.seal.jsontokotlin.model.builder
22

33
import wu.seal.jsontokotlin.model.classscodestruct.KotlinClass
4+
import wu.seal.jsontokotlin.utils.getIndent
45

56
/**
67
* Code generator interface
78
*
89
* Created by Nstd on 2020/6/29 15:27.
910
*/
1011
interface ICodeBuilder<C : KotlinClass> {
12+
13+
val indent: String
14+
get() = getIndent()
15+
1116
/**
1217
* get the code (include referenced classes) string for writing into file or printing out
1318
*/

0 commit comments

Comments
 (0)