Skip to content

Commit 1c3d9ba

Browse files
authored
Merge pull request #13600 from dwijnand/repl-res-usage
2 parents 411b9f0 + 631fef4 commit 1c3d9ba

File tree

9 files changed

+61
-0
lines changed

9 files changed

+61
-0
lines changed

compiler/src/dotty/tools/repl/ReplCompiler.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@ class ReplCompiler extends Compiler {
8888
var valIdx = state.valIndex
8989
val defs = new mutable.ListBuffer[Tree]
9090

91+
/** If the user inputs a definition whose name is of the form REPL_RES_PREFIX and a number,
92+
* such as `val res9 = 1`, we bump `valIdx` to avoid name clashes. lampepfl/dotty#3536 */
93+
def maybeBumpValIdx(tree: Tree): Unit = tree match
94+
case apply: Apply => for a <- apply.args do maybeBumpValIdx(a)
95+
case tuple: Tuple => for t <- tuple.trees do maybeBumpValIdx(t)
96+
case patDef: PatDef => for p <- patDef.pats do maybeBumpValIdx(p)
97+
case tree: NameTree => tree.name.show.stripPrefix(str.REPL_RES_PREFIX).toIntOption match
98+
case Some(n) if n >= valIdx => valIdx = n + 1
99+
case _ =>
100+
case _ =>
101+
91102
flattened.foreach {
92103
case expr @ Assign(id: Ident, _) =>
93104
// special case simple reassignment (e.g. x = 3)
@@ -101,6 +112,7 @@ class ReplCompiler extends Compiler {
101112
val vd = ValDef(resName, TypeTree(), expr).withSpan(expr.span)
102113
defs += vd
103114
case other =>
115+
maybeBumpValIdx(other)
104116
defs += other
105117
}
106118

compiler/test-resources/repl/i3536

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
scala> val res0 = 1
2+
val res0: Int = 1
3+
4+
scala> res0
5+
val res1: Int = 1
6+
7+
8+
scala> val res99 = 9
9+
val res99: Int = 9
10+
11+
scala> res99
12+
val res100: Int = 9
13+
14+
15+
scala> val res50 = 5
16+
val res50: Int = 5
17+
18+
scala> res50
19+
val res101: Int = 5
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
scala> val res10 @ Some(_) = Option(1)
2+
val res10: Some[Int] = Some(1)
3+
scala> res10
4+
val res11: Some[Int] = Some(1)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
scala> def res20 = 1
2+
def res20: Int
3+
scala> res20
4+
val res21: Int = 1
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
scala> object res30 { override def toString = "res30" }
2+
// defined object res30
3+
scala> res30
4+
val res31: res30.type = res30
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
scala> val Some((res40, res41)) = Option((1, 0))
2+
val res40: Int = 1
3+
val res41: Int = 0
4+
scala> res40
5+
val res42: Int = 1
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
scala> val (res40, res41) = (1, 0)
2+
val res40: Int = 1
3+
val res41: Int = 0
4+
scala> res40
5+
val res42: Int = 1
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
scala> type res50 = Int
2+
// defined alias type res50 = Int
3+
scala> 1
4+
val res51: Int = 1
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
scala> var res60 = 1
2+
var res60: Int = 1
3+
scala> res60
4+
val res61: Int = 1

0 commit comments

Comments
 (0)