JS: refactor Dart AST

This commit is contained in:
Alexey Andreev
2016-10-19 18:36:20 +03:00
parent bec1e526a1
commit fd158a6922
19 changed files with 64 additions and 147 deletions
@@ -18,10 +18,12 @@ package org.jetbrains.kotlin.js.translate.callTranslator
import com.google.dart.compiler.backend.js.ast.JsExpression
import com.google.dart.compiler.backend.js.ast.JsName
import com.google.dart.compiler.backend.js.ast.metadata.HasMetadata
import com.google.dart.compiler.backend.js.ast.metadata.SideEffectKind
import com.google.dart.compiler.backend.js.ast.metadata.sideEffects
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator
@@ -84,7 +86,7 @@ fun VariableAccessInfo.constructAccessExpression(ref: JsExpression): JsExpressio
// This is useful when passing AST to TemporaryAssignmentElimination. It can bring
// property assignment like `obj.propertyName = $tmp` to places where `$tmp` gets its value,
// but only when it's sure that no side effects possible.
(ref as? HasMetadata)?.let { it.sideEffects = SideEffectKind.PURE }
ref.sideEffects = SideEffectKind.PURE
JsAstUtils.assignment(ref, value!!)
}
}
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.js.translate.context;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.backend.js.ast.metadata.HasMetadata;
import com.google.dart.compiler.backend.js.ast.metadata.MetadataProperties;
import com.google.dart.compiler.backend.js.ast.metadata.SideEffectKind;
import com.intellij.openapi.util.Factory;
@@ -619,13 +618,11 @@ public final class StaticContext {
}
private static JsExpression applySideEffects(JsExpression expression, DeclarationDescriptor descriptor) {
if (expression instanceof HasMetadata) {
if (descriptor instanceof FunctionDescriptor ||
descriptor instanceof PackageFragmentDescriptor ||
descriptor instanceof ClassDescriptor
) {
MetadataProperties.setSideEffects((HasMetadata) expression, SideEffectKind.PURE);
}
if (descriptor instanceof FunctionDescriptor ||
descriptor instanceof PackageFragmentDescriptor ||
descriptor instanceof ClassDescriptor
) {
MetadataProperties.setSideEffects(expression, SideEffectKind.PURE);
}
return expression;
}
@@ -20,7 +20,6 @@ import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsInvocation;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import com.google.dart.compiler.backend.js.ast.metadata.HasMetadata;
import com.google.dart.compiler.backend.js.ast.metadata.MetadataProperties;
import com.google.dart.compiler.backend.js.ast.metadata.SideEffectKind;
import org.jetbrains.annotations.NotNull;
@@ -28,13 +28,12 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext;
import org.jetbrains.kotlin.types.expressions.OperatorConventions;
import org.jetbrains.kotlin.util.OperatorNameConventions;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public final class JsAstUtils {
private static final JsNameRef DEFINE_PROPERTY = pureFqn("defineProperty", null);
public static final JsNameRef CREATE_OBJECT = pureFqn("create", null);
private static final JsNameRef CREATE_OBJECT = pureFqn("create", null);
private static final JsNameRef VALUE = new JsNameRef("value");
private static final JsPropertyInitializer WRITABLE = new JsPropertyInitializer(pureFqn("writable", null), JsLiteral.TRUE);
@@ -205,11 +204,6 @@ public final class JsAstUtils {
return invokeMethod(Namer.kotlinLong(), Namer.LONG_FROM_NUMBER, expression);
}
@NotNull
public static JsExpression equalsForObject(@NotNull JsExpression left, @NotNull JsExpression right) {
return invokeMethod(left, Namer.EQUALS_METHOD_NAME, right);
}
@NotNull
public static JsExpression compareForObject(@NotNull JsExpression left, @NotNull JsExpression right) {
return invokeMethod(left, Namer.COMPARE_TO_METHOD_NAME, right);
@@ -267,7 +261,7 @@ public final class JsAstUtils {
return new JsBinaryOperation(JsBinaryOperator.OR, op1, op2);
}
public static void setQualifier(@NotNull JsExpression selector, @Nullable JsExpression receiver) {
private static void setQualifier(@NotNull JsExpression selector, @Nullable JsExpression receiver) {
assert (selector instanceof JsInvocation || selector instanceof JsNameRef);
if (selector instanceof JsInvocation) {
setQualifier(((JsInvocation) selector).getQualifier(), receiver);
@@ -398,16 +392,6 @@ public final class JsAstUtils {
return new JsVars(new JsVars.JsVar(name, expr));
}
public static void setArguments(@NotNull HasArguments invocation, @NotNull List<JsExpression> newArgs) {
List<JsExpression> arguments = invocation.getArguments();
assert arguments.isEmpty() : "Arguments already set.";
arguments.addAll(newArgs);
}
public static void setArguments(@NotNull HasArguments invocation, JsExpression... arguments) {
setArguments(invocation, Arrays.asList(arguments));
}
public static void setParameters(@NotNull JsFunction function, @NotNull List<JsParameter> newParams) {
List<JsParameter> parameters = function.getParameters();
assert parameters.isEmpty() : "Arguments already set.";