Skip to content

Commit 0eed657

Browse files
authored
Merge pull request #96 from kezhenxu94/bugfix/#94
bugfix: fix #94
2 parents 2f05f65 + 410935c commit 0eed657

File tree

6 files changed

+57
-10
lines changed

6 files changed

+57
-10
lines changed

src/main/kotlin/wu/seal/jsontokotlin/KotlinCodeMaker.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,11 @@ class KotlinCodeMaker {
115115
val classAnnotation = KClassAnnotation.getClassAnnotation(className.toString())
116116
stringBuilder.append(classAnnotation)
117117
if (classAnnotation.isNotBlank()) stringBuilder.append("\n")
118-
stringBuilder.append("data class ").append(className).append("(\n")
118+
if (inputElement?.isJsonNull == true || (inputElement as? JsonObject)?.entrySet()?.isEmpty() == true) {
119+
stringBuilder.append("class ").append(className).append("(\n")
120+
} else {
121+
stringBuilder.append("data class ").append(className).append("(\n")
122+
}
119123
}
120124

121125

src/main/kotlin/wu/seal/jsontokotlin/classscodestruct/KotlinDataClass.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ data class KotlinDataClass(
2323
append(annotationsCode).append("\n")
2424
}
2525
}
26-
append("data class ").append(name).append("(").append("\n")
26+
if (properties.isEmpty()) {
27+
append("class ").append(name).append("(").append("\n")
28+
} else {
29+
append("data class ").append(name).append("(").append("\n")
30+
}
2731
properties.forEach {
2832
val code = it.getCode()
2933
val addIndentCode = code.split("\n").joinToString("\n") { indent + it }
@@ -99,4 +103,4 @@ data class KotlinDataClass(
99103

100104
}
101105

102-
}
106+
}

src/main/kotlin/wu/seal/jsontokotlin/utils/SimplifiedMethods.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import com.intellij.openapi.application.ApplicationManager
88
import com.intellij.openapi.command.CommandProcessor
99
import com.intellij.openapi.project.Project
1010
import wu.seal.jsontokotlin.ConfigManager
11+
import java.lang.IllegalStateException
12+
import java.util.regex.Pattern
1113

1214
/**
1315
* File contains functions which simply other functions's invoke
@@ -50,7 +52,12 @@ fun getClassesStringList(classesString: String): List<String> {
5052
* export the class name from class block string
5153
*/
5254
fun getClassNameFromClassBlockString(classBlockString: String): String {
53-
return classBlockString.substringAfter("data class").substringBefore("(").trim()
55+
val pattern = Pattern.compile("(data )?class (?<className>[^(]+).*")
56+
val matcher = pattern.matcher(classBlockString)
57+
if (matcher.find()) {
58+
return matcher.group("className").trim()
59+
}
60+
throw IllegalStateException("cannot find class name in classBlockString: $classBlockString")
5461
}
5562

5663
fun replaceClassNameToClassBlockString(classBlockString: String, newClassName: String): String {
@@ -88,4 +95,4 @@ fun <E> List<E>.firstIndexAfterSpecificIndex(element: E, afterIndex: Int): Int {
8895

8996
fun getCommentCode(comment: String): String {
9097
return comment.replace(Regex("[\n\r]"), "")
91-
}
98+
}

src/main/kotlin/wu/seal/jsontokotlin/utils/classblockparse/NestedClassModelClassesCodeParser.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class NestedClassModelClassesCodeParser(private val nestedClassCode: String) {
3131
var backParenthesesCount = 0
3232
var backBigParenthesesCount = 0
3333
lines.forEach {
34-
if (it.startsWith("data class")) {
34+
if (it.matches("^(data )?class.+".toRegex())) {
3535
classStringBuilder.append("\n")
3636
classStringBuilder.append(it)
3737
dataclassStringCount++
@@ -58,4 +58,4 @@ class NestedClassModelClassesCodeParser(private val nestedClassCode: String) {
5858
}
5959
return classStrings
6060
}
61-
}
61+
}

src/test/kotlin/wu/seal/jsontokotlin/interceptor/MakeKeywordNamedPropertyValidInterceptorTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ class MakeKeywordNamedPropertyValidInterceptorTest {
1717

1818
@Test
1919
fun intercept() {
20-
val toBeParsedCode = """data class (val in: String,
20+
val toBeParsedCode = """data class A(val in: String,
2121
val as: Int,
2222
val dupa: Double
2323
)"""
2424
val kotlinDataClass = KotlinDataClass.fromParsedKotlinDataClass(ClassCodeParser(toBeParsedCode).getKotlinDataClass())
2525
val intercepted = MakeKeywordNamedPropertyValidInterceptor().intercept(kotlinDataClass)
26-
intercepted.getCode().should.be.equal("""data class (
26+
intercepted.getCode().should.be.equal("""data class A(
2727
val `in`: String,
2828
val `as`: Int,
2929
val dupa: Double
3030
)""")
3131
}
32-
}
32+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package wu.seal.jsontokotlin.regression
2+
3+
import com.winterbe.expekt.should
4+
import org.junit.Test
5+
import wu.seal.jsontokotlin.KotlinDataClassCodeMaker
6+
import wu.seal.jsontokotlin.test.TestConfig
7+
8+
/**
9+
* Created by kezhenxu at 2018/12/30 11:45
10+
*
11+
* @author kezhenxu (kezhenxu94 at 163 dot com)
12+
*/
13+
class Issue094Test {
14+
private val testJson = """
15+
{ "test": {} }
16+
""".trimIndent()
17+
private val expected = """data class A(
18+
@SerializedName("test")
19+
val test: Test = Test()
20+
) {
21+
class Test(
22+
)
23+
}"""
24+
25+
@Test
26+
fun testIssue094() {
27+
TestConfig.setToTestInitState()
28+
val generated = KotlinDataClassCodeMaker("A", testJson).makeKotlinDataClassCode()
29+
println("generated = ${generated}")
30+
generated.should.be.equal(expected)
31+
}
32+
}

0 commit comments

Comments
 (0)