diff --git a/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala b/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala index 55e2473bc405..0398fb121fb5 100644 --- a/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala +++ b/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala @@ -723,9 +723,10 @@ class JSCodeGen()(implicit ctx: Context) { mutable = false, rest = false) } - def genBody() = + def genBody() = localNames.makeLabeledIfRequiresEnclosingReturn(resultIRType) { if (resultIRType == jstpe.NoType) genStat(tree) else genExpr(tree) + } //if (!isScalaJSDefinedJSClass(currentClassSym)) { val flags = js.MemberFlags.empty.withNamespace(namespace) diff --git a/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala b/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala index 38d79db76d2c..97b5e3e47dd1 100644 --- a/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala +++ b/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala @@ -92,6 +92,18 @@ object JSEncoding { returnLabelName = Some(freshName("_return")) js.Ident(returnLabelName.get) } + + /* If this `LocalNameGenerator` has a `returnLabelName` (often added in the + * construction of the `body` argument), wrap the resulting js.Tree to use that label. + */ + def makeLabeledIfRequiresEnclosingReturn(tpe: jstpe.Type)(body: js.Tree)(implicit pos: ir.Position): js.Tree = { + returnLabelName match { + case None => + body + case Some(labelName) => + js.Labeled(js.Ident(labelName), tpe, body) + } + } } private object LocalNameGenerator { diff --git a/project/Build.scala b/project/Build.scala index b0b86a1d3d34..d227cddb3ad4 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -979,7 +979,7 @@ object Build { ( (dir / "shared/src/test/scala/org/scalajs/testsuite/compiler" ** (("*.scala":FileFilter) -- "RegressionTest.scala" -- "ReflectiveCallTest.scala")).get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** (("*.scala": FileFilter) -- "ClassTest.scala" -- "StringTest.scala")).get - ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/io" ** (("*.scala": FileFilter) -- "ByteArrayInputStreamTest.scala" -- "ByteArrayOutputStreamTest.scala" -- "DataInputStreamTest.scala" -- "DataOutputStreamTest.scala" -- "InputStreamTest.scala" -- "OutputStreamWriterTest.scala" -- "PrintStreamTest.scala" -- "ReadersTest.scala" -- "CommonStreamsTests.scala")).get + ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/io" ** (("*.scala": FileFilter) -- "ByteArrayInputStreamTest.scala" -- "ByteArrayOutputStreamTest.scala" -- "DataInputStreamTest.scala" -- "DataOutputStreamTest.scala" -- "InputStreamTest.scala" -- "OutputStreamWriterTest.scala" -- "PrintStreamTest.scala" -- "CommonStreamsTests.scala")).get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/math" ** "*.scala").get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/net" ** (("*.scala": FileFilter) -- "URITest.scala")).get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/security" ** "*.scala").get