diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java b/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java index 34d17bc7b94..98f1b3940e6 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/CompilerVersion.java @@ -22,5 +22,5 @@ package org.jetbrains.jet.cli.common; public class CompilerVersion { // The value of this constant is generated by the build script // DON'T MODIFY IT - public static final String VERSION = "snapshot"; + public static final String VERSION = "@snapshot@"; } diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java index 4940a792401..bdb857fdc33 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/K2JSCompiler.java @@ -137,6 +137,11 @@ public final class K2JSCompiler implements TranslatingCompiler { ArrayList args = Lists.newArrayList("-tags", "-verbose", "-version"); addPathToSourcesDir(args, srcDir); addOutputPath(outFile, args); + addLibLocationAndTarget(project, args); + return ArrayUtil.toStringArray(args); + } + + private static void addLibLocationAndTarget(@NotNull Project project, @NotNull ArrayList args) { Pair data = JsModuleDetector.getLibLocationAndTargetForProject(project); if (data.first != null) { args.add("-libzip"); @@ -146,7 +151,6 @@ public final class K2JSCompiler implements TranslatingCompiler { args.add("-target"); args.add(data.second); } - return ArrayUtil.toStringArray(args); } private static void addPathToSourcesDir(@NotNull ArrayList args, @NotNull VirtualFile srcDir) { 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 a1b50867982..71e855a39fb 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 @@ -45,14 +45,14 @@ import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.*; public final class StaticContext { public static StaticContext generateStaticContext(@NotNull JetStandardLibrary library, - @NotNull BindingContext bindingContext, Translation.EcmaVersion ecmaVersion) { + @NotNull BindingContext bindingContext, + @NotNull Translation.EcmaVersion ecmaVersion) { JsProgram program = new JsProgram("main"); JsRootScope jsRootScope = program.getRootScope(); Namer namer = Namer.newInstance(jsRootScope); NamingScope scope = NamingScope.rootScope(jsRootScope); Intrinsics intrinsics = Intrinsics.standardLibraryIntrinsics(library); - StandardClasses standardClasses = - StandardClasses.bindImplementations(namer.getKotlinScope()); + StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope()); return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, scope, ecmaVersion); } @@ -170,7 +170,7 @@ public final class StaticContext { if (!(descriptor instanceof NamespaceDescriptor)) { return null; } - String nameForNamespace = getNameForNamespace((NamespaceDescriptor)descriptor); + String nameForNamespace = getNameForNamespace((NamespaceDescriptor) descriptor); return getRootScope().declareUnobfuscatableName(nameForNamespace); } }; @@ -200,7 +200,7 @@ public final class StaticContext { return null; } boolean isGetter = descriptor instanceof PropertyGetterDescriptor; - String propertyName = ((PropertyAccessorDescriptor)descriptor).getCorrespondingProperty().getName(); + String propertyName = ((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty().getName(); String accessorName = Namer.getNameForAccessor(propertyName, isGetter); NamingScope enclosingScope = getEnclosingScope(descriptor); return enclosingScope.declareObfuscatableName(accessorName); @@ -228,12 +228,13 @@ public final class StaticContext { return null; } + //TODO: move somewhere NamingScope enclosingScope = getEnclosingScope(descriptor); if (isEcma5()) { String name = descriptor.getName(); PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; if (!isDefaultAccessor(propertyDescriptor.getGetter()) || !isDefaultAccessor(propertyDescriptor.getSetter())) { - // _ is more preferable than $ — should be discussed later + // _ is more preferable than $ — should be discussed later name = '_' + name; } @@ -258,7 +259,7 @@ public final class StaticContext { if (!descriptor.getName().equals("toString")) { return null; } - if (((FunctionDescriptor)descriptor).getValueParameters().isEmpty()) { + if (((FunctionDescriptor) descriptor).getValueParameters().isEmpty()) { return getEnclosingScope(descriptor).declareUnobfuscatableName("toString"); } return null; @@ -272,7 +273,7 @@ public final class StaticContext { if (!(descriptor instanceof FunctionDescriptor)) { return null; } - FunctionDescriptor overriddenDescriptor = getOverriddenDescriptor((FunctionDescriptor)descriptor); + FunctionDescriptor overriddenDescriptor = getOverriddenDescriptor((FunctionDescriptor) descriptor); if (overriddenDescriptor == null) { return null; } @@ -307,7 +308,7 @@ public final class StaticContext { if (!(descriptor instanceof ClassDescriptor)) { return null; } - if (getSuperclass((ClassDescriptor)descriptor) == null) { + if (getSuperclass((ClassDescriptor) descriptor) == null) { return getRootScope().innerScope("Scope for class " + descriptor.getName()); } return null; @@ -319,7 +320,7 @@ public final class StaticContext { if (!(descriptor instanceof ClassDescriptor)) { return null; } - ClassDescriptor superclass = getSuperclass((ClassDescriptor)descriptor); + ClassDescriptor superclass = getSuperclass((ClassDescriptor) descriptor); if (superclass == null) { return null; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index a477c0deaea..1aeeeecaaba 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -27,8 +27,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.facade.exceptions.MainFunctionNotFoundException; -import org.jetbrains.k2js.facade.exceptions.TranslationInternalException; import org.jetbrains.k2js.facade.exceptions.TranslationException; +import org.jetbrains.k2js.facade.exceptions.TranslationInternalException; import org.jetbrains.k2js.facade.exceptions.UnsupportedFeatureException; import org.jetbrains.k2js.translate.context.StaticContext; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -58,7 +58,7 @@ import static org.jetbrains.k2js.translate.utils.dangerous.DangerousData.collect * @author Pavel Talanov *

* This class provides a interface which all translators use to interact with each other. - * Goal is to simlify interaction between translators. + * Goal is to simplify interaction between translators. */ public final class Translation { public enum EcmaVersion { @@ -145,7 +145,9 @@ public final class Translation { @NotNull public static JsProgram generateAst(@NotNull BindingContext bindingContext, - @NotNull List files, @NotNull MainCallParameters mainCallParameters, EcmaVersion ecmaVersion) throws TranslationException { + @NotNull List files, @NotNull MainCallParameters mainCallParameters, + @NotNull EcmaVersion ecmaVersion) + throws TranslationException { try { return doGenerateAst(bindingContext, files, mainCallParameters, ecmaVersion); } @@ -159,7 +161,8 @@ public final class Translation { @NotNull private static JsProgram doGenerateAst(@NotNull BindingContext bindingContext, @NotNull List files, - @NotNull MainCallParameters mainCallParameters, EcmaVersion ecmaVersion) throws MainFunctionNotFoundException { + @NotNull MainCallParameters mainCallParameters, + @NotNull EcmaVersion ecmaVersion) throws MainFunctionNotFoundException { //TODO: move some of the code somewhere JetStandardLibrary standardLibrary = JetStandardLibrary.getInstance(); StaticContext staticContext = StaticContext.generateStaticContext(standardLibrary, bindingContext, ecmaVersion); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java index c2ef7b08644..4786f384376 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java @@ -48,7 +48,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { private final JetClassOrObject classDeclaration; @NotNull private final List initializerStatements = new ArrayList(); - + @NotNull private final JsObjectLiteral propertiesDefinition = new JsObjectLiteral(); public ClassInitializerTranslator(@NotNull JetClassOrObject classDeclaration, @NotNull TranslationContext context) { @@ -135,13 +135,17 @@ public final class ClassInitializerTranslator extends AbstractTranslator { if (propertyDescriptor == null) { return; } + JsNameRef initialValueForProperty = jsParameter.getName().makeRef(); + addInitializerOrPropertyDefinition(initialValueForProperty, propertyDescriptor); + } - final JsNameRef nameRef = jsParameter.getName().makeRef(); + private void addInitializerOrPropertyDefinition(@NotNull JsNameRef initialValue, @NotNull PropertyDescriptor propertyDescriptor) { if (context().isEcma5()) { - propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, context(), nameRef)); + propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, initialValue, context())); } else { - JsStatement assignmentToBackingFieldExpression = assignmentToBackingField(context(), propertyDescriptor, nameRef).makeStmt(); + JsStatement assignmentToBackingFieldExpression = + assignmentToBackingField(context(), propertyDescriptor, initialValue).makeStmt(); initializerStatements.add(assignmentToBackingFieldExpression); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma3InitializerVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma3InitializerVisitor.java new file mode 100644 index 00000000000..7645f4943fe --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma3InitializerVisitor.java @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2012 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.k2js.translate.initializer; + +import com.google.dart.compiler.backend.js.ast.JsExpression; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; +import org.jetbrains.k2js.translate.context.TranslationContext; + +import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; + +/** + * @author Pavel Talanov + */ +public final class Ecma3InitializerVisitor extends InitializerVisitor { + @Override + @Nullable + protected JsExpression generateInitializerForProperty(@NotNull PropertyDescriptor propertyDescriptor, + @NotNull JsExpression value, @NotNull TranslationContext context) { + return assignmentToBackingField(context, propertyDescriptor, value); + } +} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma5InitializerVisitor.java similarity index 69% rename from js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java rename to js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma5InitializerVisitor.java index 106a82eccf7..3378f81baf8 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerEcma5Visitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/Ecma5InitializerVisitor.java @@ -19,6 +19,7 @@ package org.jetbrains.k2js.translate.initializer; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsObjectLiteral; import com.google.dart.compiler.backend.js.ast.JsStatement; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.JetDeclaration; @@ -27,27 +28,26 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.List; -final class InitializerEcma5Visitor extends InitializerVisitor { +public final class Ecma5InitializerVisitor extends InitializerVisitor { + @NotNull private final JsObjectLiteral propertiesDefinition = new JsObjectLiteral(); - @Nullable @Override - protected JsExpression defineMember(TranslationContext context, PropertyDescriptor propertyDescriptor, JsExpression value) { - propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, context, value)); + @Nullable + protected JsExpression generateInitializerForProperty(@NotNull PropertyDescriptor propertyDescriptor, + @NotNull JsExpression value, @NotNull TranslationContext context) { + propertiesDefinition.getPropertyInitializers().add(JsAstUtils.propertyDescriptor(propertyDescriptor, value, context)); return null; } + @NotNull @Override - protected List createStatements(List declarations, TranslationContext context) { - List statements = super.createStatements(declarations, context); + protected List generateInitializerStatements(@NotNull List declarations, + @NotNull TranslationContext context) { + List statements = super.generateInitializerStatements(declarations, context); if (!propertiesDefinition.getPropertyInitializers().isEmpty()) { JsStatement statement = JsAstUtils.defineProperties(propertiesDefinition); - if (statements.isEmpty()) { - statements.add(statement); - } - else { - statements.add(0, statement); - } + statements.add(0, statement); } return statements; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java index 94b4b88293d..302802d84d2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java @@ -16,7 +16,10 @@ package org.jetbrains.k2js.translate.initializer; -import com.google.dart.compiler.backend.js.ast.*; +import com.google.common.collect.Lists; +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.JsStatement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; @@ -26,25 +29,22 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.declaration.ClassTranslator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslatorVisitor; +import org.jetbrains.k2js.translate.utils.JsAstUtils; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.general.Translation.translateAsStatement; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getDeclarationsForNamespace; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptorForObjectDeclaration; +import static org.jetbrains.k2js.translate.utils.BindingUtils.*; import static org.jetbrains.k2js.translate.utils.PsiUtils.getObjectDeclarationForName; -import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; /** * @author Pavel Talanov */ -class InitializerVisitor extends TranslatorVisitor> { +public abstract class InitializerVisitor extends TranslatorVisitor> { static InitializerVisitor create(TranslationContext context) { - return context.isEcma5() ? new InitializerEcma5Visitor() : new InitializerVisitor(); + return context.isEcma5() ? new Ecma5InitializerVisitor() : new Ecma3InitializerVisitor(); } @Override @@ -54,19 +54,21 @@ class InitializerVisitor extends TranslatorVisitor> { if (initializer == null) { return Collections.emptyList(); } - return toStatements(defineMember(context, getPropertyDescriptor(context.bindingContext(), property), - Translation.translateAsExpression(initializer, context))); + JsExpression initalizerForProperty = generateInitializerForProperty(getPropertyDescriptor(context.bindingContext(), property), + Translation.translateAsExpression(initializer, context), + context); + return JsAstUtils.nullableExpressionToStatementList(initalizerForProperty); } + //TODO: should return JsStatement? @Nullable - protected JsExpression defineMember(TranslationContext context, PropertyDescriptor propertyDescriptor, JsExpression value) { - return assignmentToBackingField(context, propertyDescriptor, value); - } + protected abstract JsExpression generateInitializerForProperty(@NotNull PropertyDescriptor descriptor, + @NotNull JsExpression expression, @NotNull TranslationContext context); @Override @NotNull public List visitAnonymousInitializer(@NotNull JetClassInitializer initializer, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { return Arrays.asList(translateAsStatement(initializer.getBody(), context)); } @@ -84,19 +86,14 @@ class InitializerVisitor extends TranslatorVisitor> { PropertyDescriptor propertyDescriptor = getPropertyDescriptorForObjectDeclaration(context.bindingContext(), objectName); JetObjectDeclaration objectDeclaration = getObjectDeclarationForName(objectName); JsInvocation objectValue = ClassTranslator.generateClassCreationExpression(objectDeclaration, context); - return toStatements(defineMember(context, propertyDescriptor, objectValue)); + JsExpression initializerForProperty = generateInitializerForProperty(propertyDescriptor, objectValue, context); + return JsAstUtils.nullableExpressionToStatementList(initializerForProperty); } - private static List toStatements(@Nullable JsExpression expression) { - return expression == null ? Collections.emptyList() : Collections.singletonList(expression.makeStmt()); - } - - protected List createStatements(List declarations, TranslationContext context) { - if (declarations.isEmpty()) { - return Collections.emptyList(); - } - - List statements = new ArrayList(declarations.size()); + @NotNull + protected List generateInitializerStatements(@NotNull List declarations, + @NotNull TranslationContext context) { + List statements = Lists.newArrayList(); for (JetDeclaration declaration : declarations) { statements.addAll(declaration.accept(this, context)); } @@ -105,11 +102,11 @@ class InitializerVisitor extends TranslatorVisitor> { @NotNull public final List traverseClass(@NotNull JetClassOrObject expression, @NotNull TranslationContext context) { - return createStatements(expression.getDeclarations(), context); + return generateInitializerStatements(expression.getDeclarations(), context); } @NotNull public final List traverseNamespace(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) { - return createStatements(getDeclarationsForNamespace(context.bindingContext(), namespace), context); + return generateInitializerStatements(getDeclarationsForNamespace(context.bindingContext(), namespace), context); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 798353c74de..c5f58227b2f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -232,26 +232,43 @@ public final class CallTranslator extends AbstractTranslator { @NotNull @Override public JsExpression construct(@Nullable JsExpression receiver) { - JsExpression callee = callParameters.getFunctionReference(); - if (receiver != null) { - setQualifier(callee, receiver); + JsExpression qualifiedCallee = getQualifiedCallee(receiver); + + if (isEcma5PropertyAccess()) { + return ecma5PropertyAccess(qualifiedCallee); } - if (context().isEcma5()) { - if (descriptor instanceof PropertyGetterDescriptor) { - return callee; - } - else if (descriptor instanceof PropertySetterDescriptor) { - assert arguments.size() == 1; - return assignment(callee, arguments.get(0)); - } - } - - return newInvocation(callee, arguments); + return newInvocation(qualifiedCallee, arguments); } }, context()); } + @NotNull + private JsExpression ecma5PropertyAccess(@NotNull JsExpression callee) { + if (descriptor instanceof PropertyGetterDescriptor) { + assert arguments.isEmpty(); + return callee; + } + else { + assert descriptor instanceof PropertySetterDescriptor; + assert arguments.size() == 1; + return assignment(callee, arguments.get(0)); + } + } + + private boolean isEcma5PropertyAccess() { + return context().isEcma5() && descriptor instanceof PropertyAccessorDescriptor; + } + + @NotNull + private JsExpression getQualifiedCallee(@Nullable JsExpression receiver) { + JsExpression callee = callParameters.getFunctionReference(); + if (receiver != null) { + setQualifier(callee, receiver); + } + return callee; + } + @Nullable private JsExpression getThisObjectOrQualifier() { JsExpression thisObject = callParameters.getThisObject(); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index df7fedefdea..bf4e7d43830 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -38,13 +38,13 @@ public final class ReferenceTranslator { @NotNull public static JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { return getAccessTranslator(expression, context).translateAsGet(); } @NotNull public static JsExpression translateAsFQReference(@NotNull DeclarationDescriptor referencedDescriptor, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { JsExpression qualifier = context.getQualifierForDescriptor(referencedDescriptor); if (qualifier == null) { return translateAsLocalNameReference(referencedDescriptor, context); @@ -55,7 +55,16 @@ public final class ReferenceTranslator { @NotNull public static JsExpression translateAsLocalNameReference(@NotNull DeclarationDescriptor referencedDescriptor, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { + DeclarationDescriptor effectiveDescriptor = getReferencedDescriptor(referencedDescriptor, context); + return context.getNameForDescriptor(effectiveDescriptor).makeRef(); + } + + + //TODO: should not be doing this + @NotNull + private static DeclarationDescriptor getReferencedDescriptor(@NotNull DeclarationDescriptor referencedDescriptor, + @NotNull TranslationContext context) { DeclarationDescriptor effectiveDescriptor; if (context.isEcma5() && referencedDescriptor instanceof PropertyAccessorDescriptor) { effectiveDescriptor = ((PropertyAccessorDescriptor) referencedDescriptor).getCorrespondingProperty(); @@ -63,19 +72,19 @@ public final class ReferenceTranslator { else { effectiveDescriptor = referencedDescriptor; } - return context.getNameForDescriptor(effectiveDescriptor).makeRef(); + return effectiveDescriptor; } @NotNull public static AccessTranslator getAccessTranslator(@NotNull JetSimpleNameExpression referenceExpression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { return getAccessTranslator(referenceExpression, null, context); } @NotNull public static AccessTranslator getAccessTranslator(@NotNull JetSimpleNameExpression referenceExpression, - @Nullable JsExpression receiver, - @NotNull TranslationContext context) { + @Nullable JsExpression receiver, + @NotNull TranslationContext context) { if (isBackingFieldReference(referenceExpression)) { return BackingFieldAccessTranslator.newInstance(referenceExpression, context); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java index 2e31f258059..fe59022b93c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -18,9 +18,9 @@ package org.jetbrains.k2js.translate.utils; import com.google.common.collect.Lists; import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.k2js.translate.context.TranslationContext; @@ -31,14 +31,14 @@ import java.util.*; */ public final class JsAstUtils { private static final JsNameRef VALUE = new JsNameRef("value"); - private static final JsPropertyInitializer WRITABLE = new JsPropertyInitializer(new JsNameRef("writable"), null) ; + private static final JsPropertyInitializer WRITABLE = new JsPropertyInitializer(new JsNameRef("writable"), null); private static final JsNameRef DEFINE_PROPERTIES = new JsNameRef("defineProperties"); private static final JsNameRef CREATE = new JsNameRef("create"); static { - JsNameRef nameRef = new JsNameRef("Object"); - DEFINE_PROPERTIES.setQualifier(nameRef); - CREATE.setQualifier(nameRef); + JsNameRef globalObjectReference = new JsNameRef("Object"); + DEFINE_PROPERTIES.setQualifier(globalObjectReference); + CREATE.setQualifier(globalObjectReference); } private JsAstUtils() { @@ -287,36 +287,36 @@ public final class JsAstUtils { } @NotNull - public static JsStatement defineProperties(JsObjectLiteral propertiesDefinition) { - JsInvocation invoke = new JsInvocation(); - invoke.setQualifier(DEFINE_PROPERTIES); - invoke.getArguments().add(new JsThisRef()); - invoke.getArguments().add(propertiesDefinition); - return invoke.makeStmt(); + public static JsStatement defineProperties(@NotNull JsObjectLiteral propertiesDefinition) { + return AstUtil.newInvocation(DEFINE_PROPERTIES, new JsThisRef(), propertiesDefinition).makeStmt(); } @NotNull - public static JsPropertyInitializer propertyDescriptor(PropertyDescriptor ktDescriptor, - TranslationContext context, - JsExpression value) { - return propertyDescriptor(ktDescriptor, context, value, ktDescriptor.isVar()); - } - - @NotNull - public static JsPropertyInitializer propertyDescriptor(DeclarationDescriptor ktDescriptor, - TranslationContext context, - JsExpression value, - boolean writable) { - JsObjectLiteral descriptor = new JsObjectLiteral(); - List meta = descriptor.getPropertyInitializers(); + public static JsPropertyInitializer propertyDescriptor(@NotNull PropertyDescriptor descriptor, + @NotNull JsExpression value, @NotNull TranslationContext context) { + JsObjectLiteral jsPropertyDescriptor = new JsObjectLiteral(); + List meta = jsPropertyDescriptor.getPropertyInitializers(); meta.add(new JsPropertyInitializer(VALUE, value)); - if (writable) { - if (WRITABLE.getValueExpr() == null) { - WRITABLE.setValueExpr(context.program().getTrueLiteral()); - } - meta.add(WRITABLE); + if (descriptor.isVar()) { + meta.add(getWritable(context)); } - // todo accessors - return new JsPropertyInitializer(context.getNameForDescriptor(ktDescriptor).makeRef(), descriptor); + // TODO: accessors + return new JsPropertyInitializer(context.getNameForDescriptor(descriptor).makeRef(), jsPropertyDescriptor); + } + + @NotNull + private static JsPropertyInitializer getWritable(@NotNull TranslationContext context) { + if (WRITABLE.getValueExpr() == null) { + WRITABLE.setValueExpr(context.program().getTrueLiteral()); + } + return WRITABLE; + } + + @NotNull + public static List nullableExpressionToStatementList(@Nullable JsExpression initalizerForProperty) { + if (initalizerForProperty == null) { + return Collections.emptyList(); + } + return Collections.singletonList(initalizerForProperty.makeStmt()); } }