Skip to content

Commit 33848ed

Browse files
committed
Fixed interceptors not work on nested classes
Fixed issue #44
1 parent 65f6dbf commit 33848ed

18 files changed

+229
-45
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ object ConfigManager : IConfigManager {
1313
private const val ENABLE_MAP_TYP_KEY = "json-to-kotlin-class-enable-map-type"
1414
private const val ENABLE_AUTO_REFORMAT = "json-to-kotlin-class-enable-auto-reformat"
1515
private const val ENABLE_MINIMAL_ANNOTATION = "json-to-kotlin-class-enable-minimal-annotation"
16+
private const val PARENT_CLASS_TEMPLATE = "json-to-kotlin-class-parent-class-template"
1617

1718
var indent: Int
1819
get() = if (TestConfig.isTestModel) TestConfig.indent else PropertiesComponent.getInstance().getInt(
@@ -52,4 +53,18 @@ object ConfigManager : IConfigManager {
5253
PropertiesComponent.getInstance().setValue(ENABLE_MINIMAL_ANNOTATION, value, false)
5354
}
5455
}
56+
57+
var parenClassTemplate: String
58+
get() = if (TestConfig.isTestModel) {
59+
TestConfig.parenClassTemplate
60+
} else {
61+
PropertiesComponent.getInstance().getValue(PARENT_CLASS_TEMPLATE, "")
62+
}
63+
set(value) {
64+
if (TestConfig.isTestModel) {
65+
TestConfig.parenClassTemplate = value
66+
} else {
67+
PropertiesComponent.getInstance().setValue(PARENT_CLASS_TEMPLATE, value, "")
68+
}
69+
}
5570
}

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package wu.seal.jsontokotlin
22

33
import com.intellij.openapi.editor.Document
44
import com.intellij.openapi.project.Project
5-
import sun.tools.java.ClassDeclaration
5+
import wu.seal.jsontokotlin.interceptor.InterceptorManager
66
import wu.seal.jsontokotlin.supporter.*
7+
import wu.seal.jsontokotlin.utils.ImportClassDeclaration
78
import wu.seal.jsontokotlin.utils.executeCouldRollBackAction
89

