diff --git a/compiler/src/dotty/tools/repl/ReplCompiler.scala b/compiler/src/dotty/tools/repl/ReplCompiler.scala index 1bd2323073ae..d80e9871fdee 100644 --- a/compiler/src/dotty/tools/repl/ReplCompiler.scala +++ b/compiler/src/dotty/tools/repl/ReplCompiler.scala @@ -88,6 +88,17 @@ class ReplCompiler extends Compiler { var valIdx = state.valIndex val defs = new mutable.ListBuffer[Tree] + /** If the user inputs a definition whose name is of the form REPL_RES_PREFIX and a number, + * such as `val res9 = 1`, we bump `valIdx` to avoid name clashes. lampepfl/dotty#3536 */ + def maybeBumpValIdx(tree: Tree): Unit = tree match + case apply: Apply => for a <- apply.args do maybeBumpValIdx(a) + case tuple: Tuple => for t <- tuple.trees do maybeBumpValIdx(t) + case patDef: PatDef => for p <- patDef.pats do maybeBumpValIdx(p) + case tree: NameTree => tree.name.show.stripPrefix(str.REPL_RES_PREFIX).toIntOption match + case Some(n) if n >= valIdx => valIdx = n + 1 + case _ => + case _ => + flattened.foreach { case expr @ Assign(id: Ident, _) => // special case simple reassignment (e.g. x = 3) @@ -101,6 +112,7 @@ class ReplCompiler extends Compiler { val vd = ValDef(resName, TypeTree(), expr).withSpan(expr.span) defs += vd case other => + maybeBumpValIdx(other) defs += other } diff --git a/compiler/test-resources/repl/i3536 b/compiler/test-resources/repl/i3536 new file mode 100644 index 000000000000..490909db103a --- /dev/null +++ b/compiler/test-resources/repl/i3536 @@ -0,0 +1,19 @@ +scala> val res0 = 1 +val res0: Int = 1 + +scala> res0 +val res1: Int = 1 + + +scala> val res99 = 9 +val res99: Int = 9 + +scala> res99 +val res100: Int = 9 + + +scala> val res50 = 5 +val res50: Int = 5 + +scala> res50 +val res101: Int = 5 diff --git a/compiler/test-resources/repl/i3536_bind b/compiler/test-resources/repl/i3536_bind new file mode 100644 index 000000000000..96ccdce81356 --- /dev/null +++ b/compiler/test-resources/repl/i3536_bind @@ -0,0 +1,4 @@ +scala> val res10 @ Some(_) = Option(1) +val res10: Some[Int] = Some(1) +scala> res10 +val res11: Some[Int] = Some(1) diff --git a/compiler/test-resources/repl/i3536_defdef b/compiler/test-resources/repl/i3536_defdef new file mode 100644 index 000000000000..04e6045c26c3 --- /dev/null +++ b/compiler/test-resources/repl/i3536_defdef @@ -0,0 +1,4 @@ +scala> def res20 = 1 +def res20: Int +scala> res20 +val res21: Int = 1 diff --git a/compiler/test-resources/repl/i3536_object b/compiler/test-resources/repl/i3536_object new file mode 100644 index 000000000000..181302939423 --- /dev/null +++ b/compiler/test-resources/repl/i3536_object @@ -0,0 +1,4 @@ +scala> object res30 { override def toString = "res30" } +// defined object res30 +scala> res30 +val res31: res30.type = res30 diff --git a/compiler/test-resources/repl/i3536_patterndef_some b/compiler/test-resources/repl/i3536_patterndef_some new file mode 100644 index 000000000000..24c8736b57b9 --- /dev/null +++ b/compiler/test-resources/repl/i3536_patterndef_some @@ -0,0 +1,5 @@ +scala> val Some((res40, res41)) = Option((1, 0)) +val res40: Int = 1 +val res41: Int = 0 +scala> res40 +val res42: Int = 1 diff --git a/compiler/test-resources/repl/i3536_patterndef_tuple b/compiler/test-resources/repl/i3536_patterndef_tuple new file mode 100644 index 000000000000..987c28c3a382 --- /dev/null +++ b/compiler/test-resources/repl/i3536_patterndef_tuple @@ -0,0 +1,5 @@ +scala> val (res40, res41) = (1, 0) +val res40: Int = 1 +val res41: Int = 0 +scala> res40 +val res42: Int = 1 diff --git a/compiler/test-resources/repl/i3536_typedef b/compiler/test-resources/repl/i3536_typedef new file mode 100644 index 000000000000..4db70a4f9c98 --- /dev/null +++ b/compiler/test-resources/repl/i3536_typedef @@ -0,0 +1,4 @@ +scala> type res50 = Int +// defined alias type res50 = Int +scala> 1 +val res51: Int = 1 diff --git a/compiler/test-resources/repl/i3536_var b/compiler/test-resources/repl/i3536_var new file mode 100644 index 000000000000..7467ad84c772 --- /dev/null +++ b/compiler/test-resources/repl/i3536_var @@ -0,0 +1,4 @@ +scala> var res60 = 1 +var res60: Int = 1 +scala> res60 +val res61: Int = 1