Hack to make tests path in IteratorForTranslator.
Adapted from https://github.com/develar/kotlin/commit/d3521123a6e4d551b30743b68b6bb23b9678553b.
This commit is contained in:
+16
-2
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.k2js.translate.expression.foreach;
|
package org.jetbrains.k2js.translate.expression.foreach;
|
||||||
|
|
||||||
|
import com.google.dart.compiler.backend.js.ast.JsBlock;
|
||||||
|
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.JsName;
|
||||||
import com.google.dart.compiler.backend.js.ast.JsStatement;
|
import com.google.dart.compiler.backend.js.ast.JsStatement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -25,6 +27,7 @@ import org.jetbrains.k2js.translate.context.TranslationContext;
|
|||||||
import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
||||||
import org.jetbrains.k2js.translate.general.Translation;
|
import org.jetbrains.k2js.translate.general.Translation;
|
||||||
|
|
||||||
|
import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar;
|
||||||
import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody;
|
import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody;
|
||||||
import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopParameter;
|
import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopParameter;
|
||||||
|
|
||||||
@@ -69,6 +72,17 @@ public abstract class ForTranslator extends AbstractTranslator {
|
|||||||
protected JsStatement translateOriginalBodyExpression() {
|
protected JsStatement translateOriginalBodyExpression() {
|
||||||
return Translation.translateAsStatement(getLoopBody(expression), context());
|
return Translation.translateAsStatement(getLoopBody(expression), context());
|
||||||
}
|
}
|
||||||
|
@NotNull
|
||||||
|
protected JsStatement translateBody(JsExpression itemValue) {
|
||||||
|
JsStatement currentVar = newVar(parameterName, itemValue);
|
||||||
|
JsStatement realBody = translateOriginalBodyExpression();
|
||||||
|
if (realBody instanceof JsBlock) {
|
||||||
|
JsBlock block = (JsBlock) realBody;
|
||||||
|
block.getStatements().add(0, currentVar);
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new JsBlock(currentVar, realBody);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-25
@@ -17,27 +17,28 @@
|
|||||||
package org.jetbrains.k2js.translate.expression.foreach;
|
package org.jetbrains.k2js.translate.expression.foreach;
|
||||||
|
|
||||||
import com.google.dart.compiler.backend.js.ast.*;
|
import com.google.dart.compiler.backend.js.ast.*;
|
||||||
|
import com.intellij.openapi.util.Pair;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
import org.jetbrains.jet.lang.psi.JetForExpression;
|
import org.jetbrains.jet.lang.psi.JetForExpression;
|
||||||
import org.jetbrains.k2js.translate.context.TemporaryVariable;
|
import org.jetbrains.k2js.translate.context.Namer;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.general.Translation;
|
import org.jetbrains.k2js.translate.general.Translation;
|
||||||
import org.jetbrains.k2js.translate.reference.CallBuilder;
|
import org.jetbrains.k2js.translate.reference.CallBuilder;
|
||||||
|
|
||||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.*;
|
import static org.jetbrains.k2js.translate.utils.BindingUtils.*;
|
||||||
import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToBlock;
|
|
||||||
import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar;
|
|
||||||
import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody;
|
|
||||||
import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange;
|
import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Pavel Talanov
|
* @author Pavel Talanov
|
||||||
*/
|
*/
|
||||||
public final class IteratorForTranslator extends ForTranslator {
|
public final class IteratorForTranslator extends ForTranslator {
|
||||||
|
@NotNull
|
||||||
|
private final Pair<JsVars.JsVar, JsNameRef> iterator;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static JsStatement doTranslate(@NotNull JetForExpression expression,
|
public static JsStatement doTranslate(@NotNull JetForExpression expression,
|
||||||
@@ -45,42 +46,43 @@ public final class IteratorForTranslator extends ForTranslator {
|
|||||||
return (new IteratorForTranslator(expression, context).translate());
|
return (new IteratorForTranslator(expression, context).translate());
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private final TemporaryVariable iterator;
|
|
||||||
|
|
||||||
private IteratorForTranslator(@NotNull JetForExpression forExpression, @NotNull TranslationContext context) {
|
private IteratorForTranslator(@NotNull JetForExpression forExpression, @NotNull TranslationContext context) {
|
||||||
super(forExpression, context);
|
super(forExpression, context);
|
||||||
iterator = context().declareTemporary(iteratorMethodInvocation());
|
iterator = context.dynamicContext().createTemporary(iteratorMethodInvocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsBlock translate() {
|
private JsBlock translate() {
|
||||||
JsBlock bodyBlock = generateCycleBody();
|
return new JsBlock(new JsVars(iterator.first), new JsWhile(hasNextMethodInvocation(), translateBody(nextMethodInvocation())));
|
||||||
JsWhile cycle = new JsWhile(hasNextMethodInvocation(), bodyBlock);
|
|
||||||
return new JsBlock(iterator.assignmentExpression().makeStmt(), cycle);
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: check whether complex logic with blocks is needed
|
|
||||||
@NotNull
|
|
||||||
private JsBlock generateCycleBody() {
|
|
||||||
JsBlock cycleBody = new JsBlock();
|
|
||||||
JsStatement parameterAssignment = newVar(parameterName, nextMethodInvocation());
|
|
||||||
JsNode originalBody = Translation.translateExpression(getLoopBody(expression), context().innerBlock(cycleBody));
|
|
||||||
cycleBody.getStatements().add(parameterAssignment);
|
|
||||||
cycleBody.getStatements().add(convertToBlock(originalBody));
|
|
||||||
return cycleBody;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression nextMethodInvocation() {
|
private JsExpression nextMethodInvocation() {
|
||||||
FunctionDescriptor nextFunction = getNextFunction(bindingContext(), getLoopRange(expression));
|
return translateMethodInvocation(iterator.second, getNextFunction(bindingContext(), getLoopRange(expression)));
|
||||||
return translateMethodInvocation(iterator.reference(), nextFunction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression hasNextMethodInvocation() {
|
private JsExpression hasNextMethodInvocation() {
|
||||||
CallableDescriptor hasNextFunction = getHasNextCallable(bindingContext(), getLoopRange(expression));
|
CallableDescriptor hasNextFunction = getHasNextCallable(bindingContext(), getLoopRange(expression));
|
||||||
return translateMethodInvocation(iterator.reference(), hasNextFunction);
|
if (hasNextFunction instanceof FunctionDescriptor && !isJavaUtilIterator(hasNextFunction)) {
|
||||||
|
return translateMethodInvocation(iterator.second, hasNextFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
// develar: I don't know, why hasNext called as function for PropertyDescriptor, our JS side define it as property and all other code translate it as property
|
||||||
|
JsNameRef hasNext = new JsNameRef(Namer.getNameForAccessor("hasNext", true, context().isEcma5()));
|
||||||
|
hasNext.setQualifier(iterator.second);
|
||||||
|
if (context().isEcma5()) {
|
||||||
|
return hasNext;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new JsInvocation(hasNext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// kotlin iterator define hasNext as property, but java util as function, our js side expects as property
|
||||||
|
private static boolean isJavaUtilIterator(CallableDescriptor descriptor) {
|
||||||
|
DeclarationDescriptor declaration = descriptor.getContainingDeclaration();
|
||||||
|
return declaration.getName().getName().equals("Iterator");
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
Reference in New Issue
Block a user