From 1903b4ad8cf709cb729b8967e9708927ffa6688a Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Wed, 4 Sep 2019 11:25:24 +0200 Subject: [PATCH 1/2] Fix #7137: Do not import Predef.any2stringadd by default This changes the default root import from `import scala.Predef._` to `import scala.Predef.{ _, any2stringadd => _ }`. --- community-build/community-projects/scalap | 2 +- community-build/community-projects/scalatest | 2 +- community-build/community-projects/semanticdb | 2 +- .../dotty/tools/dotc/core/Definitions.scala | 1 + .../src/dotty/tools/dotc/core/StdNames.scala | 1 + .../dotty/tools/dotc/typer/ImportInfo.scala | 5 +++- .../tools/backend/jvm/StringConcatTest.scala | 25 +++++++++++-------- .../dotty/tools/repl/TabcompleteTests.scala | 2 +- tests/neg/i7137.scala | 7 ++++++ .../plugins/custom/analyzer/Analyzer_1.scala | 2 +- .../tasty-definitions-1/quoted_1.scala | 2 +- .../xml-interpolation-4/Test_2.scala | 2 +- tests/run/equality.scala | 6 ++--- 13 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 tests/neg/i7137.scala diff --git a/community-build/community-projects/scalap b/community-build/community-projects/scalap index dac8a812cfa6..082e1ac7c9f6 160000 --- a/community-build/community-projects/scalap +++ b/community-build/community-projects/scalap @@ -1 +1 @@ -Subproject commit dac8a812cfa68a5e96cbd6b7a34481e075bfd4e4 +Subproject commit 082e1ac7c9f6defd30d869975f15e832c8b93d6a diff --git a/community-build/community-projects/scalatest b/community-build/community-projects/scalatest index 0cf1ffad398c..40c065e2f944 160000 --- a/community-build/community-projects/scalatest +++ b/community-build/community-projects/scalatest @@ -1 +1 @@ -Subproject commit 0cf1ffad398c60c1b1fe995158e543bb5bfce310 +Subproject commit 40c065e2f944cdafe630537d95afcb6915fae89a diff --git a/community-build/community-projects/semanticdb b/community-build/community-projects/semanticdb index 7d7983356e57..68a03f0c2c27 160000 --- a/community-build/community-projects/semanticdb +++ b/community-build/community-projects/semanticdb @@ -1 +1 @@ -Subproject commit 7d7983356e57b429d064ba23328e0e2c9c4be978 +Subproject commit 68a03f0c2c272a4cce54d78e92de1c8ca32ae4b4 diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala index be936383aa08..b3b06bbf90c7 100644 --- a/compiler/src/dotty/tools/dotc/core/Definitions.scala +++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala @@ -351,6 +351,7 @@ class Definitions { @tu lazy val Predef_classOf : Symbol = ScalaPredefModule.requiredMethod(nme.classOf) @tu lazy val Predef_identity : Symbol = ScalaPredefModule.requiredMethod(nme.identity) @tu lazy val Predef_undefined: Symbol = ScalaPredefModule.requiredMethod(nme.???) + @tu lazy val Predef_any2stringadd: Symbol = ScalaPredefModule.requiredMethod(nme.any2stringadd) def SubTypeClass(implicit ctx: Context): ClassSymbol = ctx.requiredClass("scala.<:<") diff --git a/compiler/src/dotty/tools/dotc/core/StdNames.scala b/compiler/src/dotty/tools/dotc/core/StdNames.scala index 0ba484b3e248..8ac80d8f1073 100644 --- a/compiler/src/dotty/tools/dotc/core/StdNames.scala +++ b/compiler/src/dotty/tools/dotc/core/StdNames.scala @@ -370,6 +370,7 @@ object StdNames { val add_ : N = "add" val acc: N = "acc" val annotation: N = "annotation" + val any2stringadd: N = "any2stringadd" val anyHash: N = "anyHash" val anyValClass: N = "anyValClass" val append: N = "append" diff --git a/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala b/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala index 7ff4fca3c5d6..fdc4c03c948a 100644 --- a/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala +++ b/compiler/src/dotty/tools/dotc/typer/ImportInfo.scala @@ -16,7 +16,10 @@ import Decorators._ object ImportInfo { /** The import info for a root import from given symbol `sym` */ def rootImport(refFn: () => TermRef, importGiven: Boolean = false)(implicit ctx: Context): ImportInfo = { - val selectors = untpd.Ident(nme.WILDCARD) :: Nil + // selectors: { _, any2stringadd => _ } + val selectors = untpd.Ident(nme.WILDCARD) :: + Thicket(untpd.Ident(nme.any2stringadd) :: untpd.Ident(nme.WILDCARD) :: Nil) :: + Nil def expr(implicit ctx: Context) = tpd.Ident(refFn()) def imp(implicit ctx: Context) = tpd.Import(importGiven = importGiven, expr, selectors) new ImportInfo(imp.symbol, selectors, None, importGiven = importGiven, isRootImport = true) diff --git a/compiler/test/dotty/tools/backend/jvm/StringConcatTest.scala b/compiler/test/dotty/tools/backend/jvm/StringConcatTest.scala index 6de37d0fad39..f288a8d6ff33 100644 --- a/compiler/test/dotty/tools/backend/jvm/StringConcatTest.scala +++ b/compiler/test/dotty/tools/backend/jvm/StringConcatTest.scala @@ -29,7 +29,7 @@ class StringConcatTest extends DottyBytecodeTest { | str: String, | sbuf: java.lang.StringBuffer, | chsq: java.lang.CharSequence, - | chrs: Array[Char]) = str + this + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs + | chrs: Array[Char]) = str.toString + this + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs | | // similar, but starting off with any2stringadd | def t2( @@ -45,7 +45,7 @@ class StringConcatTest extends DottyBytecodeTest { | str: String, | sbuf: java.lang.StringBuffer, | chsq: java.lang.CharSequence, - | chrs: Array[Char]) = this + str + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs + | chrs: Array[Char]) = this.toString + str + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs |} """.stripMargin @@ -60,8 +60,9 @@ class StringConcatTest extends DottyBytecodeTest { case Invoke(_, _, name, desc, _) => name + desc } - assertEquals(invokeNameDesc("t1"), List( + assertEquals(List( "()V", + "toString()Ljava/lang/String;", "append(Ljava/lang/String;)Ljava/lang/StringBuilder;", "append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", "append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", @@ -76,12 +77,14 @@ class StringConcatTest extends DottyBytecodeTest { "append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;", "append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;", "append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", // test that we're not using the [C overload - "toString()Ljava/lang/String;")) + "toString()Ljava/lang/String;"), + invokeNameDesc("t1") + ) - assertEquals(invokeNameDesc("t2"), List( - "any2stringadd(Ljava/lang/Object;)Ljava/lang/Object;", + assertEquals(List( "()V", - "$plus$extension(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;", + "toString()Ljava/lang/String;", + "append(Ljava/lang/String;)Ljava/lang/StringBuilder;", "append(Ljava/lang/String;)Ljava/lang/StringBuilder;", "append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", "append(Z)Ljava/lang/StringBuilder;", @@ -94,8 +97,10 @@ class StringConcatTest extends DottyBytecodeTest { "append(D)Ljava/lang/StringBuilder;", "append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;", "append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;", - "append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", // test that we're not using the [C overload - "toString()Ljava/lang/String;")) + "append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", + "toString()Ljava/lang/String;"), + invokeNameDesc("t2") + ) } } @@ -124,6 +129,6 @@ class StringConcatTest extends DottyBytecodeTest { def chsq: java.lang.CharSequence = "chsq" val s = t((), true, 'd', 3: Byte, 12: Short, 3, -32l, 12.3f, -4.2d, "me", sbuf, chsq, Array('a', 'b')) val r = s.replaceAll("""\[C@\w+""", "") - assertEquals(r, "meTTT()trued312312.3-32-4.2sbufchsq//TTTme()trued312312.3-32-4.2sbufchsq") + assertEquals("meTTT()trued312312.3-32-4.2sbufchsq//TTTme()trued312312.3-32-4.2sbufchsq", r) } } diff --git a/compiler/test/dotty/tools/repl/TabcompleteTests.scala b/compiler/test/dotty/tools/repl/TabcompleteTests.scala index 9d3e3525118e..e0c757435179 100644 --- a/compiler/test/dotty/tools/repl/TabcompleteTests.scala +++ b/compiler/test/dotty/tools/repl/TabcompleteTests.scala @@ -115,7 +115,7 @@ class TabcompleteTests extends ReplTest { @Test def anyRef = fromInitialState { implicit s => val comp = tabComplete("(null: AnyRef).") assertEquals( - List("!=", "##", "+", "->", "==", "asInstanceOf", "clone", "ensuring", "eq", "equals", "finalize", "formatted", + List("!=", "##", "->", "==", "asInstanceOf", "clone", "ensuring", "eq", "equals", "finalize", "formatted", "getClass", "hashCode", "isInstanceOf", "ne", "notify", "notifyAll", "synchronized", "toString", "wait", "→"), comp.distinct.sorted) } diff --git a/tests/neg/i7137.scala b/tests/neg/i7137.scala new file mode 100644 index 000000000000..5b7ec3a36e5d --- /dev/null +++ b/tests/neg/i7137.scala @@ -0,0 +1,7 @@ + +object App { + val any: Any = 3 + val str: String = any + "a" // error + val str2: String = any2stringadd(any) + "a" // error + val str3: String = Predef.any2stringadd(any) + "a" +} diff --git a/tests/plugins/custom/analyzer/Analyzer_1.scala b/tests/plugins/custom/analyzer/Analyzer_1.scala index f3b5e2224665..06262656786a 100644 --- a/tests/plugins/custom/analyzer/Analyzer_1.scala +++ b/tests/plugins/custom/analyzer/Analyzer_1.scala @@ -83,7 +83,7 @@ class InitChecker extends PluginPhase with StandardPlugin { ctx.warning("tree: " + tree.symbol.defTree.show) } else { - ctx.warning(tree.symbol + " is neither in lib nor hello, owner = " + enclosingPkg, tree.sourcePos) + ctx.warning(tree.symbol.toString + " is neither in lib nor hello, owner = " + enclosingPkg, tree.sourcePos) } tree } diff --git a/tests/run-macros/tasty-definitions-1/quoted_1.scala b/tests/run-macros/tasty-definitions-1/quoted_1.scala index 6bd2b1bd7c1f..22b7ba4231ab 100644 --- a/tests/run-macros/tasty-definitions-1/quoted_1.scala +++ b/tests/run-macros/tasty-definitions-1/quoted_1.scala @@ -11,7 +11,7 @@ object Macros { val buff = List.newBuilder[String] def printout(x: => String): Unit = { - buff += (try x catch { case ex => ex.getClass + ": " + ex.getMessage}) + buff += (try x catch { case ex => ex.getClass.toString + ": " + ex.getMessage}) } printout(defn.RootPackage.name) diff --git a/tests/run-macros/xml-interpolation-4/Test_2.scala b/tests/run-macros/xml-interpolation-4/Test_2.scala index f579a9d0c281..58a2e4d8a05c 100644 --- a/tests/run-macros/xml-interpolation-4/Test_2.scala +++ b/tests/run-macros/xml-interpolation-4/Test_2.scala @@ -3,7 +3,7 @@ import XmlQuote._ object Test { def main(args: Array[String]): Unit = { assert(xml"Hello ${implicitly[Scope]} world!" == "Hello Scope(top+) world!") - assert(xml"Hello ${ xml"world ${implicitly[Scope] + " " + xml"${implicitly[Scope]}"}" }!" == + assert(xml"Hello ${ xml"world ${implicitly[Scope].toString + " " + xml"${implicitly[Scope]}"}" }!" == "Hello world Scope(top++) Scope(top+++)!") } } diff --git a/tests/run/equality.scala b/tests/run/equality.scala index 2af73691d824..5d31cbdb8d29 100644 --- a/tests/run/equality.scala +++ b/tests/run/equality.scala @@ -15,19 +15,19 @@ object Test def main(args: Array[String]): Unit = { var xs = makeFromInt(5) for (x <- xs ; y <- xs) { - assert(x == y, x + " == " + y) + assert(x == y, x.toString + " == " + y) assert(hash(x) == hash(y), "hash(%s) == hash(%s)".format(x, y)) } xs = makeFromInt(-5) for (x <- xs ; y <- xs) { - assert(x == y, x + " == " + y) + assert(x == y, x.toString + " == " + y) assert(hash(x) == hash(y), "hash(%s) == hash(%s)".format(x, y)) } xs = makeFromDouble(500.0) for (x <- xs ; y <- xs) { - assert(x == y, x + " == " + y) + assert(x == y, x.toString + " == " + y) assert(hash(x) == hash(y), "hash(%s) == hash(%s)".format(x, y)) } From e30a02b28f9908ce8bdc2170dde1fb350aea3795 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 12 Sep 2019 11:38:54 +0200 Subject: [PATCH 2/2] Remove any2stringadd definition --- compiler/src/dotty/tools/dotc/core/Definitions.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala index b3b06bbf90c7..be936383aa08 100644 --- a/compiler/src/dotty/tools/dotc/core/Definitions.scala +++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala @@ -351,7 +351,6 @@ class Definitions { @tu lazy val Predef_classOf : Symbol = ScalaPredefModule.requiredMethod(nme.classOf) @tu lazy val Predef_identity : Symbol = ScalaPredefModule.requiredMethod(nme.identity) @tu lazy val Predef_undefined: Symbol = ScalaPredefModule.requiredMethod(nme.???) - @tu lazy val Predef_any2stringadd: Symbol = ScalaPredefModule.requiredMethod(nme.any2stringadd) def SubTypeClass(implicit ctx: Context): ClassSymbol = ctx.requiredClass("scala.<:<")