Skip to content

Commit 2467132

Browse files
author
Som Snytt
committed
Handle assignment ops
1 parent 4e03eb5 commit 2467132

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

src/repl/scala/tools/nsc/interpreter/IMain.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import java.net.URL
1919
import scala.collection.mutable, mutable.ListBuffer
2020
import scala.language.implicitConversions
2121
import scala.reflect.{ClassTag, classTag}
22+
import scala.reflect.internal.{FatalError, Flags, MissingRequirementError, NoPhase, Precedence}
2223
import scala.reflect.internal.util.ScalaClassLoader.URLClassLoader
2324
import scala.reflect.internal.util.{AbstractFileClassLoader, BatchSourceFile, ListOfNil, Position, ReplBatchSourceFile, SourceFile}
24-
import scala.reflect.internal.{FatalError, Flags, MissingRequirementError, NoPhase}
2525
import scala.reflect.runtime.{universe => ru}
2626
import scala.tools.nsc.{Global, Settings}
2727
import scala.tools.nsc.interpreter.Results.{Error, Incomplete, Result, Success}
@@ -813,6 +813,7 @@ class IMain(val settings: Settings, parentClassLoaderOverride: Option[ClassLoade
813813
case init :+ tree =>
814814
def loop(scrut: Tree): Tree = scrut match {
815815
case _: Assign => tree
816+
case Apply(Select(_, op), _) if Precedence(op.decoded).level == 0 => tree
816817
case _: RefTree | _: TermTree => storeInVal(tree)
817818
case Annotated(_, arg) => loop(arg)
818819
case _ => tree

src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ package scala.tools.nsc.interpreter
1515
import scala.language.implicitConversions
1616

1717
import scala.collection.mutable
18+
import scala.reflect.internal.Precedence
1819

1920
trait MemberHandlers {
2021
val intp: IMain
@@ -77,7 +78,9 @@ trait MemberHandlers {
7778
case member: ModuleDef => new ModuleHandler(member)
7879
case member: ClassDef => new ClassHandler(member)
7980
case member: TypeDef => new TypeAliasHandler(member)
80-
case member: Assign => new AssignHandler(member)
81+
case member: Assign => AssignHandler(member)
82+
case member @ Apply(Select(_, op), _)
83+
if Precedence(op.decoded).level == 0 => AssignHandler(member)
8184
case member: Import => new ImportHandler(member.duplicate) // duplicate because the same tree will be type checked (which loses info)
8285
case DocDef(_, documented) => chooseHandler(documented)
8386
case member => new GenericHandler(member)
@@ -175,9 +178,16 @@ trait MemberHandlers {
175178
def notification(req: Request) = s"def ${req.defTypeOf(name)}"
176179
}
177180

178-
class AssignHandler(member: Assign) extends MemberHandler(member) {
181+
class AssignHandler private (member: Tree, lhs: Tree) extends MemberHandler(member) {
179182
override def resultExtractionCode(req: Request) =
180-
codegenln(s"// mutated ${member.lhs}")
183+
codegenln(s"// mutated $lhs")
184+
}
185+
object AssignHandler {
186+
def apply(member: Assign) = new AssignHandler(member, member.lhs)
187+
def apply(member: Apply) = member match {
188+
case Apply(Select(qual, op), _) if Precedence(op.decoded).level == 0 => new AssignHandler(member, qual)
189+
case _ => new GenericHandler(member)
190+
}
181191
}
182192

183193
class ModuleHandler(module: ModuleDef) extends MemberDefHandler(module) {

test/files/run/repl-assign.check

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ scala> x = 12
1111
scala> y = 13
1212
// mutated y
1313

14+
scala> x += 30
15+
// mutated x
16+
1417
scala> :quit

test/files/run/repl-assign.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ var x = 10
66
var y = 11
77
x = 12
88
y = 13
9+
x += 30
910
"""
1011
}

0 commit comments

Comments
 (0)