diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationErrors.java b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationErrors.java index 9d9add41cd5..58db82bb773 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationErrors.java +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationErrors.java @@ -17,6 +17,7 @@ public interface SerializationErrors { DiagnosticFactory2 INLINE_CLASSES_NOT_SUPPORTED = DiagnosticFactory2.create(ERROR); DiagnosticFactory0 PLUGIN_IS_NOT_ENABLED = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 LOCAL_CLASSES_NOT_SUPPORTED = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 INNER_CLASSES_NOT_SUPPORTED = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXPLICIT_SERIALIZABLE_IS_REQUIRED = DiagnosticFactory0.create(WARNING); diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt index 59d86c30b7d..c4991ffb270 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt @@ -123,6 +123,11 @@ open class SerializationPluginDeclarationChecker : DeclarationChecker { return false } + if (descriptor.isInner) { + trace.reportOnSerializableAnnotation(descriptor, SerializationErrors.INNER_CLASSES_NOT_SUPPORTED) + return false + } + if (descriptor.isInlineClass() && !canSupportInlineClasses(descriptor.module, trace)) { descriptor.onSerializableAnnotation { trace.report( diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt index f65ad68ab40..8fb31ceeb9f 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt @@ -27,7 +27,11 @@ object SerializationPluginErrorsRendering : DefaultErrorMessages.Extension { ) MAP.put( SerializationErrors.LOCAL_CLASSES_NOT_SUPPORTED, - "Local class and anonymous objects can not be serializable" + "Local classes and anonymous objects can not be serializable." + ) + MAP.put( + SerializationErrors.INNER_CLASSES_NOT_SUPPORTED, + "Inner (with reference to outer this) serializable classes are not supported. Remove @Serializable annotation or 'inner' keyword." ) MAP.put( SerializationErrors.EXPLICIT_SERIALIZABLE_IS_REQUIRED, diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/LocalAndAnonymous.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/LocalAndAnonymous.kt index 81dcf9afeb5..be4e375a28a 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/LocalAndAnonymous.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/LocalAndAnonymous.kt @@ -14,5 +14,9 @@ fun container() { val topLevelAnon = @Serializable object {} @Serializable class A { - @Serializable class B // nesting classes are allowed + @Serializable class B // nested classes are allowed + + @Serializable inner class C // inner classes are not + + @Serializable object F {} // regular named object, OK } \ No newline at end of file