[K/JS] Compile Kotlin coroutines as JS generator ^KT-63038 Fixed
This commit is contained in:
@@ -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)
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user