Skip to content

Commit fd6ea5b

Browse files
committed
repl: Handle value classes in class-based
... by making any code snippet that defines (or seems to define) a value class use the original "object-based" wrappers instead.
1 parent 9871b17 commit fd6ea5b

File tree

4 files changed

+30
-1
lines changed

4 files changed

+30
-1
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,7 @@ class IMain(initialSettings: Settings, protected val out: JPrintWriter) extends
827827

828828
/** handlers for each tree in this request */
829829
val handlers: List[MemberHandler] = trees map (memberHandlers chooseHandler _)
830+
val definesValueClass = handlers.exists(_.definesValueClass)
830831

831832
def defHandlers = handlers collect { case x: MemberDefHandler => x }
832833

@@ -915,7 +916,7 @@ class IMain(initialSettings: Settings, protected val out: JPrintWriter) extends
915916
}
916917

917918
private[interpreter] lazy val ObjectSourceCode: Wrapper =
918-
if (isClassBased) new ClassBasedWrapper else new ObjectBasedWrapper
919+
if (isClassBased && !definesValueClass) new ClassBasedWrapper else new ObjectBasedWrapper
919920

920921
private object ResultObjectSourceCode extends IMain.CodeAssembler[MemberHandler] {
921922
/** We only want to generate this code when the result

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

+5
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ trait MemberHandlers {
9999
def path = intp.originalPath(symbol)
100100
def symbol = if (member.symbol eq null) NoSymbol else member.symbol
101101
def definesImplicit = false
102+
def definesValueClass = false
102103
def definesValue = false
103104

104105
def definesTerm = Option.empty[TermName]
@@ -205,6 +206,10 @@ trait MemberHandlers {
205206
override def definedSymbols = List(symbol, symbol.companionSymbol) filterNot (_ == NoSymbol)
206207
override def definesType = Some(name.toTypeName)
207208
override def definesTerm = Some(name.toTermName) filter (_ => mods.isCase)
209+
override final def definesValueClass: Boolean = member.impl.parents match {
210+
case Ident(tpnme.AnyVal) :: _ => true // approximating with a syntactic check
211+
case _ => false
212+
}
208213

209214
override def resultExtractionCode(req: Request) =
210215
codegenln("defined %s %s".format(keyword, name))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
scala> class Meter(val value: Int) extends AnyVal
3+
defined class Meter
4+
5+
scala> val x = new Meter(1)
6+
x: Meter = Meter@XXXXXXXX
7+
8+
scala> :quit
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import scala.tools.nsc.Settings
2+
import scala.tools.partest.{ Hashless, ReplTest }
3+
4+
object Test extends ReplTest with Hashless {
5+
override def transformSettings(s: Settings) = {
6+
s.Yreplclassbased.value = true
7+
s.YreplMagicImport.value = true
8+
s
9+
}
10+
11+
def code = """
12+
|class Meter(val value: Int) extends AnyVal
13+
|val x = new Meter(1)
14+
|""".stripMargin
15+
}

0 commit comments

Comments
 (0)