Treat anonymous objects as classes (ClassKind.CLASS)

They're not objects per se, i.e. they're not singletons
This commit is contained in:
Alexander Udalov
2013-10-25 20:55:16 +04:00
parent 27f832a713
commit 18c59d5495
10 changed files with 78 additions and 78 deletions
@@ -19,12 +19,13 @@ package org.jetbrains.k2js.translate.context;
import com.google.dart.compiler.backend.js.ast.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.plugin.JetLanguage;
import java.util.List;
import static org.jetbrains.jet.lang.descriptors.ClassKind.TRAIT;
/**
* Encapuslates different types of constants and naming conventions.
@@ -267,19 +268,17 @@ public final class Namer {
}
@NotNull
public JsInvocation classCreateInvocation(@NotNull ClassDescriptor descriptor, @NotNull List<JsExpression> arguments) {
switch (descriptor.getKind()) {
case TRAIT:
return new JsInvocation(traitCreationMethodReference(), arguments);
case OBJECT:
case CLASS_OBJECT:
case ENUM_ENTRY:
return new JsInvocation(objectCreationMethodReference(), arguments);
default:
return new JsInvocation(classCreationMethodReference(), arguments);
public JsExpression classCreateInvocation(@NotNull ClassDescriptor descriptor) {
ClassKind kind = descriptor.getKind();
if (kind == TRAIT) {
return traitCreationMethodReference();
}
if (kind.isSingleton() || DescriptorUtils.isAnonymousObject(descriptor)) {
return objectCreationMethodReference();
}
return classCreationMethodReference();
}
@NotNull
@@ -37,8 +37,7 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassDescriptorForType;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassDescriptorForTypeConstructor;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
import static org.jetbrains.jet.lang.types.TypeUtils.topologicallySortSuperclassesAndRecordAllInstances;
import static org.jetbrains.k2js.translate.expression.LiteralFunctionTranslator.createPlace;
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.createClassObjectInitializer;
@@ -121,7 +120,7 @@ public final class ClassTranslator extends AbstractTranslator {
@NotNull
public JsInvocation translate(@NotNull TranslationContext declarationContext) {
return context().namer().classCreateInvocation(descriptor, getClassCreateInvocationArguments(declarationContext));
return new JsInvocation(context().namer().classCreateInvocation(descriptor), getClassCreateInvocationArguments(declarationContext));
}
private boolean isTrait() {
@@ -138,7 +137,7 @@ public final class ClassTranslator extends AbstractTranslator {
if (!isTopLevelDeclaration) {
qualifiedReference = null;
}
else if (descriptor.getKind().isSingleton()) {
else if (descriptor.getKind().isSingleton() || isAnonymousObject(descriptor)) {
qualifiedReference = null;
declarationContext.literalFunctionTranslator().setDefinitionPlace(
new NotNullLazyValue<Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression>>() {
@@ -19,7 +19,6 @@ package org.jetbrains.k2js.translate.utils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
@@ -29,8 +28,6 @@ import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getContaining
public final class AnnotationsUtils {
private static final String ENUMERABLE = "js.enumerable";
private AnnotationsUtils() {
}
@@ -108,16 +105,6 @@ public final class AnnotationsUtils {
return hasAnnotationOrInsideAnnotatedClass(descriptor, PredefinedAnnotation.NATIVE);
}
public static boolean isEnumerable(@NotNull DeclarationDescriptor descriptor) {
if (getAnnotationByName(descriptor, ENUMERABLE) != null) {
return true;
}
ClassDescriptor containingClass = getContainingClass(descriptor);
return containingClass != null &&
((containingClass.getKind().equals(ClassKind.OBJECT) && containingClass.getName().isSpecial()) ||
getAnnotationByName(containingClass, ENUMERABLE) != null);
}
public static boolean isLibraryObject(@NotNull DeclarationDescriptor descriptor) {
return hasAnnotationOrInsideAnnotatedClass(descriptor, PredefinedAnnotation.LIBRARY);
}