Skip to content

Commit e6a959b

Browse files
Bimowuseal
authored andcommitted
add extension force primitive type non-nullable (#239)
* add extension force primitive type non-nullable * fix test class type
1 parent de04ef1 commit e6a959b

File tree

4 files changed

+104
-2
lines changed

4 files changed

+104
-2
lines changed

src/main/kotlin/extensions/ExtensionsCollector.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package extensions
22

33
import extensions.chen.biao.KeepAnnotationSupport
4+
import extensions.jose.han.ParcelableAnnotationSupport
45
import extensions.ted.zeng.PropertyAnnotationLineSupport
56
import extensions.wu.seal.ClassNameSuffixSupport
67
import extensions.wu.seal.PropertyPrefixSupport
78
import extensions.wu.seal.PropertySuffixSupport
8-
import extensions.jose.han.ParcelableAnnotationSupport
9+
import extensions.xu.rui.PrimitiveTypeNonNullableSupport
910

1011
/**
1112
* extension collect, all extensions will be hold by this class's extensions property
@@ -20,6 +21,7 @@ object ExtensionsCollector {
2021
ParcelableAnnotationSupport,
2122
PropertyPrefixSupport,
2223
PropertySuffixSupport,
23-
ClassNameSuffixSupport
24+
ClassNameSuffixSupport,
25+
PrimitiveTypeNonNullableSupport
2426
)
2527
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package extensions.xu.rui
2+
3+
import extensions.Extension
4+
import wu.seal.jsontokotlin.ConfigManager
5+
import wu.seal.jsontokotlin.DefaultValueStrategy
6+
import wu.seal.jsontokotlin.classscodestruct.KotlinDataClass
7+
import wu.seal.jsontokotlin.codeelements.getDefaultValue
8+
import wu.seal.jsontokotlin.ui.checkBox
9+
import wu.seal.jsontokotlin.ui.horizontalLinearLayout
10+
import wu.seal.jsontokotlin.utils.NULLABLE_PRIMITIVE_TYPES
11+
import wu.seal.jsontokotlin.utils.getNonNullPrimitiveType
12+
import javax.swing.JPanel
13+
14+
object PrimitiveTypeNonNullableSupport : Extension() {
15+
16+
private const val configKey = "xu.rui.force_primitive_type_non-nullable"
17+
18+
19+
override fun intercept(kotlinDataClass: KotlinDataClass): KotlinDataClass {
20+
21+
if (getConfig(configKey).toBoolean().not()) {
22+
return kotlinDataClass
23+
}
24+
25+
val primitiveTypeNonNullableProperties = kotlinDataClass.properties.map {
26+
if (it.type in NULLABLE_PRIMITIVE_TYPES) {
27+
val newType = getNonNullPrimitiveType(it.type)
28+
if (ConfigManager.defaultValueStrategy != DefaultValueStrategy.None) {
29+
it.copy(type = newType, value = getDefaultValue(newType))
30+
} else {
31+
it.copy(type = newType)
32+
}
33+
} else {
34+
it
35+
}
36+
}
37+
38+
return kotlinDataClass.copy(properties = primitiveTypeNonNullableProperties)
39+
}
40+
41+
override fun createUI(): JPanel {
42+
return horizontalLinearLayout {
43+
(checkBox("Force Primitive Type Property Non-Nullable", getConfig(configKey).toBoolean()) { isSelectedAfterClick ->
44+
setConfig(configKey, isSelectedAfterClick.toString())
45+
})()
46+
fillSpace()
47+
}
48+
}
49+
50+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ const val BACKSTAGE_NULLABLE_POSTFIX = "_&^#"
3232
*/
3333
const val DEFAULT_TYPE = TYPE_ANY
3434

35+
val NULLABLE_PRIMITIVE_TYPES = arrayOf(TYPE_INT, TYPE_LONG, TYPE_DOUBLE, TYPE_BOOLEAN).map { it.plus("?") }
36+
3537
fun getPrimitiveType(jsonPrimitive: JsonPrimitive): String {
3638
return when {
3739
jsonPrimitive.isBoolean -> TYPE_BOOLEAN
@@ -216,3 +218,8 @@ fun getMapValueTypeConvertFromJsonObject(jsonObject: JsonObject): String {
216218
}
217219
return valueType
218220
}
221+
222+
223+
fun getNonNullPrimitiveType(rawType: String): String {
224+
return if (rawType in NULLABLE_PRIMITIVE_TYPES) rawType.replace("?", "") else rawType
225+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package extensions.xu.rui
2+
3+
import com.winterbe.expekt.should
4+
import org.junit.Before
5+
import org.junit.Test
6+
import wu.seal.jsontokotlin.DefaultValueStrategy
7+
import wu.seal.jsontokotlin.PropertyTypeStrategy
8+
import wu.seal.jsontokotlin.generateKotlinDataClass
9+
import wu.seal.jsontokotlin.interceptor.InitWithDefaultValueInterceptor
10+
import wu.seal.jsontokotlin.interceptor.PropertyTypeNullableStrategyInterceptor
11+
import wu.seal.jsontokotlin.test.TestConfig
12+
13+
class PrimitiveTypeNonNullableSupportTest {
14+
15+
private val json = """{ picture: { "id" : 1, "url" : "" } }"""
16+
17+
private val expectResult = """data class Test(
18+
val picture: Picture? = null
19+
) {
20+
data class Picture(
21+
val id: Int = 0, // 1
22+
val url: String? = null
23+
)
24+
}"""
25+
26+
27+
@Before
28+
fun setUp() {
29+
TestConfig.setToTestInitState()
30+
TestConfig.propertyTypeStrategy = PropertyTypeStrategy.Nullable
31+
TestConfig.defaultValueStrategy = DefaultValueStrategy.AllowNull
32+
}
33+
34+
@Test
35+
fun interceptTest() {
36+
val kotlinDataClass = json.generateKotlinDataClass()
37+
PrimitiveTypeNonNullableSupport.getTestHelper().setConfig("xu.rui.force_primitive_type_non-nullable", "true")
38+
val generatedCode = kotlinDataClass.applyInterceptors(listOf(PropertyTypeNullableStrategyInterceptor(), InitWithDefaultValueInterceptor(), PrimitiveTypeNonNullableSupport)).getCode()
39+
print(generatedCode)
40+
generatedCode.trimMargin().should.equal(expectResult.trimMargin())
41+
42+
}
43+
}

0 commit comments

Comments
 (0)