Skip to content

Commit 92b7816

Browse files
authored
Merge pull request #441 from FasterXML/kotlin-1.5.0
Upgrade to Kotlin 1.5.0
2 parents 3773883 + c434eab commit 92b7816

File tree

11 files changed

+116
-44
lines changed

11 files changed

+116
-44
lines changed

.travis.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
language: java
2+
3+
jdk:
4+
- openjdk8
5+
- openjdk11
6+
7+
# whitelist
8+
branches:
9+
only:
10+
- master
11+
- "2.13"
12+
- "kotlin-1.5.0"

pom.xml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
<javac.src.version>1.8</javac.src.version>
5353
<javac.target.version>1.8</javac.target.version>
5454

55-
<version.kotlin>1.4.21</version.kotlin>
55+
<version.kotlin>1.5.10</version.kotlin>
5656

5757
<!-- Generate PackageVersion.java into this directory. -->
5858
<packageVersion.dir>com/fasterxml/jackson/module/kotlin</packageVersion.dir>
@@ -203,6 +203,25 @@
203203
<parameter>
204204
<breakBuildOnBinaryIncompatibleModifications>true</breakBuildOnBinaryIncompatibleModifications>
205205
<breakBuildOnSourceIncompatibleModifications>true</breakBuildOnSourceIncompatibleModifications>
206+
<excludes>
207+
<!--
208+
TODO Remove after release of 2.13 and update the oldVersion above.
209+
210+
Kotlin's method suffix generation changed in 1.4.30
211+
(https://github.com/Kotlin/KEEP/commit/e7984ffd83a1166c7f81a11d1a95b35cae929a2a#diff-012da204af6117588e5a1d3a41491bb7fe4e6c5620111c3c2d4a680c7a1057b1R653)
212+
which changes the presented API produced by these objects. While they aren't
213+
internal and should not be…they're fairly esoteric so we're ok with that breakage
214+
across a major version.
215+
-->
216+
<exclude>com.fasterxml.jackson.module.kotlin.UByteDeserializer</exclude>
217+
<exclude>com.fasterxml.jackson.module.kotlin.UByteSerializer</exclude>
218+
<exclude>com.fasterxml.jackson.module.kotlin.UIntDeserializer</exclude>
219+
<exclude>com.fasterxml.jackson.module.kotlin.UIntSerializer</exclude>
220+
<exclude>com.fasterxml.jackson.module.kotlin.ULongDeserializer</exclude>
221+
<exclude>com.fasterxml.jackson.module.kotlin.ULongSerializer</exclude>
222+
<exclude>com.fasterxml.jackson.module.kotlin.UShortDeserializer</exclude>
223+
<exclude>com.fasterxml.jackson.module.kotlin.UShortSerializer</exclude>
224+
</excludes>
206225
</parameter>
207226
</configuration>
208227
<executions>

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinDeserializers.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ package com.fasterxml.jackson.module.kotlin
55
import com.fasterxml.jackson.core.JsonParser
66
import com.fasterxml.jackson.core.JsonToken.VALUE_NUMBER_INT
77
import com.fasterxml.jackson.core.exc.InputCoercionException
8-
import com.fasterxml.jackson.databind.*
8+
import com.fasterxml.jackson.databind.BeanDescription
9+
import com.fasterxml.jackson.databind.DeserializationConfig
10+
import com.fasterxml.jackson.databind.DeserializationContext
11+
import com.fasterxml.jackson.databind.JavaType
12+
import com.fasterxml.jackson.databind.JsonDeserializer
913
import com.fasterxml.jackson.databind.deser.Deserializers
1014
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
1115

@@ -79,7 +83,6 @@ object ULongDeserializer : StdDeserializer<ULong>(ULong::class.java) {
7983
)
8084
}
8185