910
/**
@@ -42,7 +43,7 @@ object ImportClassWriter : IImportClassWriter {
4243
TargetJsonConverter.Custom -> insertCustomImportClass(project, editFile)
4344

4445
else -> {
45-
println("No need to import any Class code")
46+
writeImportClassDeclaration(editFile, "", project)
4647
}
4748
}
4849
}
@@ -67,13 +68,20 @@ object ImportClassWriter : IImportClassWriter {
6768
private fun insertImportClassString(editFile: Document, importClassString: String, project: Project?) {
6869

6970
val text = editFile.text
70-
importClassString.split("\n").forEach { importClassLineString ->
71+
72+
val interceptedImportClassDeclaration = ImportClassDeclaration.applyImportClassDeclarationInterceptors(
73+
importClassString,
74+
InterceptorManager.getEnabledImportClassDeclarationInterceptors()
75+
)
76+
77+
interceptedImportClassDeclaration.split("\n").forEach { importClassLineString ->
7178

7279
if (importClassLineString !in text) {
7380

7481
val packageIndex = text.indexOf("package ")
7582
val importIndex = Math.max(text.lastIndexOf("import"), packageIndex)
76-
val insertIndex = if (importIndex == -1) 0 else editFile.getLineEndOffset(editFile.getLineNumber(importIndex))
83+
val insertIndex =
84+
if (importIndex == -1) 0 else editFile.getLineEndOffset(editFile.getLineNumber(importIndex))
7785

7886

7987
executeCouldRollBackAction(project) {
@@ -85,7 +93,7 @@ object ImportClassWriter : IImportClassWriter {
8593
}
8694

8795
fun writeImportClassDeclaration(editFile: Document, classDeclaration: String, project: Project?) {
88-
insertImportClassString(editFile,classDeclaration,project)
96+
insertImportClassString(editFile, classDeclaration, project)
8997
}
9098

9199
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package wu.seal.jsontokotlin
22

3-
import wu.seal.jsontokotlin.interceptor.IInterceptor
3+
import wu.seal.jsontokotlin.interceptor.IKotlinDataClassInterceptor
44
import wu.seal.jsontokotlin.interceptor.InterceptorManager
55

66
class KotlinDataClassCodeMaker(private val rootClassName: String, private val json: String) {
@@ -9,18 +9,18 @@ class KotlinDataClassCodeMaker(private val rootClassName: String, private val js
99

1010
return if (needMakeKotlinCodeByKotlinDataClass()) {
1111

12-
makeKotlinDataClassCode(InterceptorManager.getEnabledInterceptors())
12+
makeKotlinDataClassCode(InterceptorManager.getEnabledKotlinDataClassInterceptors())
1313

1414
} else {
1515
KotlinCodeMaker(rootClassName, json).makeKotlinData()
1616
}
1717
}
1818

1919
private fun needMakeKotlinCodeByKotlinDataClass(): Boolean {
20-
return InterceptorManager.getEnabledInterceptors().isNotEmpty()
20+
return InterceptorManager.getEnabledKotlinDataClassInterceptors().isNotEmpty()
2121
}
2222

23-
fun makeKotlinDataClassCode(interceptors: List<IInterceptor>): String {
23+
fun makeKotlinDataClassCode(interceptors: List<IKotlinDataClassInterceptor>): String {
2424
val kotlinDataClasses = KotlinDataClassMaker(rootClassName = rootClassName, json = json).makeKotlinDataClasses()
2525
val interceptedDataClasses = kotlinDataClasses.map {it.applyInterceptors(interceptors)}
2626
val code = interceptedDataClasses.joinToString("\n\n") {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,10 @@ class MakeKotlinClassAction : AnAction("MakeKotlinClass") {
132132

133133
offset = caret.offset
134134
if (offset == 0) {
135-
offset = document.textLength - 1
135+
offset = document.textLength
136136
}
137137
} else {
138-
offset = document.textLength - 1
138+
offset = document.textLength
139139
}
140140
document.insertString(
141141
Math.max(offset, 0),

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package wu.seal.jsontokotlin.classscodestruct
22

3-
import wu.seal.jsontokotlin.interceptor.IInterceptor
3+
import wu.seal.jsontokotlin.interceptor.IKotlinDataClassInterceptor
44
import wu.seal.jsontokotlin.utils.classblockparse.ParsedKotlinDataClass
55
import wu.seal.jsontokotlin.utils.getCommentCode
66
import wu.seal.jsontokotlin.utils.getIndent
@@ -68,14 +68,22 @@ data class KotlinDataClass(
6868
return ParsedKotlinDataClass(annotationCodeList, name, parsedProperties)
6969
}
7070

71-
fun applyInterceptors(interceptors: List<IInterceptor>): KotlinDataClass {
71+
fun applyInterceptors(interceptors: List<IKotlinDataClassInterceptor>): KotlinDataClass {
7272
var kotlinDataClass = this
7373
interceptors.forEach {
74-
kotlinDataClass = it.intercept(kotlinDataClass)
74+
kotlinDataClass = kotlinDataClass.applyInterceptorWithNestedClasses(it)
7575
}
7676
return kotlinDataClass
7777
}
7878

79+
fun applyInterceptorWithNestedClasses(interceptor: IKotlinDataClassInterceptor): KotlinDataClass {
80+
if (nestedClasses.isNotEmpty()) {
81+
val newNestedClasses = nestedClasses.map { it.applyInterceptorWithNestedClasses(interceptor) }
82+
return interceptor.intercept(this).copy(nestedClasses = newNestedClasses)
83+
}
84+
return interceptor.intercept(this)
85+
}
86+
7987
companion object {
8088

8189
fun fromParsedKotlinDataClass(parsedKotlinDataClass: ParsedKotlinDataClass): KotlinDataClass {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package wu.seal.jsontokotlin.interceptor
2+
3+
/**
4+
* Insert import class code
5+
*/
6+
interface IImportClassDeclarationInterceptor {
7+
8+
/**
9+
* intercept the import class declaration code insert to the origin import classes declaration code
10+
*/
11+
fun intercept(originImportClasses: String):String
12+
}

