From 8537d327faca6ecc49bab646e0fe4a8a97d30782 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 12 Feb 2016 13:19:58 +0300 Subject: [PATCH] [KT-4124] Add diagnostic of a several cases of local classes like class in object in function. --- .../js/translate/context/TranslationContext.java | 11 +++++++++++ .../js/translate/declaration/ClassTranslator.kt | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index b42c5618095..23aa6534314 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -444,4 +444,15 @@ public class TranslationContext { assert descriptor != null : "Missing declaration descriptor: " + PsiUtilsKt.getTextWithLocation(expression); return descriptor; } + + public boolean hasEnclosingFunction() { + DeclarationDescriptor descriptor = declarationDescriptor; + while (descriptor != null) { + if (descriptor instanceof FunctionDescriptor) { + return true; + } + descriptor = descriptor.getContainingDeclaration(); + } + return false; + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index a3cefe32e56..93883cd3099 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.backend.common.bridges.generateBridgesForFunctionDes import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.js.descriptorUtils.hasPrimaryConstructor +import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator import org.jetbrains.kotlin.js.translate.context.DefinitionPlace import org.jetbrains.kotlin.js.translate.context.Namer @@ -47,6 +48,7 @@ import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtSecondaryConstructor import org.jetbrains.kotlin.resolve.BindingContextUtils +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.* import org.jetbrains.kotlin.types.CommonSupertypes.topologicallySortSuperclassesAndRecordAllInstances import org.jetbrains.kotlin.types.KotlinType @@ -77,6 +79,11 @@ class ClassTranslator private constructor( private fun isTrait(): Boolean = descriptor.kind == ClassKind.INTERFACE private fun getClassCreateInvocationArguments(declarationContext: TranslationContext): List { + if (!DescriptorUtils.isAnonymousObject(descriptor) && !DescriptorUtils.isObject(descriptor) && + declarationContext.hasEnclosingFunction()) { + declarationContext.bindingTrace().report(ErrorsJs.NOT_SUPPORTED.on(classDeclaration, classDeclaration)) + return emptyList() + } var context = declarationContext val invocationArguments = ArrayList()