82-
@ExperimentalUnsignedTypes
8386
internal class KotlinDeserializers : Deserializers.Base() {
8487
override fun findBeanDeserializer(
8588
type: JavaType,
@@ -96,4 +99,4 @@ internal class KotlinDeserializers : Deserializers.Base() {
9699
else -> null
97100
}
98101
}
99-
}
102+
}

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinNamesAnnotationIntrospector.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@ import com.fasterxml.jackson.annotation.JsonCreator
44
import com.fasterxml.jackson.annotation.JsonProperty
55
import com.fasterxml.jackson.databind.PropertyName
66
import com.fasterxml.jackson.databind.cfg.MapperConfig
7-
import com.fasterxml.jackson.databind.introspect.*
7+
import com.fasterxml.jackson.databind.introspect.Annotated
8+
import com.fasterxml.jackson.databind.introspect.AnnotatedConstructor
9+
import com.fasterxml.jackson.databind.introspect.AnnotatedField
10+
import com.fasterxml.jackson.databind.introspect.AnnotatedMember
11+
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
12+
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter
13+
import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector
814
import com.fasterxml.jackson.databind.util.BeanUtil
915
import java.lang.reflect.Constructor
1016
import java.lang.reflect.Method
17+
import java.util.Locale
1118
import kotlin.reflect.KClass
1219
import kotlin.reflect.KFunction
1320
import kotlin.reflect.KParameter
@@ -26,11 +33,15 @@ internal class KotlinNamesAnnotationIntrospector(val module: KotlinModule, val c
2633
if (member.name.startsWith("get") &&
2734
member.name.contains('-') &&
2835
member.parameterCount == 0) {
29-
return member.name.substringAfter("get").decapitalize().substringBefore('-')
36+
return member.name.substringAfter("get")
37+
.replaceFirstChar { it.lowercase(Locale.getDefault()) }
38+
.substringBefore('-')
3039
} else if (member.name.startsWith("is") &&
3140
member.name.contains('-') &&
3241
member.parameterCount == 0) {
33-
return member.name.substringAfter("is").decapitalize().substringBefore('-')
42+
return member.name.substringAfter("is")
43+
.replaceFirstChar { it.lowercase(Locale.getDefault()) }
44+
.substringBefore('-')
3445
}
3546
} else if (member is AnnotatedParameter) {
3647
return findKotlinParameterName(member)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.fasterxml.jackson.module.kotlin.test.github
2+
3+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
4+
import com.fasterxml.jackson.module.kotlin.readValue
5+
import org.junit.Test
6+
import kotlin.test.assertSame
7+
8+
/**
9+
* An empty object should be deserialized as *the* Unit instance
10+
*/
11+
class TestGithub196 {
12+
@Test
13+
fun testUnitSingletonDeserialization() {
14+
assertSame(jacksonObjectMapper().readValue("{}"), Unit)
15+
}
16+
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/Github270.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import kotlin.test.assertEquals
66

77
class TestGithub270 {
88
data class Wrapper(private val field: String) {
9-
val upper = field.toUpperCase()
9+
val upper = field.uppercase()
1010
fun field() = field
1111
fun stillAField() = field
1212
}
@@ -16,4 +16,4 @@ class TestGithub270 {
1616
val json = jacksonObjectMapper().writeValueAsString(Wrapper("Hello"))
1717
assertEquals("""{"upper":"HELLO"}""", json)
1818
}
19-
}
19+
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/Github356.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,21 @@ class TestGithub356 {
2020
val original = ClassWithInlineMember(InlineClass("bar"))
2121
assertEquals("""{"inlineClassProperty":"bar"}""", mapper.writeValueAsString(original))
2222
}
23+
24+
@Test
25+
fun deserializeValueClass() {
26+
val original = ClassWithValueMember(ValueClass("bar"))
27+
assertEquals(original, mapper.readValue(mapper.writeValueAsString(original)))
28+
}
29+
30+
@Test
31+
fun serializeValueClass() {
32+
val original = ClassWithValueMember(ValueClass("bar"))
33+
assertEquals("""{"valueClassProperty":"bar"}""", mapper.writeValueAsString(original))
34+
}
2335
}
2436

25-
@Suppress("EXPERIMENTAL_FEATURE_WARNING") // Enabled in test-compile
37+
// Deprecated usage kept at 1.5.0 upgrade; delete in the future
2638
inline class InlineClass(val value: String)
2739

2840
@JsonDeserialize(builder = ClassWithInlineMember.JacksonBuilder::class)
@@ -31,3 +43,14 @@ data class ClassWithInlineMember(val inlineClassProperty: InlineClass) {
3143
fun build() = ClassWithInlineMember(InlineClass(inlineClassProperty))
3244
}
3345
}
46+
47+
@Suppress("EXPERIMENTAL_FEATURE_WARNING") // Enabled in test-compile
48+
@JvmInline
49+
value class ValueClass(val value: String)
50+
51+
@JsonDeserialize(builder = ClassWithValueMember.JacksonBuilder::class)
52+
data class ClassWithValueMember(val valueClassProperty: ValueClass) {
53+
data class JacksonBuilder constructor(val valueClassProperty: String) {
54+
fun build() = ClassWithValueMember(ValueClass(valueClassProperty))
55+
}
56+
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/Github47.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.fasterxml.jackson.module.kotlin.test.github
22

33
import com.fasterxml.jackson.databind.MapperFeature
4-
import com.fasterxml.jackson.module.kotlin.*
4+
import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder
5+
import com.fasterxml.jackson.module.kotlin.readValue
56
import org.junit.Test
67
import kotlin.test.assertEquals
78

@@ -11,8 +12,9 @@ class TestGithub47 {
1112

1213
@Test
1314
fun testCaseInsensitivePropertyNames() {
14-
val mapper = jacksonObjectMapper()
15-
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
15+
val mapper = jacksonMapperBuilder()
16+
.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
17+
.build()
1618

1719
val jsonWithMismtachedPropertyName = """
1820
{
@@ -23,4 +25,4 @@ class TestGithub47 {
2325
val item: ConfigItem = mapper.readValue<ConfigItem>(jsonWithMismtachedPropertyName)
2426
assertEquals("test", item.configItemId)
2527
}
26-
}
28+
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/failing/GitHub337.kt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.fasterxml.jackson.module.kotlin.test.github.failing
33
import com.fasterxml.jackson.annotation.JsonInclude
44
import com.fasterxml.jackson.annotation.JsonProperty
55
import com.fasterxml.jackson.databind.MapperFeature.SORT_PROPERTIES_ALPHABETICALLY
6-
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
6+
import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder
77
import org.junit.Ignore
88
import org.junit.Test
99
import kotlin.test.assertEquals
@@ -12,17 +12,18 @@ import kotlin.test.assertEquals
1212
* Fields named "is…" are only serialized if they are Boolean
1313
*/
1414
class TestGitHub337 {
15-
private val mapper = jacksonObjectMapper()
16-
.setSerializationInclusion(JsonInclude.Include.ALWAYS)
17-
.configure(SORT_PROPERTIES_ALPHABETICALLY, true)
15+
private val mapper = jacksonMapperBuilder()
16+
.configure(SORT_PROPERTIES_ALPHABETICALLY, true)
17+
.build()
18+
.setSerializationInclusion(JsonInclude.Include.ALWAYS)
1819
private val writer = mapper.writerWithDefaultPrettyPrinter()
1920

2021
@Test
2122
@Ignore
2223
fun test_ClassWithIsFields() {
2324
data class ClassWithIsFields(
24-
val isBooleanField: Boolean,
25-
val isIntField: Int
25+
val isBooleanField: Boolean,
26+
val isIntField: Int
2627
)
2728

2829
val problematic = ClassWithIsFields(true, 9)
@@ -38,8 +39,8 @@ class TestGitHub337 {
3839
@Ignore
3940
fun test_AnnotatedClassWithIsFields() {
4041
data class ClassWithIsFields(
41-
@JsonProperty("isBooleanField") val isBooleanField: Boolean,
42-
@JsonProperty("isIntField") val isIntField: Int
42+
@JsonProperty("isBooleanField") val isBooleanField: Boolean,
43+
@JsonProperty("isIntField") val isIntField: Int
4344
)
4445

4546
val problematic = ClassWithIsFields(true, 9)
@@ -54,8 +55,8 @@ class TestGitHub337 {
5455
@Test
5556
fun test_AnnotatedGetClassWithIsFields() {
5657
data class ClassWithIsFields(
57-
@JsonProperty("isBooleanField") val isBooleanField: Boolean,
58-
@get:JsonProperty("isIntField") val isIntField: Int
58+
@JsonProperty("isBooleanField") val isBooleanField: Boolean,
59+
@get:JsonProperty("isIntField") val isIntField: Int
5960
)
6061

6162
val problematic = ClassWithIsFields(true, 9)
@@ -66,4 +67,4 @@ class TestGitHub337 {
6667
}""".trimIndent()
6768
assertEquals(expected, writer.writeValueAsString(problematic))
6869
}
69-
}
70+
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/failing/Github160DisableAnnotations.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.fasterxml.jackson.module.kotlin.test.github.failing
22

33
import com.fasterxml.jackson.databind.MapperFeature
44
import com.fasterxml.jackson.databind.exc.MismatchedInputException
5-
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
5+
import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder
66
import com.fasterxml.jackson.module.kotlin.readValue
77
import com.fasterxml.jackson.module.kotlin.test.expectFailure
88
import org.junit.Test
@@ -12,7 +12,9 @@ class TestGithub160 {
1212

1313
@Test
1414
fun dataClass() {
15-
val mapper = jacksonObjectMapper().configure(MapperFeature.USE_ANNOTATIONS, false)
15+
val mapper = jacksonMapperBuilder()
16+
.configure(MapperFeature.USE_ANNOTATIONS, false)
17+
.build()
1618
expectFailure<MismatchedInputException>("GitHub #160 has been fixed!") {
1719
mapper.readValue<DataClass>("""{"blah":"blah"}""")
1820
}

0 commit comments

Comments
 (0)