diff --git a/js/src/com/google/dart/compiler/util/AstUtil.java b/js/src/com/google/dart/compiler/util/AstUtil.java index 2bc025b1c21..e8a9d57d18b 100644 --- a/js/src/com/google/dart/compiler/util/AstUtil.java +++ b/js/src/com/google/dart/compiler/util/AstUtil.java @@ -272,4 +272,8 @@ public class AstUtil { public static JsPrefixOperation negated(JsExpression expression) { return new JsPrefixOperation(JsUnaryOperator.NOT, expression); } + + public static JsStatement newAssignmentStatement(JsNameRef nameRef, JsExpression expr) { + return convertToStatement(new JsBinaryOperation(JsBinaryOperator.ASG, nameRef, expr)); + } } diff --git a/translator/src/org/jetbrains/k2js/translate/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/BindingUtils.java index 794cd6ecb28..6f8c61481d6 100644 --- a/translator/src/org/jetbrains/k2js/translate/BindingUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/BindingUtils.java @@ -61,13 +61,6 @@ public final class BindingUtils { return getDescriptorForExpression(context, declaration, PropertyDescriptor.class); } - @NotNull - static public String getPropertyNameForPropertyAccessor(@NotNull BindingContext context, - @NotNull JetPropertyAccessor accessor) { - PropertyAccessorDescriptor descriptor = getPropertyAccessorDescriptor(context, accessor); - return descriptor.getCorrespondingProperty().getName(); - } - @NotNull static public PropertySetterDescriptor getPropertySetterDescriptorForProperty(@NotNull BindingContext context, @NotNull JetProperty property) { diff --git a/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java b/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java index 750ac52aecc..57798ae81e9 100644 --- a/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java @@ -153,22 +153,4 @@ public final class ClassBodyVisitor extends TranslatorVisitor no additional actions are needed return new ArrayList(); } - -// @NotNull -// JsName getNameForGetter(@NotNull String propertyName, @NotNull TranslationContext context) { -// return getNameForAccessor(propertyName, true, context); -// } -// -// @NotNull -// JsName getNameForSetter(@NotNull String propertyName, @NotNull TranslationContext context) { -// return getNameForAccessor(propertyName, false, context); -// } -// -// @NotNull -// JsName getNameForAccessor(@NotNull String propertyName, boolean isGetter, -// @NotNull TranslationContext context) { -// return context.classScope().findExistingName(Namer.getNameForAccessor(propertyName, isGetter)); -// } - - } diff --git a/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java b/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java index 38c0987c336..44e6e51ec58 100644 --- a/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java @@ -50,8 +50,8 @@ public final class ClassTranslator extends AbstractTranslator { @NotNull private JsStatement classDeclarationStatement(@NotNull JetClass classDeclaration, @NotNull JsInvocation jsClassDeclaration) { - return AstUtil.convertToStatement(AstUtil.newAssignment - (namespaceQualifiedClassNameReference(classDeclaration), jsClassDeclaration)); + return AstUtil.newAssignmentStatement + (namespaceQualifiedClassNameReference(classDeclaration), jsClassDeclaration); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java index 95d597ee496..bb88309f447 100644 --- a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java @@ -61,7 +61,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull TranslationContext context) { JetExpression returnedExpression = jetReturnExpression.getReturnedExpression(); if (returnedExpression != null) { - JsExpression jsExpression = AstUtil.convertToExpression(returnedExpression.accept(this, context)); + JsExpression jsExpression = translateAsExpression(returnedExpression, context); return new JsReturn(jsExpression); } return new JsReturn(); @@ -166,12 +166,11 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull private JsExpression translateCallee(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { - JetExpression jetCallee = expression.getCalleeExpression(); - if (jetCallee == null) { + JetExpression callee = expression.getCalleeExpression(); + if (callee == null) { throw new AssertionError("Call expression with no callee encountered!"); } - JsNode jsCallee = jetCallee.accept(this, context); - return AstUtil.convertToExpression(jsCallee); + return translateAsExpression(callee, context); } @Override @@ -227,9 +226,9 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull private JsExpression translateConditionExpression(@Nullable JetExpression expression, @NotNull TranslationContext context) { - JsNode jsCondition = translateNullableExpression(expression, context); - if (jsCondition == context.program().getEmptyStmt()) { - throw new AssertionError("Empty condition clause!"); + JsExpression jsCondition = translateNullableExpression(expression, context); + if (jsCondition == null) { + throw new AssertionError("Empty condition!"); } return AstUtil.convertToExpression(jsCondition); } @@ -240,6 +239,10 @@ public final class ExpressionVisitor extends TranslatorVisitor { if (expression == null) { return null; } + return translateAsExpression(expression, context); + } + + private JsExpression translateAsExpression(JetExpression expression, TranslationContext context) { return AstUtil.convertToExpression(expression.accept(this, context)); } @@ -286,7 +289,6 @@ public final class ExpressionVisitor extends TranslatorVisitor { return null; } - //TODO method too long @Override @NotNull public JsNode visitDotQualifiedExpression(@NotNull JetDotQualifiedExpression expression, @@ -295,8 +297,8 @@ public final class ExpressionVisitor extends TranslatorVisitor { } @NotNull - private JsNode translateQualifiedExpression(@NotNull JetQualifiedExpression expression, - @NotNull TranslationContext context) { + private JsExpression translateQualifiedExpression(@NotNull JetQualifiedExpression expression, + @NotNull TranslationContext context) { JsInvocation getterCall = translateAsGetterCall(expression, context); if (getterCall != null) { return getterCall; @@ -311,8 +313,8 @@ public final class ExpressionVisitor extends TranslatorVisitor { } @NotNull - private JsNode translateAsQualifiedAccess(@NotNull JetQualifiedExpression expression, - @NotNull TranslationContext context) { + private JsExpression translateAsQualifiedAccess(@NotNull JetQualifiedExpression expression, + @NotNull TranslationContext context) { JsExpression receiver = translateReceiver(expression, context); JsExpression selector = translateSelector(expression, context); assert (selector instanceof JsNameRef || selector instanceof JsInvocation) @@ -329,23 +331,23 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull TranslationContext context) { JetExpression jetSelector = expression.getSelectorExpression(); assert jetSelector != null : "Selector should not be null in dot qualified expression."; - return AstUtil.convertToExpression(jetSelector.accept(this, context)); + return translateAsExpression(jetSelector, context); } @NotNull private JsExpression translateReceiver(@NotNull JetQualifiedExpression expression, @NotNull TranslationContext context) { - return AstUtil.convertToExpression(expression.getReceiverExpression().accept(this, context)); + return translateAsExpression(expression.getReceiverExpression(), context); } @NotNull - private JsNode translateAsQualifiedNameReference(@NotNull JsExpression receiver, @NotNull JsNameRef selector) { + private JsExpression translateAsQualifiedNameReference(@NotNull JsExpression receiver, @NotNull JsNameRef selector) { selector.setQualifier(receiver); return selector; } @NotNull - private JsNode translateAsQualifiedInvocation(@NotNull JsExpression receiver, @NotNull JsInvocation selector) { + private JsExpression translateAsQualifiedInvocation(@NotNull JsExpression receiver, @NotNull JsInvocation selector) { JsExpression qualifier = selector.getQualifier(); JsNameRef nameRef = (JsNameRef) qualifier; nameRef.setQualifier(receiver); @@ -382,7 +384,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { JsNullLiteral nullLiteral = context.program().getNullLiteral(); JsBinaryOperation nullCheck = new JsBinaryOperation (JsBinaryOperator.NEQ, receiver, nullLiteral); - JsExpression thenExpression = AstUtil.convertToExpression(translateQualifiedExpression(expression, context)); + JsExpression thenExpression = translateQualifiedExpression(expression, context); return new JsConditional(nullCheck, thenExpression, nullLiteral); } diff --git a/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java index ee513c04409..798f043dada 100644 --- a/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java @@ -28,8 +28,8 @@ public final class FunctionTranslator extends AbstractTranslator { public JsStatement translateAsFunction(@NotNull JetNamedFunction jetFunction) { JsName functionName = translationContext().namespaceScope().declareFreshName(jetFunction.getName()); JsFunction function = generateFunctionObject(jetFunction); - return AstUtil.convertToStatement(AstUtil.newAssignment - (translationContext().getNamespaceQualifiedReference(functionName), function)); + return AstUtil.newAssignmentStatement + (translationContext().getNamespaceQualifiedReference(functionName), function); } @NotNull @@ -55,12 +55,11 @@ public final class FunctionTranslator extends AbstractTranslator { JetExpression jetBodyExpression = jetFunction.getBodyExpression(); //TODO support them ffs assert jetBodyExpression != null : "Function without body not supported at the moment"; - JsNode body = Translation.expressionTranslator - (translationContext().newFunction(jetFunction)).translate(jetBodyExpression); + JsNode body = Translation.translateExpression(jetBodyExpression, translationContext().newFunction(jetFunction)); if (jetFunction.hasBlockBody()) { return AstUtil.convertToBlock(body); } - return AstUtil.convertToBlock(new JsReturn(AstUtil.convertToExpression((body)))); + return AstUtil.convertToBlock(new JsReturn(AstUtil.convertToExpression(body))); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java index b244dc5cec3..56bb69f26ab 100644 --- a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java @@ -121,8 +121,7 @@ public class InitializerVisitor extends TranslatorVisitor> { @NotNull private JsStatement translateInitializer(@NotNull JetProperty property, @NotNull TranslationContext context, @NotNull JetExpression initializer) { - JsExpression initExpression = AstUtil.convertToExpression(Translation.expressionTranslator(context) - .translate(initializer)); + JsExpression initExpression = Translation.translateAsExpression(initializer, context); return assignmentToBackingField(property, initExpression, context); } @@ -134,15 +133,14 @@ public class InitializerVisitor extends TranslatorVisitor> { JsName backingFieldName = getBackingFieldName(propertyName, context); JsNameRef backingFieldRef = backingFieldName.makeRef(); backingFieldRef.setQualifier(new JsThisRef()); - return AstUtil.convertToStatement(AstUtil.newAssignment(backingFieldRef, initExpression)); + return AstUtil.newAssignmentStatement(backingFieldRef, initExpression); } @Override @NotNull public List visitAnonymousInitializer(@NotNull JetClassInitializer initializer, @NotNull TranslationContext context) { - return Arrays.asList(AstUtil.convertToStatement - (Translation.expressionTranslator(context).translate(initializer.getBody()))); + return Arrays.asList(Translation.translateAsStatement(initializer.getBody(), context)); } @Override diff --git a/translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java b/translator/src/org/jetbrains/k2js/translate/NamespaceDeclarationTranslator.java similarity index 52% rename from translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java rename to translator/src/org/jetbrains/k2js/translate/NamespaceDeclarationTranslator.java index 620ca020498..4ef42250b6e 100644 --- a/translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/NamespaceDeclarationTranslator.java @@ -7,16 +7,16 @@ import org.jetbrains.jet.lang.psi.JetDeclaration; /** * @author Talanov Pavel */ -public final class DeclarationTranslator extends AbstractTranslator { +public final class NamespaceDeclarationTranslator extends AbstractTranslator { - private DeclarationVisitor visitor = new DeclarationVisitor(); + private NamespaceDeclarationVisitor visitor = new NamespaceDeclarationVisitor(); @NotNull - public static DeclarationTranslator newInstance(@NotNull TranslationContext context) { - return new DeclarationTranslator(context); + public static NamespaceDeclarationTranslator newInstance(@NotNull TranslationContext context) { + return new NamespaceDeclarationTranslator(context); } - private DeclarationTranslator(TranslationContext context) { + private NamespaceDeclarationTranslator(TranslationContext context) { super(context); } diff --git a/translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java b/translator/src/org/jetbrains/k2js/translate/NamespaceDeclarationVisitor.java similarity index 95% rename from translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java rename to translator/src/org/jetbrains/k2js/translate/NamespaceDeclarationVisitor.java index 2231ddf9a75..ee4dafc1451 100644 --- a/translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/NamespaceDeclarationVisitor.java @@ -14,7 +14,7 @@ import org.jetbrains.jet.lang.psi.JetProperty; * @author Talanov Pavel */ //TODO: rework the class -public class DeclarationVisitor extends TranslatorVisitor { +public class NamespaceDeclarationVisitor extends TranslatorVisitor { @NotNull @Override diff --git a/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java b/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java index d5f4606efea..511e3392928 100644 --- a/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java @@ -39,23 +39,24 @@ public final class NamespaceTranslator extends AbstractTranslator { JsFunction dummyFunction = JsFunction.getAnonymousFunctionWithScope (translationContext().getScopeForElement(namespace)); JsBlock namespaceDeclarations = translateDeclarations(namespace, newContext); - block.addStatement(AstUtil.convertToStatement(newNamespace(namespaceName, namespaceDeclarations, dummyFunction))); + JsInvocation namespaceExpression = newNamespace(namespaceName, namespaceDeclarations, dummyFunction); + block.addStatement(AstUtil.convertToStatement(namespaceExpression)); return block; } @NotNull private JsBlock translateDeclarations(@NotNull JetNamespace namespace, @NotNull TranslationContext newContext) { - DeclarationTranslator declarationTranslator = Translation.declarationTranslator(newContext); + NamespaceDeclarationTranslator namespaceDeclarationTranslator = Translation.declarationTranslator(newContext); JsBlock namespaceDeclarations = new JsBlock(); for (JetDeclaration declaration : namespace.getDeclarations()) { - namespaceDeclarations.addStatement(declarationTranslator.translateDeclaration(declaration)); + namespaceDeclarations.addStatement(namespaceDeclarationTranslator.translateDeclaration(declaration)); } return namespaceDeclarations; } @NotNull private JsStatement namespaceInitStatement(@NotNull JsName namespaceName) { - return AstUtil.convertToStatement(AstUtil.newAssignment(namespaceName.makeRef(), new JsObjectLiteral())); + return AstUtil.newAssignmentStatement(namespaceName.makeRef(), new JsObjectLiteral()); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java index 11420e841b4..b725ffbc856 100644 --- a/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java @@ -1,7 +1,6 @@ package org.jetbrains.k2js.translate; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,8 +41,7 @@ public final class OperationTranslator extends AbstractTranslator { private JsExpression translateBaseExpression(@NotNull JetUnaryExpression expression) { JetExpression baseExpression = expression.getBaseExpression(); assert baseExpression != null : "Unary operation should have a base expression"; - return AstUtil.convertToExpression - (Translation.translateExpression(baseExpression, translationContext())); + return Translation.translateAsExpression(baseExpression, translationContext()); } @NotNull @@ -63,6 +61,7 @@ public final class OperationTranslator extends AbstractTranslator { return translateAsBinaryOperation(expression); } + //TODO: think about the ways to improve logic here @Nullable public JsInvocation translateAsSetterCall(@NotNull JetBinaryExpression expression) { JetToken jetOperationToken = getOperationToken(expression); @@ -82,8 +81,7 @@ public final class OperationTranslator extends AbstractTranslator { @NotNull private JsExpression translateAsBinaryOperation(@NotNull JetBinaryExpression expression) { - JsExpression left = AstUtil.convertToExpression - (Translation.translateExpression(expression.getLeft(), translationContext())); + JsExpression left = Translation.translateAsExpression(expression.getLeft(), translationContext()); JsExpression right = translateRightExpression(expression); JetToken token = getOperationToken(expression); if (OperatorTable.hasCorrespondingBinaryOperator(token)) { @@ -101,8 +99,7 @@ public final class OperationTranslator extends AbstractTranslator { private JsExpression translateRightExpression(@NotNull JetBinaryExpression expression) { JetExpression rightExpression = expression.getRight(); assert rightExpression != null : "Binary expression should have a right expression"; - return AstUtil.convertToExpression - (Translation.translateExpression(rightExpression, translationContext())); + return Translation.translateAsExpression(rightExpression, translationContext()); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/OperatorTable.java b/translator/src/org/jetbrains/k2js/translate/OperatorTable.java index 9eaf94f97a2..90c2010255d 100644 --- a/translator/src/org/jetbrains/k2js/translate/OperatorTable.java +++ b/translator/src/org/jetbrains/k2js/translate/OperatorTable.java @@ -55,38 +55,34 @@ public final class OperatorTable { operatorToFunctionNameReference.put(JetTokens.IS_KEYWORD, Namer.isOperationReference()); } - @NotNull public static boolean hasCorrespondingBinaryOperator(@NotNull JetToken token) { return binaryOperatorsMap.containsKey(token); } - @NotNull static boolean hasCorrespondingFunctionInvocation(@NotNull JetToken token) { return operatorToFunctionNameReference.containsKey(token); } @NotNull - public static JsInvocation getCorrespondingFunctionInvocation(@NotNull JetToken token) { + static public JsInvocation getCorrespondingFunctionInvocation(@NotNull JetToken token) { JsNameRef functionReference = operatorToFunctionNameReference.get(token); assert functionReference != null : "Token should represent a function call!"; return AstUtil.newInvocation(functionReference); } @NotNull - public static JsBinaryOperator getBinaryOperator(@NotNull JetToken token) { + static public JsBinaryOperator getBinaryOperator(@NotNull JetToken token) { assert JetTokens.OPERATIONS.contains(token) : "Token should represent an operation!"; return binaryOperatorsMap.get(token); } @NotNull - public static JsUnaryOperator getUnaryOperator(@NotNull JetToken token) { + static public JsUnaryOperator getUnaryOperator(@NotNull JetToken token) { assert JetTokens.OPERATIONS.contains(token) : "Token should represent an operation!"; return unaryOperatorsMap.get(token); } - public static boolean isAssignment(JetToken token) { + static public boolean isAssignment(JetToken token) { return (token == JetTokens.EQ); } - - } diff --git a/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java b/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java index cc18391e265..2de2defcff8 100644 --- a/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java @@ -9,7 +9,6 @@ import org.jetbrains.jet.lang.psi.*; /** * @author Talanov Pavel */ -//TODO: fix members order public final class PatternTranslator extends AbstractTranslator { @NotNull @@ -21,24 +20,9 @@ public final class PatternTranslator extends AbstractTranslator { super(context); } -// @NotNull -// public JsExpression translate(@NotNull JetBinaryExpressionWithTypeRHS expression) { -// JsExpression left = AstUtil.convertToExpression -// (Translation.translateExpression(expression.getLeft(), translationContext())); -// JsNameRef right = getClassReference(expression); -// JetToken token = getOperationToken(expression); -// if (OperatorTable.hasCorrespondingFunctionInvocation(token)) { -// JsInvocation functionInvocation = OperatorTable.getCorrespondingFunctionInvocation(token); -// functionInvocation.setArguments(Arrays.asList(left, right)); -// return functionInvocation; -// } -// throw new AssertionError("Unsupported token encountered: " + token.toString()); -// } - @NotNull public JsExpression translateIsExpression(@NotNull JetIsExpression expression) { - JsExpression left = AstUtil.convertToExpression - (Translation.translateExpression(expression.getLeftHandSide(), translationContext())); + JsExpression left = Translation.translateAsExpression(expression.getLeftHandSide(), translationContext()); JetPattern pattern = getPattern(expression); JsExpression resultingExpression = translatePattern(pattern, left); if (expression.isNegated()) { @@ -47,6 +31,13 @@ public final class PatternTranslator extends AbstractTranslator { return resultingExpression; } + @NotNull + private JetPattern getPattern(@NotNull JetIsExpression expression) { + JetPattern pattern = expression.getPattern(); + assert pattern != null : "Pattern should not be null"; + return pattern; + } + @NotNull public JsExpression translatePattern(@NotNull JetPattern pattern, @NotNull JsExpression expressionToMatch) { if (pattern instanceof JetTypePattern) { @@ -58,23 +49,6 @@ public final class PatternTranslator extends AbstractTranslator { throw new AssertionError("Unsupported pattern type " + pattern.getClass()); } - @NotNull - private JsExpression translateExpressionPattern(JsExpression expressionToMatch, JetExpressionPattern pattern) { - JetExpression patternExpression = pattern.getExpression(); - assert patternExpression != null : "Expression patter should have an expression."; - JsExpression expressionToMatchAgainst = - Translation.translateAsExpression(patternExpression, translationContext()); - //TODO: should call equals method here - return new JsBinaryOperation(JsBinaryOperator.REF_EQ, expressionToMatch, expressionToMatchAgainst); - } - - @NotNull - private JetPattern getPattern(@NotNull JetIsExpression expression) { - JetPattern pattern = expression.getPattern(); - assert pattern != null : "Pattern should not be null"; - return pattern; - } - @NotNull private JsExpression translateTypePattern(@NotNull JsExpression expressionToMatch, @NotNull JetTypePattern pattern) { @@ -88,13 +62,6 @@ public final class PatternTranslator extends AbstractTranslator { return getClassNameReferenceForTypeReference(typeReference); } -// @NotNull -// private JsNameRef getClassReference(@NotNull JetBinaryExpressionWithTypeRHS expression) { -// JetTypeReference typeReference = expression.getRight(); -// assert typeReference != null : "Binary type expression should have a right expression"; -// return getClassNameReferenceForTypeReference(typeReference); -// } - @NotNull private JsNameRef getClassNameReferenceForTypeReference(@NotNull JetTypeReference typeReference) { ClassDescriptor referencedClass = BindingUtils.getClassDescriptorForTypeReference @@ -104,13 +71,13 @@ public final class PatternTranslator extends AbstractTranslator { return translationContext().getNamespaceQualifiedReference(className); } -// @NotNull -// private JetToken getOperationToken(@NotNull JetBinaryExpressionWithTypeRHS expression) { -// JetSimpleNameExpression operationExpression = expression.getOperationSign(); -// IElementType elementType = operationExpression.getReferencedNameElementType(); -// assert elementType instanceof JetToken : "Binary type operation should have IElementType of type JetToken"; -// return (JetToken) elementType; -// } - - + @NotNull + private JsExpression translateExpressionPattern(JsExpression expressionToMatch, JetExpressionPattern pattern) { + JetExpression patternExpression = pattern.getExpression(); + assert patternExpression != null : "Expression patter should have an expression."; + JsExpression expressionToMatchAgainst = + Translation.translateAsExpression(patternExpression, translationContext()); + //TODO: should call equals method here + return new JsBinaryOperation(JsBinaryOperator.REF_EQ, expressionToMatch, expressionToMatchAgainst); + } } diff --git a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java index 21ed8515701..048b2a11fc1 100644 --- a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java @@ -1,9 +1,9 @@ package org.jetbrains.k2js.translate; +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.JsNode; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,10 +56,10 @@ public final class PropertyAccessTranslator extends AbstractTranslator { @NotNull private JsInvocation translateReceiverAndReturnAccessorInvocation (@NotNull JetQualifiedExpression qualifiedExpression, @NotNull JsName accessorName) { - JsNode node = Translation.expressionTranslator(translationContext()) - .translate(qualifiedExpression.getReceiverExpression()); + JsExpression qualifier = Translation.translateAsExpression + (qualifiedExpression.getReceiverExpression(), translationContext()); JsNameRef result = accessorName.makeRef(); - result.setQualifier(AstUtil.convertToExpression(node)); + result.setQualifier(qualifier); return AstUtil.newInvocation(result); } diff --git a/translator/src/org/jetbrains/k2js/translate/Translation.java b/translator/src/org/jetbrains/k2js/translate/Translation.java index 6580d694345..a3e3d6c3f05 100644 --- a/translator/src/org/jetbrains/k2js/translate/Translation.java +++ b/translator/src/org/jetbrains/k2js/translate/Translation.java @@ -46,8 +46,8 @@ public final class Translation { } @NotNull - static public DeclarationTranslator declarationTranslator(@NotNull TranslationContext context) { - return DeclarationTranslator.newInstance(context); + static public NamespaceDeclarationTranslator declarationTranslator(@NotNull TranslationContext context) { + return NamespaceDeclarationTranslator.newInstance(context); } @NotNull @@ -60,7 +60,6 @@ public final class Translation { return expressionTranslator(context).translate(expression); } - //TODO: clean out similar code fragments @NotNull static public JsExpression translateAsExpression(@NotNull JetExpression expression, @NotNull TranslationContext context) { return AstUtil.convertToExpression(translateExpression(expression, context)); diff --git a/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java b/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java index aacc912ce4f..26c34290dc2 100644 --- a/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java @@ -2,7 +2,6 @@ package org.jetbrains.k2js.translate; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.*; @@ -45,8 +44,7 @@ public class TranslatorVisitor extends JetVisitor { JsExpression jsInitExpression = null; JetExpression initializer = declaration.getInitializer(); if (initializer != null) { - jsInitExpression = AstUtil.convertToExpression(Translation.expressionTranslator(context) - .translate(initializer)); + jsInitExpression = Translation.translateAsExpression(initializer, context); } return jsInitExpression; } @@ -67,6 +65,6 @@ public class TranslatorVisitor extends JetVisitor { if (jetExpression == null) { throw new AssertionError("Argument with no expression encountered!"); } - return AstUtil.convertToExpression(Translation.translateExpression(jetExpression, context)); + return Translation.translateAsExpression(jetExpression, context); } } diff --git a/translator/test/org/jetbrains/k2js/test/BasicClassTest.java b/translator/test/org/jetbrains/k2js/test/BasicClassTest.java index 42f8efaaa49..efcad3444ce 100644 --- a/translator/test/org/jetbrains/k2js/test/BasicClassTest.java +++ b/translator/test/org/jetbrains/k2js/test/BasicClassTest.java @@ -24,7 +24,7 @@ public class BasicClassTest extends IncludeLibraryTest { testFooBoxIsTrue("methodDeclarationAndCall.kt"); } - //TODO: test excluded. Wait for bugfix and implement functionality + //TODO: wait for bugfix and implement properties as consructor parameter declaration @Test public void constructorWithParameter() throws Exception { testFooBoxIsTrue("constructorWithParameter.kt"); diff --git a/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java b/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java index c0577d76191..a1031833734 100644 --- a/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java +++ b/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java @@ -44,4 +44,9 @@ public final class PatternMatchingTest extends IncludeLibraryTest { testFooBoxIsTrue("whenValueOrType.kt"); } + @Test + public void multipleCases() throws Exception { + testFooBoxIsTrue("multipleCases.kt"); + } + } diff --git a/translator/test/org/jetbrains/k2js/test/TupleTest.java b/translator/test/org/jetbrains/k2js/test/TupleTest.java new file mode 100644 index 00000000000..4e8fab2ad21 --- /dev/null +++ b/translator/test/org/jetbrains/k2js/test/TupleTest.java @@ -0,0 +1,22 @@ +package org.jetbrains.k2js.test; + +/** + * @author Talanov Pavel + */ +public class TupleTest extends IncludeLibraryTest { + + final private static String MAIN = "tuple/"; + + @Override + protected String mainDirectory() { + return MAIN; + } + + //TODO: excluded because Tuples are not implemented +// @Test +// public void twoElements() throws Exception { +// testFooBoxIsTrue("twoElements.kt"); +// } + +} + diff --git a/translator/testFiles/patternMatching/cases/multipleCases.kt b/translator/testFiles/patternMatching/cases/multipleCases.kt new file mode 100644 index 00000000000..9b6ef9a3bda --- /dev/null +++ b/translator/testFiles/patternMatching/cases/multipleCases.kt @@ -0,0 +1,17 @@ +namespace foo + +fun box() : Boolean { + val c = 3 + val d = 5 + var z = 0 + when(c) { + is 5, is 3 => z++; + else => z = -1000; + } + + when(d) { + is 5, is 3 => z++; + else => z = -1000; + } + return c == 2 +} \ No newline at end of file diff --git a/translator/testFiles/tuple/cases/twoElements.kt b/translator/testFiles/tuple/cases/twoElements.kt new file mode 100644 index 00000000000..8a8524ca4d4 --- /dev/null +++ b/translator/testFiles/tuple/cases/twoElements.kt @@ -0,0 +1,6 @@ +namespace foo + +fun box() : Boolean { + val a : (Int, Int) = (1, 2) + return (a._1 == 1) + } \ No newline at end of file