[K/JS] Compile Kotlin coroutines as JS generator ^KT-63038 Fixed

This commit is contained in:
Artem Kobzar
2023-12-18 17:13:07 +00:00
committed by Space Team
parent 4d07fdf97e
commit 2530cba82a
73 changed files with 2240 additions and 144 deletions
@@ -80,6 +80,11 @@ class JsPrecedenceVisitor extends JsVisitor {
answer = 16;
}
@Override
public void visitYield(@NotNull JsYield yield) {
answer = 2; // https://esdiscuss.org/topic/precedence-of-yield-operator
}
@Override
public void visitNameRef(@NotNull JsNameRef nameRef) {
if (nameRef.isLeaf()) {
@@ -27,6 +27,7 @@ public class JsToStringGenerationVisitor extends JsVisitor {
private static final char[] CHARS_CLASS = "class".toCharArray();
private static final char[] CHARS_CONSTRUCTOR = "constructor".toCharArray();
private static final char[] CHARS_CONTINUE = "continue".toCharArray();
private static final char[] CHARS_YIELD = "yield".toCharArray();
private static final char[] CHARS_DEBUGGER = "debugger".toCharArray();
private static final char[] CHARS_DEFAULT = "default".toCharArray();
private static final char[] CHARS_DO = "do".toCharArray();
@@ -46,6 +47,7 @@ public class JsToStringGenerationVisitor extends JsVisitor {
private static final char[] CHARS_RETURN = "return".toCharArray();
private static final char[] CHARS_SWITCH = "switch".toCharArray();
private static final char[] CHARS_THIS = "this".toCharArray();
private static final char CHARS_GENERATOR = '*';
private static final char[] CHARS_SUPER = "super".toCharArray();
private static final char[] CHARS_THROW = "throw".toCharArray();
@@ -337,6 +339,24 @@ public class JsToStringGenerationVisitor extends JsVisitor {
popSourceInfo();
}
@Override
public void visitYield(@NotNull JsYield x) {
pushSourceInfo(x.getSource());
printCommentsBeforeNode(x);
p.print(CHARS_YIELD);
JsExpression expression = x.getExpression();
if (expression != null) {
space();
accept(x.getExpression());
}
printCommentsAfterNode(x);
popSourceInfo();
}
private void continueOrBreakLabel(JsContinue x) {
JsNameRef label = x.getLabel();
if (label != null) {
@@ -684,6 +704,10 @@ public class JsToStringGenerationVisitor extends JsVisitor {
space();
}
if (x.isGenerator()) {
p.print(CHARS_GENERATOR);
}
if (x.getName() != null) {
nameOf(x);
}
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
public final class JsFunction extends JsLiteral implements HasName {
public enum Modifier { STATIC, GET, SET }
public enum Modifier { STATIC, GET, SET, GENERATOR }
@NotNull
private JsBlock body;
@@ -81,6 +81,10 @@ public final class JsFunction extends JsLiteral implements HasName {
return modifiers != null && modifiers.contains(Modifier.SET);
}
public boolean isGenerator() {
return modifiers != null && modifiers.contains(Modifier.GENERATOR);
}
@NotNull
public Set<Modifier> getModifiers() {
if (modifiers == null) {
@@ -22,6 +22,10 @@ public final class JsNew extends JsExpression.JsExpressionHasArguments {
this.constructorExpression = constructorExpression;
}
public JsNew(JsExpression constructorExpression, JsExpression... arguments) {
this(constructorExpression, new SmartList<JsExpression>(arguments));
}
public JsExpression getConstructorExpression() {
return constructorExpression;
}
@@ -60,6 +60,9 @@ abstract class JsVisitor {
open fun visitContinue(x: JsContinue): Unit =
visitElement(x)
open fun visitYield(x: JsYield): Unit =
visitElement(x)
open fun visitDebugger(x: JsDebugger): Unit =
visitElement(x)
@@ -101,6 +101,9 @@ public abstract class JsVisitorWithContext {
public void endVisit(@NotNull JsContinue x, @NotNull JsContext ctx) {
}
public void endVisit(@NotNull JsYield x, @NotNull JsContext ctx) {
}
public void endVisit(@NotNull JsDebugger x, @NotNull JsContext ctx) {
}
@@ -274,6 +277,10 @@ public abstract class JsVisitorWithContext {
return true;
}
public boolean visit(@NotNull JsYield x, @NotNull JsContext ctx) {
return true;
}
public boolean visit(@NotNull JsDebugger x, @NotNull JsContext ctx) {
return true;
}
@@ -0,0 +1,29 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.js.backend.ast
import org.jetbrains.kotlin.js.util.AstUtil
class JsYield(var expression: JsExpression?) : JsExpression() {
override fun accept(visitor: JsVisitor) {
visitor.visitYield(this)
}
override fun acceptChildren(visitor: JsVisitor) {
visitor.accept(expression)
}
override fun deepCopy(): JsExpression {
return JsYield(AstUtil.deepCopy(expression)).withMetadataFrom(this)
}
override fun traverse(visitor: JsVisitorWithContext, ctx: JsContext<*>) {
if (visitor.visit(this, ctx)) {
expression = visitor.accept(expression)
}
visitor.endVisit(this, ctx)
}
}
@@ -82,6 +82,8 @@ var HasMetadata.synthetic: Boolean by MetadataProperty(default = false)
var HasMetadata.isInlineClassBoxing: Boolean by MetadataProperty(default = false)
var HasMetadata.isInlineClassUnboxing: Boolean by MetadataProperty(default = false)
var HasMetadata.isGeneratorFunction: Boolean by MetadataProperty(default = false)
var HasMetadata.sideEffects: SideEffectKind by MetadataProperty(default = SideEffectKind.AFFECTS_STATE)
/**