Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Properly display value of value class in repl #15545

Merged
merged 5 commits into from
Jul 1, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/src/dotty/tools/dotc/printing/ReplPrinter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class ReplPrinter(_ctx: Context) extends RefinedPrinter(_ctx) {
if (sym.is(Method)) {
sym.info match {
case tp: ExprType => ":" ~~ toText(tp.resType)
case _ => toText(sym.info)
case info => toText(info)
}
}
else if (sym.isType && sym.info.isTypeAlias) toText(sym.info)
Expand Down
10 changes: 8 additions & 2 deletions compiler/src/dotty/tools/repl/Rendering.scala
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,17 @@ private[repl] class Rendering(parentClassLoader: Option[ClassLoader] = None) {
resObj
.getDeclaredMethods.find(_.getName == sym.name.encode.toString)
.map(_.invoke(null))
val string = value.map(replStringOf(_))

val resultSym = sym.info.classSymbol
val valueString = if (resultSym.isValueClass && !resultSym.isPrimitiveValueClass) then
value.map(value => s"${sym.info.classSymbol.name}@${value.hashCode.toHexString}")
rochala marked this conversation as resolved.
Show resolved Hide resolved
else
value.map(replStringOf(_))

if (!sym.is(Flags.Method) && sym.info == defn.UnitType)
None
else
string.map { s =>
valueString.map { s =>
if (s.startsWith(REPL_WRAPPER_NAME_PREFIX))
s.drop(REPL_WRAPPER_NAME_PREFIX.length).dropWhile(c => c.isDigit || c == '$')
else
Expand Down
107 changes: 107 additions & 0 deletions compiler/test-resources/repl/i15493
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
scala> class NInt(val x: Int) extends AnyVal
// defined class NInt

scala> NInt(23)
val res0: NInt = NInt@17

scala> res0.toString
val res1: String = NInt@17

scala> 23
val res2: Int = 23

scala> class NBoolean(val x: Boolean) extends AnyVal
// defined class NBoolean

scala> NBoolean(true)
val res3: NBoolean = NBoolean@4cf

scala> res3.toString
val res4: String = NBoolean@4cf

scala> true
val res5: Boolean = true

scala> class NByte(val x: Byte) extends AnyVal
// defined class NByte

scala> NByte(1)
val res6: NByte = NByte@1

scala> res6.toString
val res7: String = NByte@1

scala> val res8: Byte = 1
val res8: Byte = 1

scala> class NShort(val x: Short) extends AnyVal
// defined class NShort

scala> NShort(1)
val res9: NShort = NShort@1

scala> res9.toString
val res10: String = NShort@1

scala> val res11: Short = 1
val res11: Short = 1

scala> class NLong(val x: Long) extends AnyVal
// defined class NLong

scala> NLong(1)
val res12: NLong = NLong@1

scala> res12.toString
val res13: String = NLong@1

scala> 1L
val res14: Long = 1

scala> class NFloat(val x: Float) extends AnyVal
// defined class NFloat

scala> NFloat(1L)
val res15: NFloat = NFloat@3f800000

scala> res15.toString
val res16: String = NFloat@3f800000

scala> 1.0F
val res17: Float = 1.0

scala> class NDouble(val x: Double) extends AnyVal
// defined class NDouble

scala> NDouble(1D)
val res18: NDouble = NDouble@3ff00000

scala> res18.toString
val res19: String = NDouble@3ff00000

scala> 1.0D
val res20: Double = 1.0

scala> class NChar(val x: Char) extends AnyVal
// defined class NChar

scala> NChar('a')
val res21: NChar = NChar@61

scala> res21.toString
val res22: String = NChar@61

scala> 'a'
val res23: Char = a

scala> class NString(val x: String) extends AnyVal
// defined class NString

scala> NString("test")
val res24: NString = NString@364492

scala> res24.toString
val res25: String = NString@364492

scala> "test"
val res26: String = test