diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/externalInterfaceNested.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/externalInterfaceNested.kt new file mode 100644 index 00000000000..a8121993f53 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/externalInterfaceNested.kt @@ -0,0 +1,11 @@ +external interface I { + interface J + + class C + + object O + + enum class E + + companion object +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/externalInterfaceNested.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/externalInterfaceNested.txt new file mode 100644 index 00000000000..a49b05c80ad --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/externalInterfaceNested.txt @@ -0,0 +1,49 @@ +package + +public external interface I { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class C { + public constructor C() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public companion object Companion { + private constructor Companion() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public final enum class E : kotlin.Enum { + private constructor E() + public final override /*1*/ /*fake_override*/ val name: kotlin.String + public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: I.E): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): I.E + public final /*synthesized*/ fun values(): kotlin.Array + } + + public interface J { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public object O { + private constructor O() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.kt index 211d41aa03a..b43a42905c3 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.kt @@ -12,14 +12,6 @@ external interface T { fun foo() fun bar() - - companion object { - val baz: Int - val boo: Int = definedExternally - - fun foo() - fun bar(): String = definedExternally - } } external class C { diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.txt index e21df3b5c23..4b72235b4e9 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/native.txt @@ -45,15 +45,4 @@ public external interface T { public abstract fun foo(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String - - public companion object Companion { - private constructor Companion() - public final val baz: kotlin.Int - public final val boo: kotlin.Int - public final fun bar(): kotlin.String - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public final fun foo(): kotlin.Unit - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String - } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index 538d1d6cd4f..ddd3c0ba440 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -641,6 +641,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes doTest(fileName); } + @TestMetadata("externalInterfaceNested.kt") + public void testExternalInterfaceNested() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/native/externalInterfaceNested.kt"); + doTest(fileName); + } + @TestMetadata("inheritance.kt") public void testInheritance() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/native/inheritance.kt"); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt index 4de92ac7253..11c13f2f83d 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt @@ -89,6 +89,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by lazy { put(ErrorsJs.INLINE_EXTERNAL_DECLARATION, "Inline external declaration") put(ErrorsJs.NON_ABSTRACT_MEMBER_OF_EXTERNAL_INTERFACE, "Only nullable properties of external interfaces are allowed to be non-abstract") + put(ErrorsJs.NESTED_CLASS_IN_EXTERNAL_INTERFACE, "Interface can't contain nested classes and objects") put(ErrorsJs.WRONG_BODY_OF_EXTERNAL_DECLARATION, "Wrong body of external declaration. Must be either ' = definedExternally' or { definedExternally }") diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java index 94544ec98c0..52c89eb9bbe 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java @@ -94,6 +94,8 @@ public interface ErrorsJs { ERROR, PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT); DiagnosticFactory0 NON_ABSTRACT_MEMBER_OF_EXTERNAL_INTERFACE = DiagnosticFactory0.create( ERROR, PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT); + DiagnosticFactory0 NESTED_CLASS_IN_EXTERNAL_INTERFACE = DiagnosticFactory0.create( + ERROR, PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT); // Diagnostics about exposing implementation detail in external declarations DiagnosticFactory0 WRONG_BODY_OF_EXTERNAL_DECLARATION = DiagnosticFactory0.create(ERROR); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsDefinedExternallyCallChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsDefinedExternallyCallChecker.kt index 57f9007cee0..45975cf90b1 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsDefinedExternallyCallChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsDefinedExternallyCallChecker.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.js.resolve.diagnostics import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.js.resolve.diagnostics.JsExternalChecker.DEFINED_EXTENRALLY_PROPERTY_NAMES +import org.jetbrains.kotlin.js.resolve.diagnostics.JsExternalChecker.DEFINED_EXTERNALLY_PROPERTY_NAMES import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe object JsDefinedExternallyCallChecker : CallChecker { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { - if (resolvedCall.resultingDescriptor.fqNameUnsafe !in DEFINED_EXTENRALLY_PROPERTY_NAMES) return + if (resolvedCall.resultingDescriptor.fqNameUnsafe !in DEFINED_EXTERNALLY_PROPERTY_NAMES) return val ownerDescriptor = context.scope.ownerDescriptor if (!AnnotationsUtils.isNativeObject(ownerDescriptor) && !AnnotationsUtils.isPredefinedObject(ownerDescriptor)) { diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt index 2717742b7fc..da16767d37f 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt @@ -33,7 +33,7 @@ import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.utils.singletonOrEmptyList object JsExternalChecker : SimpleDeclarationChecker { - val DEFINED_EXTENRALLY_PROPERTY_NAMES = setOf(FqNameUnsafe("kotlin.js.noImpl"), FqNameUnsafe("kotlin.js.definedExternally")) + val DEFINED_EXTERNALLY_PROPERTY_NAMES = setOf(FqNameUnsafe("kotlin.js.noImpl"), FqNameUnsafe("kotlin.js.definedExternally")) override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink, bindingContext: BindingContext) { @@ -61,6 +61,12 @@ object JsExternalChecker : SimpleDeclarationChecker { diagnosticHolder.report(ErrorsJs.WRONG_EXTERNAL_DECLARATION.on(declaration, "private member of class")) } + if (descriptor is ClassDescriptor && descriptor.kind != ClassKind.INTERFACE && + descriptor.containingDeclaration.let { it is ClassDescriptor && it.kind == ClassKind.INTERFACE } + ) { + diagnosticHolder.report(ErrorsJs.NESTED_CLASS_IN_EXTERNAL_INTERFACE.on(declaration)) + } + if (descriptor !is PropertyAccessorDescriptor && descriptor.isExtension) { val target = when (descriptor) { is FunctionDescriptor -> "extension function" @@ -213,6 +219,6 @@ object JsExternalChecker : SimpleDeclarationChecker { private fun KtExpression.isDefinedExternallyExpression(bindingContext: BindingContext): Boolean { val descriptor = getResolvedCall(bindingContext)?.resultingDescriptor as? PropertyDescriptor ?: return false val container = descriptor.containingDeclaration as? PackageFragmentDescriptor ?: return false - return DEFINED_EXTENRALLY_PROPERTY_NAMES.any { container.fqNameUnsafe == it.parent() && descriptor.name == it.shortName() } + return DEFINED_EXTERNALLY_PROPERTY_NAMES.any { container.fqNameUnsafe == it.parent() && descriptor.name == it.shortName() } } } diff --git a/js/js.libraries/src/generated/org.khronos.webgl.kt b/js/js.libraries/src/generated/org.khronos.webgl.kt index 8baa78531d9..b598494a384 100644 --- a/js/js.libraries/src/generated/org.khronos.webgl.kt +++ b/js/js.libraries/src/generated/org.khronos.webgl.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.khronos.webgl import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.dom.css.kt b/js/js.libraries/src/generated/org.w3c.dom.css.kt index af91cde0f9f..0dc8752d75b 100644 --- a/js/js.libraries/src/generated/org.w3c.dom.css.kt +++ b/js/js.libraries/src/generated/org.w3c.dom.css.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.dom.css import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.dom.events.kt b/js/js.libraries/src/generated/org.w3c.dom.events.kt index 5b723f2cd33..82f55adc628 100644 --- a/js/js.libraries/src/generated/org.w3c.dom.events.kt +++ b/js/js.libraries/src/generated/org.w3c.dom.events.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.dom.events import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.dom.kt b/js/js.libraries/src/generated/org.w3c.dom.kt index 3ca6350db58..7fce03137ff 100644 --- a/js/js.libraries/src/generated/org.w3c.dom.kt +++ b/js/js.libraries/src/generated/org.w3c.dom.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.dom import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.dom.parsing.kt b/js/js.libraries/src/generated/org.w3c.dom.parsing.kt index acb1d90dfb6..8117661db93 100644 --- a/js/js.libraries/src/generated/org.w3c.dom.parsing.kt +++ b/js/js.libraries/src/generated/org.w3c.dom.parsing.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.dom.parsing import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.dom.svg.kt b/js/js.libraries/src/generated/org.w3c.dom.svg.kt index bf0925034f9..3b0a62b31de 100644 --- a/js/js.libraries/src/generated/org.w3c.dom.svg.kt +++ b/js/js.libraries/src/generated/org.w3c.dom.svg.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.dom.svg import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.dom.url.kt b/js/js.libraries/src/generated/org.w3c.dom.url.kt index 807a425120d..f29b4934f0e 100644 --- a/js/js.libraries/src/generated/org.w3c.dom.url.kt +++ b/js/js.libraries/src/generated/org.w3c.dom.url.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.dom.url import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.fetch.kt b/js/js.libraries/src/generated/org.w3c.fetch.kt index e2b46de6c62..89a17f0e18f 100644 --- a/js/js.libraries/src/generated/org.w3c.fetch.kt +++ b/js/js.libraries/src/generated/org.w3c.fetch.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.fetch import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.files.kt b/js/js.libraries/src/generated/org.w3c.files.kt index d89aa39d4ea..583d9e0dc92 100644 --- a/js/js.libraries/src/generated/org.w3c.files.kt +++ b/js/js.libraries/src/generated/org.w3c.files.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.files import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.notifications.kt b/js/js.libraries/src/generated/org.w3c.notifications.kt index 714b8a0c54c..e68330992b6 100644 --- a/js/js.libraries/src/generated/org.w3c.notifications.kt +++ b/js/js.libraries/src/generated/org.w3c.notifications.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.notifications import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.performance.kt b/js/js.libraries/src/generated/org.w3c.performance.kt index fd4d77f97c0..71312a68e06 100644 --- a/js/js.libraries/src/generated/org.w3c.performance.kt +++ b/js/js.libraries/src/generated/org.w3c.performance.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.performance import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.workers.kt b/js/js.libraries/src/generated/org.w3c.workers.kt index 66ddeeb3c4f..ac415793f87 100644 --- a/js/js.libraries/src/generated/org.w3c.workers.kt +++ b/js/js.libraries/src/generated/org.w3c.workers.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.workers import kotlin.js.* diff --git a/js/js.libraries/src/generated/org.w3c.xhr.kt b/js/js.libraries/src/generated/org.w3c.xhr.kt index 6933e016d72..ea2c6637143 100644 --- a/js/js.libraries/src/generated/org.w3c.xhr.kt +++ b/js/js.libraries/src/generated/org.w3c.xhr.kt @@ -5,6 +5,7 @@ * See libraries/tools/idl2k for details */ +@file:Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") package org.w3c.xhr import kotlin.js.* diff --git a/js/js.translator/testData/box/native/nestedElements.kt b/js/js.translator/testData/box/native/nestedElements.kt index 0d9ed808777..60970b62cd1 100644 --- a/js/js.translator/testData/box/native/nestedElements.kt +++ b/js/js.translator/testData/box/native/nestedElements.kt @@ -21,10 +21,6 @@ fun box(): String { assertEquals("Object.Class.b", Object.Class.b) assertEquals(142, Object.Class.test()) - assertEquals("Object.Trait.a", Object.Trait.a) - assertEquals("Object.Trait.b", Object.Trait.b) - assertEquals(324, Object.Trait.test()) - assertEquals("Object.a.a", Object.a.a) assertEquals("Object.a.b", Object.a.b) assertEquals(34, Object.a.test()) @@ -44,39 +40,12 @@ fun box(): String { assertEquals("Class.Class.b", Class.Class.b) assertEquals(88, Class.Class.test()) - assertEquals("Class.Trait.a", Class.Trait.a) - assertEquals("Class.Trait.b", Class.Trait.b) - assertEquals(55, Class.Trait.test()) - assertEquals("Class.a.a", Class.a.a) assertEquals("Class.a.b", Class.a.b) assertEquals(22, Class.a.test()) assertEquals("Class.b", Class.b) assertEquals(77, Class.test()) - // in trait - - assertEquals("Trait.Object.a", Trait.Object.a) - assertEquals("Trait.Object.b", Trait.Object.b) - assertEquals(90, Trait.Object.test()) - - assertEquals("Trait.Class().a", Trait.Class("Trait.Class().a").a) - assertEquals("Trait.Class().b", Trait.Class("something").b) - assertEquals(66, Trait.Class("something").test()) - assertEquals("Trait.Class.a", Trait.Class.a) - assertEquals("Trait.Class.b", Trait.Class.b) - assertEquals(88, Trait.Class.test()) - - assertEquals("Trait.Trait.a", Trait.Trait.a) - assertEquals("Trait.Trait.b", Trait.Trait.b) - assertEquals(55, Trait.Trait.test()) - - assertEquals("Trait.a.a", Trait.a.a) - assertEquals("Trait.a.b", Trait.a.b) - assertEquals(22, Trait.a.test()) - assertEquals("Trait.b", Trait.b) - assertEquals(277, Trait.test()) - return "OK"; } @@ -116,12 +85,6 @@ external object Object { val a: String var b: String fun test(): Int - - companion object { - val a: String = definedExternally - var b: String = definedExternally - fun test(): Int = definedExternally - } } val a: Trait = definedExternally @@ -153,12 +116,6 @@ external class Class { val a: String var b: String fun test(): Int - - companion object { - val a: String = definedExternally - var b: String = definedExternally - fun test(): Int = definedExternally - } } companion object { @@ -168,43 +125,3 @@ external class Class { fun test(): Int = definedExternally } } - -external interface Trait { - @JsName("SomeObject") - object Object { - val a: String = definedExternally - var b: String = definedExternally - fun test(): Int = definedExternally - } - - class Class(a: String) { - val a: String - var b: String = definedExternally - fun test(): Int = definedExternally - - companion object { - val a: String = definedExternally - var b: String = definedExternally - fun test(): Int = definedExternally - } - } - - @JsName("SomeTrait") - interface Trait { - val a: String - var b: String - fun test(): Int - - companion object { - val a: String = definedExternally - var b: String = definedExternally - fun test(): Int = definedExternally - } - } - - companion object { - val a: Trait = definedExternally - var b: String = definedExternally - fun test(): Int = definedExternally - } -} diff --git a/libraries/tools/idl2k/src/main/kotlin/main.kt b/libraries/tools/idl2k/src/main/kotlin/main.kt index 8efe9f4b98b..e4ec940856b 100644 --- a/libraries/tools/idl2k/src/main/kotlin/main.kt +++ b/libraries/tools/idl2k/src/main/kotlin/main.kt @@ -58,6 +58,7 @@ fun main(args: Array) { w.appendln(" */") w.appendln() + w.appendln("@file:Suppress(\"NESTED_CLASS_IN_EXTERNAL_INTERFACE\")") w.appendln("package $pkg") w.appendln()