Skip to content

Commit 2f1e0c2

Browse files
authored
Merge pull request scala#5704 from som-snytt/issue/10190-elide-string
SI-10190 Elide string to empty instead of null
2 parents 13f7b2a + 6fb3825 commit 2f1e0c2

File tree

4 files changed

+38
-16
lines changed

4 files changed

+38
-16
lines changed

src/compiler/scala/tools/nsc/transform/UnCurry.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,12 +342,16 @@ abstract class UnCurry extends InfoTransform
342342
* the whole tree with it.
343343
*/
344344
private def replaceElidableTree(tree: Tree): Tree = {
345+
def elisionOf(t: Type): Tree = t.typeSymbol match {
346+
case StringClass => Literal(Constant("")) setType t
347+
case _ => gen.mkZero(t)
348+
}
345349
tree match {
346350
case DefDef(_,_,_,_,_,rhs) =>
347-
val rhs1 = if (rhs == EmptyTree) rhs else Block(Nil, gen.mkZero(rhs.tpe)) setType rhs.tpe
351+
val rhs1 = if (rhs == EmptyTree) rhs else Block(Nil, elisionOf(rhs.tpe)) setType rhs.tpe
348352
deriveDefDef(tree)(_ => rhs1) setSymbol tree.symbol setType tree.tpe
349353
case _ =>
350-
gen.mkZero(tree.tpe) setType tree.tpe
354+
elisionOf(tree.tpe)
351355
}
352356
}
353357

test/files/run/elidable-opt.check

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ false
1111
0
1212
0.0
1313
0.0
14-
null
14+

test/files/run/elidable.check

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ false
1111
0
1212
0.0
1313
0.0
14-
null
14+

test/files/run/elidable.scala

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,36 @@ import elidable._
33

44
// runs -Xelide-below WARNING or 900
55

6+
object Fail {
7+
def fail(msg: String): Unit = throw new IllegalStateException(s"Expected failure: $msg")
8+
}
9+
import Fail.fail
10+
611
trait T {
712
@elidable(FINEST) def f1()
813
@elidable(SEVERE) def f2()
9-
@elidable(FINEST) def f3() = assert(false, "Should have been elided.")
14+
@elidable(FINEST) def f3() = fail("Should have been elided.")
1015
def f4()
1116
}
1217

1318
class C extends T {
1419
def f1() = println("Good for me, I was not elided. C.f1")
1520
def f2() = println("Good for me, I was not elided. C.f2")
16-
@elidable(FINEST) def f4() = assert(false, "Should have been elided.")
21+
@elidable(FINEST) def f4() = fail("Should have been elided.")
1722
}
1823

1924
object O {
20-
@elidable(FINEST) def f1() = assert(false, "Should have been elided.")
21-
@elidable(INFO) def f2() = assert(false, "Should have been elided.")
25+
@elidable(FINEST) def f1() = fail("Should have been elided.")
26+
@elidable(INFO) def f2() = fail("Should have been elided.")
2227
@elidable(SEVERE) def f3() = println("Good for me, I was not elided. O.f3")
23-
@elidable(INFO) def f4 = assert(false, "Should have been elided (no parens).")
28+
@elidable(INFO) def f4 = fail("Should have been elided (no parens).")
2429
}
2530

2631
object Test {
27-
@elidable(FINEST) def f1() = assert(false, "Should have been elided.")
28-
@elidable(INFO) def f2() = assert(false, "Should have been elided.")
32+
@elidable(FINEST) def f1() = fail("Should have been elided.")
33+
@elidable(INFO) def f2() = fail("Should have been elided.")
2934
@elidable(SEVERE) def f3() = println("Good for me, I was not elided. Test.f3")
30-
@elidable(INFO) def f4 = assert(false, "Should have been elided (no parens).")
35+
@elidable(INFO) def f4 = fail("Should have been elided (no parens).")
3136

3237
@elidable(FINEST) def f5() = {}
3338
@elidable(FINEST) def f6() = true
@@ -38,12 +43,12 @@ object Test {
3843
@elidable(FINEST) def fb() = 1l
3944
@elidable(FINEST) def fc() = 1.0f
4045
@elidable(FINEST) def fd() = 1.0
41-
@elidable(FINEST) def fe() = "s"
46+
@elidable(FINEST) def fe() = { fail("Should have been elided to empty string.") ; "hello, world" }
4247

4348
/* variable elisions? see test/files/neg/t10068.scala
44-
@elidable(INFO) val goner1: Int = { assert(false, "Should have been elided.") ; 42 }
45-
@elidable(INFO) lazy val goner2: Int = { assert(false, "Should have been elided.") ; 42 }
46-
@elidable(INFO) var goner3: Int = { assert(false, "Should have been elided.") ; 42 }
49+
@elidable(INFO) val goner1: Int = { fail("Should have been elided.") ; 42 }
50+
@elidable(INFO) lazy val goner2: Int = { fail("Should have been elided.") ; 42 }
51+
@elidable(INFO) var goner3: Int = { fail("Should have been elided.") ; 42 }
4752
@elidable(INFO) var goner4: Nothing = _
4853
*/
4954

@@ -74,6 +79,19 @@ object Test {
7479
println(fc())
7580
println(fd())
7681
println(fe())
82+
if (!fe().isEmpty) fail(s"Not empty: [${fe()}]")
83+
/*
84+
()
85+
false
86+
0
87+
0
88+
0
89+
0
90+
0
91+
0.0
92+
0.0
93+
// was: null
94+
*/
7795

7896
// this one won't show up in the output because a call to f1 is elidable when accessed through T
7997
(c:T).f1()

0 commit comments

Comments
 (0)