From 491e8fefe3f602da56956f311f82797acca16b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Doeraene?= Date: Wed, 19 May 2021 10:56:07 +0200 Subject: [PATCH] Fix #12507: Scala.js: Mangle param names in closures. Instead of calling `name.toString`, we use the overload of `freshLocalIdent` that takes a `TermName`, already used elsewhere, and which correctly calls `mangledString`. --- compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala | 4 ++-- .../scalajs/testsuite/compiler/RegressionTestScala3.scala | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala b/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala index 38641cea93e4..f11abc515e12 100644 --- a/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala +++ b/compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala @@ -3041,7 +3041,7 @@ class JSCodeGen()(using genCtx: Context) { val formalAndActualCaptures = allCaptureValues.map { value => implicit val pos = value.span val (formalIdent, originalName) = value match { - case Ident(name) => (freshLocalIdent(name.toString), OriginalName(name.toString)) + case Ident(name) => (freshLocalIdent(name.toTermName), OriginalName(name.toString)) case This(_) => (freshLocalIdent("this"), thisOriginalName) case _ => (freshLocalIdent(), NoOriginalName) } @@ -3069,7 +3069,7 @@ class JSCodeGen()(using genCtx: Context) { val formalAndActualParams = formalParamNames.lazyZip(formalParamTypes).lazyZip(formalParamRepeateds).map { (name, tpe, repeated) => - val formalParam = js.ParamDef(freshLocalIdent(name.toString), + val formalParam = js.ParamDef(freshLocalIdent(name), OriginalName(name.toString), jstpe.AnyType, mutable = false) val actualParam = if (repeated) genJSArrayToVarArgs(formalParam.ref)(tree.sourcePos) diff --git a/tests/sjs-junit/test/org/scalajs/testsuite/compiler/RegressionTestScala3.scala b/tests/sjs-junit/test/org/scalajs/testsuite/compiler/RegressionTestScala3.scala index 4a7ccad3cc5a..e2ac600ae742 100644 --- a/tests/sjs-junit/test/org/scalajs/testsuite/compiler/RegressionTestScala3.scala +++ b/tests/sjs-junit/test/org/scalajs/testsuite/compiler/RegressionTestScala3.scala @@ -27,6 +27,14 @@ class RegressionTestScala3 { assertEquals("foo", new RangeErrorIssue11592("foo").message) assertEquals("", new RangeErrorIssue11592().message) } + + @Test def testNonJVMCharsInClosureParametersIssue12507(): Unit = { + def foo(`[-3, 3]`: Int): Int => Int = { x => + `[-3, 3]` + } + + assertEquals(5, foo(5)(4)) + } } object RegressionTestScala3 {