src/main/kotlin/wu/seal/jsontokotlin/interceptor/IInterceptor.kt renamed to src/main/kotlin/wu/seal/jsontokotlin/interceptor/IKotlinDataClassInterceptor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import wu.seal.jsontokotlin.classscodestruct.KotlinDataClass
55
/**
66
* Interceptor for code transform
77
*/
8-
interface IInterceptor {
8+
interface IKotlinDataClassInterceptor {
99

1010
/**
1111
* intercept the kotlindataclass and modify the class,the function will return a new Kotlin Data Class Object

src/main/kotlin/wu/seal/jsontokotlin/interceptor/InterceptorManager.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,28 @@ import wu.seal.jsontokotlin.ConfigManager
44

55
object InterceptorManager {
66

7-
fun getEnabledInterceptors() :List<IInterceptor>{
7+
fun getEnabledKotlinDataClassInterceptors() :List<IKotlinDataClassInterceptor>{
88

9-
val interceptors = mutableListOf<IInterceptor>()
9+
val interceptors = mutableListOf<IKotlinDataClassInterceptor>()
1010
if (ConfigManager.enableMinimalAnnotation) {
11-
interceptors.add(MinimalAnnotationInterceptor())
11+
interceptors.add(MinimalAnnotationKotlinDataClassInterceptor())
1212
}
1313

14+
if (ConfigManager.parenClassTemplate.isNotBlank()) {
15+
interceptors.add(ParentClassTemplateKotlinDataClassInterceptor())
16+
}
1417
return interceptors
1518
}
1619

1720

21+
fun getEnabledImportClassDeclarationInterceptors(): List<IImportClassDeclarationInterceptor>{
22+
23+
return mutableListOf<IImportClassDeclarationInterceptor>().apply {
24+
25+
if (ConfigManager.parenClassTemplate.isNotBlank()) {
26+
add(ParentClassImportClassDeclarationInterceptor())
27+
}
28+
}
29+
}
30+
1831
}

src/main/kotlin/wu/seal/jsontokotlin/interceptor/MinimalAnnotationInterceptor.kt renamed to src/main/kotlin/wu/seal/jsontokotlin/interceptor/MinimalAnnotationKotlinDataClassInterceptor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import wu.seal.jsontokotlin.classscodestruct.KotlinDataClass
55
/**
66
* interceptor to make the code to be like the minimal annotation
77
*/
8-
class MinimalAnnotationInterceptor() : IInterceptor {
8+
class MinimalAnnotationKotlinDataClassInterceptor() : IKotlinDataClassInterceptor {
99

1010
override fun intercept(kotlinDataClass: KotlinDataClass): KotlinDataClass {
1111
val newProperties = kotlinDataClass.properties.map {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package wu.seal.jsontokotlin.interceptor
2+
3+
import wu.seal.jsontokotlin.ConfigManager
4+
5+
6+
/**
7+
* insert parent class declaration code
8+
*/
9+
class ParentClassImportClassDeclarationInterceptor : IImportClassDeclarationInterceptor {
10+
11+
override fun intercept(originImportClasses: String): String {
12+
val parentClassImportDeclaration = "import ${ConfigManager.parenClassTemplate.substringBeforeLast("(").trim()}"
13+
return "$originImportClasses\n$parentClassImportDeclaration".trim()
14+
}
15+
}

0 commit comments

Comments
 (0)