Skip to content

Commit 19f0dc0

Browse files
authored
Log a warning when non data objecs are annotated (#252)
1 parent 9da23d0 commit 19f0dc0

File tree

15 files changed

+73
-22
lines changed

15 files changed

+73
-22
lines changed

compiler/src/main/kotlin/se/ansman/kotshi/Errors.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ object Errors {
2424
const val invalidRegisterAdapterVisibility = "Types annotated @RegisterJsonAdapter must be public or internal"
2525
const val abstractFactoriesAreDeprecated = "Having abstract factories is deprecated and will be removed in the future. Please migrate to use objects with delegation to the generated factory."
2626
const val registeredAdapterWithoutFactory = "Found classes annotated with @RegisterJsonAdapter but no factory annotated with @KotshiJsonAdapterFactory"
27+
const val nonDataObject = "JsonSerializable objects must be data objects. This warning will become an error in the future."
2728
fun privateDataClassProperty(propertyName: String) = "Property $propertyName must be public or internal"
2829
fun transientDataClassPropertyWithoutDefaultValue(propertyName: String) = "Transient property $propertyName must declare a default value"
2930
fun ignoredDataClassPropertyWithoutDefaultValue(propertyName: String) = "Ignored property $propertyName must declare a default value"

compiler/src/main/kotlin/se/ansman/kotshi/kapt/AdaptersProcessingStep.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,32 +102,32 @@ class AdaptersProcessingStep(
102102
}
103103

104104
val generator = when {
105-
metadata.isData -> DataClassAdapterGenerator(
105+
metadata.isObject -> ObjectAdapterGenerator(
106106
metadataAccessor = metadataAccessor,
107107
types = types,
108-
elements = elements,
109108
element = typeElement,
110109
metadata = metadata,
110+
elements = elements,
111111
globalConfig = globalConfig,
112112
messager = messager,
113113
)
114114

115-
metadata.isEnum -> EnumAdapterGenerator(
115+
metadata.isData -> DataClassAdapterGenerator(
116116
metadataAccessor = metadataAccessor,
117117
types = types,
118118
elements = elements,
119119
element = typeElement,
120120
metadata = metadata,
121121
globalConfig = globalConfig,
122-
messager = messager
122+
messager = messager,
123123
)
124124

125-
metadata.isObject -> ObjectAdapterGenerator(
125+
metadata.isEnum -> EnumAdapterGenerator(
126126
metadataAccessor = metadataAccessor,
127127
types = types,
128+
elements = elements,
128129
element = typeElement,
129130
metadata = metadata,
130-
elements = elements,
131131
globalConfig = globalConfig,
132132
messager = messager
133133
)

compiler/src/main/kotlin/se/ansman/kotshi/kapt/MetadataAccessor.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class MetadataAccessor(private val classInspector: ClassInspector) {
2929
getMetadataOrNull(type)
3030
?: throw KaptProcessingError(javaClassNotSupported, type)
3131

32+
fun getLanguageVersion(type: Element): KotlinVersion = getMetadata(type).languageVersion
33+
3234
fun getKmClass(metadata: Metadata): KmClass = kmClassPerMetadata.getOrPut(metadata) { metadata.toKmClass() }
3335
fun getKmClass(type: Element): KmClass = getKmClass(getMetadata(type))
3436
fun getKmClassOrNull(type: Element): KmClass? = getMetadataOrNull(type)?.let(::getKmClass)

compiler/src/main/kotlin/se/ansman/kotshi/kapt/generators/ObjectAdapterGenerator.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ package se.ansman.kotshi.kapt.generators
22

33
import com.squareup.kotlinpoet.metadata.isObject
44
import kotlinx.metadata.KmClass
5+
import kotlinx.metadata.isData
6+
import se.ansman.kotshi.Errors
57
import se.ansman.kotshi.kapt.MetadataAccessor
8+
import se.ansman.kotshi.kapt.logKotshiWarning
69
import se.ansman.kotshi.model.GeneratableJsonAdapter
710
import se.ansman.kotshi.model.GlobalConfig
811
import se.ansman.kotshi.model.ObjectJsonAdapter
@@ -22,12 +25,16 @@ class ObjectAdapterGenerator(
2225
) : AdapterGenerator(metadataAccessor, types, elements, element, metadata, globalConfig, messager) {
2326
init {
2427
require(metadata.isObject)
28+
if (!metadata.isData && metadataAccessor.getLanguageVersion(element) >= KotlinVersion(1, 9)) {
29+
messager.logKotshiWarning(Errors.nonDataObject, element)
30+
}
2531
}
2632

27-
override fun getGeneratableJsonAdapter(): GeneratableJsonAdapter =
28-
ObjectJsonAdapter(
33+
override fun getGeneratableJsonAdapter(): GeneratableJsonAdapter {
34+
return ObjectJsonAdapter(
2935
targetPackageName = targetClassName.packageName,
3036
targetSimpleNames = targetClassName.simpleNames,
3137
polymorphicLabels = getPolymorphicLabels()
3238
)
39+
}
3340
}

compiler/src/main/kotlin/se/ansman/kotshi/ksp/generators/ObjectAdapterGenerator.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import com.google.devtools.ksp.processing.Resolver
44
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
55
import com.google.devtools.ksp.symbol.ClassKind
66
import com.google.devtools.ksp.symbol.KSClassDeclaration
7+
import com.google.devtools.ksp.symbol.Modifier
8+
import se.ansman.kotshi.Errors
9+
import se.ansman.kotshi.ksp.logKotshiError
10+
import se.ansman.kotshi.ksp.logKotshiWarning
711
import se.ansman.kotshi.model.GeneratableJsonAdapter
812
import se.ansman.kotshi.model.GlobalConfig
913
import se.ansman.kotshi.model.ObjectJsonAdapter
@@ -16,6 +20,10 @@ class ObjectAdapterGenerator(
1620
) : AdapterGenerator(environment, element, globalConfig, resolver) {
1721
init {
1822
require(element.classKind == ClassKind.OBJECT)
23+
if (Modifier.DATA !in element.modifiers && environment.apiVersion >= KotlinVersion(1, 9)) {
24+
environment.logger.logKotshiError(environment.apiVersion.toString(), element)
25+
environment.logger.logKotshiWarning(Errors.nonDataObject, element)
26+
}
1927
}
2028

2129
override fun getGeneratableJsonAdapter(): GeneratableJsonAdapter =

tests/ksp/src/test/kotlin/se/ansman/kotshi/KspGeneratorTest.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.tschuchort.compiletesting.SourceFile
77
import com.tschuchort.compiletesting.kspArgs
88
import com.tschuchort.compiletesting.kspIncremental
99
import com.tschuchort.compiletesting.symbolProcessorProviders
10+
import org.junit.jupiter.api.Disabled
1011
import org.junit.jupiter.api.Test
1112
import org.junit.jupiter.api.parallel.Execution
1213
import org.junit.jupiter.api.parallel.ExecutionMode
@@ -313,4 +314,7 @@ class KspGeneratorTest : BaseGeneratorTest() {
313314
)
314315
}
315316
}
317+
318+
@Disabled("kotlin-compile-testing doesn't work well with overriding language version yet")
319+
override fun `non data object logs warnings`() {}
316320
}

tests/src/main/kotlin/se/ansman/kotshi/SealedClassOnInvalidFail.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ sealed class SealedClassOnInvalidFail {
99

1010
@JsonSerializable
1111
@JsonDefaultValue
12-
object Default : SealedClassOnInvalidFail()
12+
data object Default : SealedClassOnInvalidFail()
1313
}

tests/src/main/kotlin/se/ansman/kotshi/SealedClassOnInvalidNull.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ sealed class SealedClassOnInvalidNull {
99

1010
@JsonSerializable
1111
@JsonDefaultValue
12-
object Default : SealedClassOnInvalidNull()
12+
data object Default : SealedClassOnInvalidNull()
1313
}

tests/src/main/kotlin/se/ansman/kotshi/SealedClassOnMissingFail.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ sealed class SealedClassOnMissingFail {
99

1010
@JsonSerializable
1111
@JsonDefaultValue
12-
object Default : SealedClassOnMissingFail()
12+
data object Default : SealedClassOnMissingFail()
1313
}

tests/src/main/kotlin/se/ansman/kotshi/SealedClassOnMissingNull.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ sealed class SealedClassOnMissingNull {
99

1010
@JsonSerializable
1111
@JsonDefaultValue
12-
object Default : SealedClassOnMissingNull()
12+
data object Default : SealedClassOnMissingNull()
1313
}

0 commit comments

Comments
 (0)