diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt
index 96ccad4021a..a1215c4f7e7 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt
@@ -23,3 +23,5 @@ import org.jetbrains.kotlin.renderer.DescriptorRendererImpl
public fun
renderParameter(parameter: P, renderer: Renderer
?): Any = renderer?.render(parameter) ?: parameter
public fun ClassDescriptor.renderKindWithName(): String = "${DescriptorRendererImpl.getClassKindPrefix(this)} '${getName()}'"
+
+public fun ClassDescriptor.renderKind(): String = DescriptorRendererImpl.getClassKindPrefix(this)
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/localClassifier.kt b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/localClassifier.kt
new file mode 100644
index 00000000000..4b421b320df
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/localClassifier.kt
@@ -0,0 +1,12 @@
+// !DIAGNOSTICS: -UNUSED_VARIABLE
+
+fun foo() {
+ class A {
+ inner class E {
+ trait T
+ }
+ }
+
+ trait T {
+ }
+}
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/localClassifier.txt b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/localClassifier.txt
new file mode 100644
index 00000000000..093bfc34070
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/localClassifier.txt
@@ -0,0 +1,3 @@
+package
+
+internal fun foo(): kotlin.Unit
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/nestedInnerClassifier.kt b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/nestedInnerClassifier.kt
new file mode 100644
index 00000000000..a4e17120965
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/nestedInnerClassifier.kt
@@ -0,0 +1,95 @@
+class A {
+ class B {
+ class C
+
+ inner class D
+
+ trait T {
+ trait A
+ class B
+ }
+
+ companion object {}
+ }
+
+ inner class I
+
+ trait T {
+ trait A
+ class B
+
+ companion object {}
+ }
+
+ enum class E {
+ X Y
+
+ companion object {}
+ }
+
+ companion object {}
+}
+
+trait T {
+ class B {
+ class C
+
+ inner class D
+
+ trait T {
+ trait A
+ class B
+ }
+
+ companion object {}
+ }
+
+ trait T {
+ trait A
+ class B
+
+ companion object {}
+ }
+
+ enum class E {
+ X Y
+
+ companion object {}
+ }
+
+ companion object {}
+}
+
+enum class E {
+ X Y
+
+ class B {
+ class C
+
+ inner class D
+
+ trait T {
+ trait A
+ class B
+ }
+
+ companion object {}
+ }
+
+ inner class I
+
+ trait T {
+ trait A
+ class B
+
+ companion object {}
+ }
+
+ enum class E {
+ X Y
+
+ companion object {}
+ }
+
+ companion object {}
+}
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/nestedInnerClassifier.txt b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/nestedInnerClassifier.txt
new file mode 100644
index 00000000000..b26fe7edf68
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/nestedInnerClassifier.txt
@@ -0,0 +1,425 @@
+package
+
+internal final class A {
+ public constructor A()
+ 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
+
+ internal final class B {
+ public constructor B()
+ 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
+
+ internal 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
+ }
+
+ internal 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
+ }
+
+ internal final inner class D {
+ public constructor D()
+ 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
+ }
+
+ internal trait T {
+ 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
+
+ internal trait A {
+ 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
+ }
+
+ internal final class B {
+ public constructor B()
+ 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
+ }
+ }
+ }
+
+ internal 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
+ }
+
+ internal final enum class E : kotlin.Enum {
+ public enum entry X : A.E {
+ private constructor X()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: A.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ public enum entry Y : A.E {
+ private constructor Y()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: A.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ private constructor E()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: A.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+
+ internal 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
+ }
+
+ // Static members
+ public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): A.E
+ public final /*synthesized*/ fun values(): kotlin.Array
+ }
+
+ internal final inner class I {
+ public constructor 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
+ }
+
+ internal trait T {
+ 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
+
+ internal trait A {
+ 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
+ }
+
+ internal final class B {
+ public constructor B()
+ 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
+ }
+
+ internal 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
+ }
+ }
+}
+
+internal final enum class E : kotlin.Enum {
+ public enum entry X : E {
+ private constructor X()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: 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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ public enum entry Y : E {
+ private constructor Y()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: 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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ private constructor E()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: 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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+
+ internal final class B {
+ public constructor B()
+ 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
+
+ internal 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
+ }
+
+ internal 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
+ }
+
+ internal final inner class D {
+ public constructor D()
+ 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
+ }
+
+ internal trait T {
+ 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
+
+ internal trait A {
+ 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
+ }
+
+ internal final class B {
+ public constructor B()
+ 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
+ }
+ }
+ }
+
+ internal 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
+ }
+
+ internal final enum class E : kotlin.Enum {
+ public enum entry X : E.E {
+ private constructor X()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ public enum entry Y : E.E {
+ private constructor Y()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ private constructor E()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+
+ internal 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
+ }
+
+ // Static members
+ public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): E.E
+ public final /*synthesized*/ fun values(): kotlin.Array
+ }
+
+ internal final inner class I {
+ public constructor 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
+ }
+
+ internal trait T {
+ 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
+
+ internal trait A {
+ 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
+ }
+
+ internal final class B {
+ public constructor B()
+ 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
+ }
+
+ internal 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
+ }
+ }
+
+ // Static members
+ public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): E
+ public final /*synthesized*/ fun values(): kotlin.Array
+}
+
+internal trait T {
+ 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
+
+ internal final class B {
+ public constructor B()
+ 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
+
+ internal 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
+ }
+
+ internal 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
+ }
+
+ internal final inner class D {
+ public constructor D()
+ 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
+ }
+
+ internal trait T {
+ 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
+
+ internal trait A {
+ 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
+ }
+
+ internal final class B {
+ public constructor B()
+ 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
+ }
+ }
+ }
+
+ internal 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
+ }
+
+ internal final enum class E : kotlin.Enum {
+ public enum entry X : T.E {
+ private constructor X()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: T.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ public enum entry Y : T.E {
+ private constructor Y()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: T.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+
+ private constructor E()
+ public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: T.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 final override /*1*/ /*fake_override*/ fun name(): kotlin.String
+ public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+
+ internal 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
+ }
+
+ // Static members
+ public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): T.E
+ public final /*synthesized*/ fun values(): kotlin.Array
+ }
+
+ internal trait T {
+ 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
+
+ internal trait A {
+ 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
+ }
+
+ internal final class B {
+ public constructor B()
+ 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
+ }
+
+ internal 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
+ }
+ }
+}
diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java
index e3b3994a106..b98547d8131 100644
--- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java
+++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java
@@ -34,6 +34,7 @@ import java.util.regex.Pattern;
JetDiagnosticsTestWithJsStdLibGenerated.DynamicTypes.class,
JetDiagnosticsTestWithJsStdLibGenerated.JsCode.class,
JetDiagnosticsTestWithJsStdLibGenerated.Native.class,
+ JetDiagnosticsTestWithJsStdLibGenerated.UnsupportedFeatures.class,
})
@RunWith(JUnit3RunnerWithInners.class)
public class JetDiagnosticsTestWithJsStdLibGenerated extends AbstractJetDiagnosticsTestWithJsStdLib {
@@ -551,4 +552,25 @@ public class JetDiagnosticsTestWithJsStdLibGenerated extends AbstractJetDiagnost
}
}
}
+
+ @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures")
+ @TestDataPath("$PROJECT_ROOT")
+ @RunWith(JUnit3RunnerWithInners.class)
+ public static class UnsupportedFeatures extends AbstractJetDiagnosticsTestWithJsStdLib {
+ public void testAllFilesPresentInUnsupportedFeatures() throws Exception {
+ JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures"), Pattern.compile("^(.+)\\.kt$"), true);
+ }
+
+ @TestMetadata("localClassifier.kt")
+ public void testLocalClassifier() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/localClassifier.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("nestedInnerClassifier.kt")
+ public void testNestedInnerClassifier() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/unsupportedFeatures/nestedInnerClassifier.kt");
+ doTest(fileName);
+ }
+ }
}
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/KotlinJsCheckerProvider.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/KotlinJsCheckerProvider.kt
index 03319b3b772..053f35f9167 100644
--- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/KotlinJsCheckerProvider.kt
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/KotlinJsCheckerProvider.kt
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallChecker
import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider
public object KotlinJsCheckerProvider : AdditionalCheckerProvider(
- additionalDeclarationCheckers = listOf(NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker()),
+ additionalDeclarationCheckers = listOf(NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker(), ClassDeclarationChecker()),
additionalCallCheckers = listOf(JsCallChecker()),
additionalTypeCheckers = listOf()
)
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 912f28ad40a..a51a400d28d 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
@@ -36,6 +36,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by Delegates.lazy {
put(ErrorsJs.JSCODE_ARGUMENT_SHOULD_BE_CONSTANT, "Argument must be string constant")
put(ErrorsJs.NOT_SUPPORTED, "Cannot translate (not supported yet): ''{0}''", RenderFirstLineOfElementText)
put(ErrorsJs.REFERENCE_TO_BUILTIN_MEMBERS_NOT_SUPPORTED, "Callable references for builtin members are not supported yet: ''{0}''", RenderFirstLineOfElementText)
+ put(ErrorsJs.NON_TOPLEVEL_CLASS_DECLARATION, "Non-toplevel {0} declarations not supported yet", Renderers.STRING)
this
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 70656874812..04f4441dba4 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
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.diagnostics.Errors;
import org.jetbrains.kotlin.psi.JetDeclaration;
import org.jetbrains.kotlin.psi.JetElement;
import org.jetbrains.kotlin.psi.JetExpression;
+import org.jetbrains.kotlin.psi.JetNamedDeclaration;
import org.jetbrains.kotlin.types.JetType;
import static org.jetbrains.kotlin.diagnostics.PositioningStrategies.*;
@@ -41,6 +42,7 @@ public interface ErrorsJs {
DiagnosticFactory0 JSCODE_ARGUMENT_SHOULD_BE_CONSTANT = DiagnosticFactory0.create(ERROR, DEFAULT);
DiagnosticFactory1 NOT_SUPPORTED = DiagnosticFactory1.create(ERROR, DEFAULT);
DiagnosticFactory1 REFERENCE_TO_BUILTIN_MEMBERS_NOT_SUPPORTED = DiagnosticFactory1.create(ERROR, DEFAULT);
+ DiagnosticFactory1 NON_TOPLEVEL_CLASS_DECLARATION = DiagnosticFactory1.create(ERROR, DECLARATION_NAME);
@SuppressWarnings("UnusedDeclaration")
Object _initializer = new Object() {
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/unsupportedFeatureCheckers.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/unsupportedFeatureCheckers.kt
new file mode 100644
index 00000000000..8ac9a876d8a
--- /dev/null
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/unsupportedFeatureCheckers.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jetbrains.kotlin.js.resolve
+
+import org.jetbrains.kotlin.descriptors.ClassDescriptor
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
+import org.jetbrains.kotlin.descriptors.Visibilities
+import org.jetbrains.kotlin.diagnostics.DiagnosticSink
+import org.jetbrains.kotlin.diagnostics.rendering.renderKind
+import org.jetbrains.kotlin.diagnostics.rendering.renderKindWithName
+import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs
+import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
+import org.jetbrains.kotlin.psi.*
+import org.jetbrains.kotlin.resolve.DeclarationChecker
+import org.jetbrains.kotlin.resolve.DescriptorUtils
+
+class ClassDeclarationChecker : DeclarationChecker {
+ override fun check(declaration: JetDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink) {
+
+ if (declaration !is JetClassOrObject || declaration is JetObjectDeclaration || declaration is JetEnumEntry) return
+
+ // hack to avoid to get diagnostics when compile kotlin builtins
+ val fqNameUnsafe = DescriptorUtils.getFqName(descriptor)
+ if (fqNameUnsafe.asString().startsWith("kotlin.")) return
+
+ if (!DescriptorUtils.isTopLevelDeclaration(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) {
+ diagnosticHolder.report(ErrorsJs.NON_TOPLEVEL_CLASS_DECLARATION.on(declaration, (descriptor as ClassDescriptor).renderKind()))
+ }
+ }
+}