From e9fe0070d743d3a43e39687ee9e3872edaa01da5 Mon Sep 17 00:00:00 2001 From: Erokhin Stanislav Date: Thu, 17 Oct 2013 16:32:47 +0400 Subject: [PATCH] JS backend: complete remove _c object from output code. --- .../k2js/translate/context/Namer.java | 6 - .../k2js/translate/context/StaticContext.java | 17 -- .../ClassDeclarationTranslator.java | 192 +----------------- .../NamespaceDeclarationTranslator.java | 3 +- 4 files changed, 6 insertions(+), 212 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java index 6fadb01c8ea..e8f0b9bca58 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java @@ -47,7 +47,6 @@ public final class Namer { private static final String SUPER_METHOD_NAME = "baseInitializer"; private static final String ROOT_NAMESPACE = "_"; private static final String RECEIVER_PARAMETER_NAME = "$receiver"; - private static final String CLASSES_OBJECT_NAME = "_c"; private static final String THROW_NPE_FUN_NAME = "throwNPE"; private static final String CLASS_OBJECT_GETTER = "object"; private static final String CLASS_OBJECT_INITIALIZER = "object_initializer$"; @@ -72,11 +71,6 @@ public final class Namer { return new JsNameRef(SUPER_METHOD_NAME, superClassJsName.makeRef()); } - @NotNull - public static String nameForClassesVariable() { - return CLASSES_OBJECT_NAME; - } - @NotNull public static String getNameForAccessor(@NotNull String propertyName, boolean isGetter, boolean useNativeAccessor) { if (useNativeAccessor) { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index 92dedd0fc59..86e2eca57b9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -170,23 +170,6 @@ public final class StaticContext { @NotNull public JsNameRef getQualifiedReference(@NotNull DeclarationDescriptor descriptor) { - ClassDescriptor classDescriptor; - if (descriptor instanceof ConstructorDescriptor) { - classDescriptor = ((ConstructorDescriptor) descriptor).getContainingDeclaration(); - } - else if (descriptor instanceof ClassDescriptor) { - classDescriptor = (ClassDescriptor) descriptor; - } - else { - classDescriptor = null; - } - - if (classDescriptor != null) { - JsNameRef reference = classDeclarationTranslator.getQualifiedReference((classDescriptor)); - if (reference != null) { - return reference; - } - } return new JsNameRef(getNameForDescriptor(descriptor), getQualifierForDescriptor(descriptor)); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java index 15514125405..e14426ec4ba 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java @@ -16,45 +16,24 @@ package org.jetbrains.k2js.translate.declaration; -import com.google.dart.compiler.backend.js.ast.*; -import com.intellij.util.SmartList; +import com.google.dart.compiler.backend.js.ast.JsExpression; +import com.google.dart.compiler.backend.js.ast.JsNameRef; +import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer; import gnu.trove.THashMap; -import gnu.trove.THashSet; import gnu.trove.TObjectObjectProcedure; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.Modality; -import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetClassOrObject; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.utils.DFS; -import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; -import java.util.Collection; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import static com.google.dart.compiler.backend.js.ast.JsVars.JsVar; -import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassDescriptorForType; import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor; /** * Generates a big block where are all the classes(objects representing them) are created. */ public final class ClassDeclarationTranslator extends AbstractTranslator { - private final THashSet nameClashGuard = new THashSet(); - - @NotNull - private final THashMap openClassDescriptorToItem = new THashMap(); - - private final LinkedList openList = new LinkedList(); - @NotNull - private final ClassDescriptorToLabel classDescriptorToLabel = new ClassDescriptorToLabel(); private final THashMap openClassDescriptorToQualifiedLabel = new THashMap(); @@ -74,123 +53,11 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { } }; - @NotNull - private final JsFunction dummyFunction; - - private final JsNameRef declarationsObjectRef; - private final JsVar classesVar; - public ClassDeclarationTranslator(@NotNull TranslationContext context) { super(context); - - dummyFunction = new JsFunction(context.scope()); - JsName declarationsObject = context().scope().declareName(Namer.nameForClassesVariable()); - classesVar = new JsVars.JsVar(declarationsObject); - declarationsObjectRef = declarationsObject.makeRef(); } - private final class ClassDescriptorToLabel implements ClassAliasingMap { - @Nullable - @Override - public JsNameRef get(ClassDescriptor descriptor, ClassDescriptor referencedDescriptor) { - OpenClassInfo item = openClassDescriptorToItem.get(descriptor); - // class declared in library - if (item == null) { - return null; - } - - return item.label; - } - } - - private static class OpenClassInfo { - private final ClassDescriptor descriptor; - private final JetClass declaration; - private final JsNameRef label; - private boolean referencedFromOpenClass = false; - - private OpenClassInfo(JetClass declaration, ClassDescriptor descriptor, JsNameRef label) { - this.descriptor = descriptor; - this.declaration = declaration; - this.label = label; - } - } - - @NotNull - public JsVars.JsVar getDeclaration() { - return classesVar; - } - - public void generateDeclarations() { - List vars = new SmartList(); - List propertyInitializers = new SmartList(); - - generateOpenClassDeclarations(vars, propertyInitializers); - fixUnresolvedClassReferences(); - - if (vars.isEmpty()) { - if (!propertyInitializers.isEmpty()) { - classesVar.setInitExpression(new JsObjectLiteral(propertyInitializers, true)); - } - return; - } - if (!vars.isEmpty() || !propertyInitializers.isEmpty()) { - throw new IllegalStateException(); // check, that all class generate as final class - } - - dummyFunction.setBody(new JsBlock(new JsVars(vars, true), new JsReturn(new JsObjectLiteral(propertyInitializers)))); - classesVar.setInitExpression(new JsInvocation(dummyFunction)); - } - - private void generateOpenClassDeclarations(@NotNull List vars, @NotNull List propertyInitializers) { - // first pass: set up list order - LinkedList sortedOpenClasses = - (LinkedList) DFS.topologicalOrder(openList, new DFS.Neighbors() { - @NotNull - @Override - public Iterable getNeighbors(OpenClassInfo current) { - LinkedList parents = new LinkedList(); - ClassDescriptor classDescriptor = getClassDescriptor(context().bindingContext(), current.declaration); - Collection superTypes = classDescriptor.getTypeConstructor().getSupertypes(); - - for (JetType type : superTypes) { - ClassDescriptor descriptor = getClassDescriptorForType(type); - OpenClassInfo item = openClassDescriptorToItem.get(descriptor); - if (item == null) { - continue; - } - - item.referencedFromOpenClass = true; - parents.add(item); - } - - return parents; - } - }); - - assert sortedOpenClasses.size() == openList.size(); - - // second pass: generate - Iterator it = sortedOpenClasses.descendingIterator(); - while (it.hasNext()) { - OpenClassInfo item = it.next(); - JsExpression translatedDeclaration = - new ClassTranslator(item.declaration, item.descriptor, classDescriptorToLabel, context()).translate(); - - JsExpression value; - if (item.referencedFromOpenClass) { - vars.add(new JsVar(item.label.getName(), translatedDeclaration)); - value = item.label; - } - else { - value = translatedDeclaration; - } - - propertyInitializers.add(new JsPropertyInitializer(item.label, value)); - } - } - - private void fixUnresolvedClassReferences() { + public void fixUnresolvedClassReferences() { openClassDescriptorToQualifiedLabel.forEachEntry(new TObjectObjectProcedure() { @Override public boolean execute(ClassDescriptor descriptor, JsNameRef ref) { @@ -204,59 +71,10 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { }); } - private String createNameForClass(ClassDescriptor descriptor) { - String suggestedName = descriptor.getName().asString(); - String name = suggestedName; - DeclarationDescriptor containing = descriptor; - while (!nameClashGuard.add(name)) { - containing = containing.getContainingDeclaration(); - assert containing != null; - name = suggestedName + '_' + containing.getName().asString(); - } - return name; - } - - @Nullable - public JsNameRef getQualifiedReference(ClassDescriptor descriptor) { - if (descriptor.getModality() != Modality.FINAL && false) { - //noinspection ConstantConditions - return classDescriptorToQualifiedLabel.get(descriptor, null); - } - return null; - } - @Nullable public JsPropertyInitializer translate(@NotNull JetClassOrObject declaration, TranslationContext context) { ClassDescriptor descriptor = getClassDescriptor(context().bindingContext(), declaration); - JsExpression value; - if (descriptor.getModality() == Modality.FINAL || true) { - value = new ClassTranslator(declaration, classDescriptorToQualifiedLabel, context).translate(); - } - else { - String label = createNameForClass(descriptor); - JsName name = dummyFunction.getScope().declareName(label); - JsNameRef qualifiedLabel = openClassDescriptorToQualifiedLabel.get(descriptor); - if (qualifiedLabel == null) { - qualifiedLabel = new JsNameRef(name); - openClassDescriptorToQualifiedLabel.put(descriptor, qualifiedLabel); - } - else { - qualifiedLabel.resolve(name); - } - qualifiedLabel.setQualifier(declarationsObjectRef); - - OpenClassInfo item = new OpenClassInfo((JetClass) declaration, descriptor, name.makeRef()); - - openList.add(item); - openClassDescriptorToItem.put(descriptor, item); - - value = qualifiedLabel; - - // not public api classes referenced to internal var _c - if (!descriptor.getVisibility().isPublicAPI()) { - return null; - } - } + JsExpression value = new ClassTranslator(declaration, classDescriptorToQualifiedLabel, context).translate(); return new JsPropertyInitializer(context.getNameForDescriptor(descriptor).makeRef(), value); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java index 7676ea11869..fab2aa5c9ae 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java @@ -72,13 +72,12 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator { return Collections.emptyList(); } - context().classDeclarationTranslator().generateDeclarations(); + context().classDeclarationTranslator().fixUnresolvedClassReferences(); for (NamespaceTranslator translator : descriptorToTranslator.values()) { translator.add(descriptorToDefineInvocation); } JsVars vars = new JsVars(true); - vars.addIfHasInitializer(context().classDeclarationTranslator().getDeclaration()); vars.addIfHasInitializer(getRootPackageDeclaration(descriptorToDefineInvocation.get(rootNamespaceDescriptor))); return Collections.singletonList(vars);