8000 Opt VCs nested in modules out of class-based-repl · scala/scala@1588de1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 1588de1

Browse files
committed
Opt VCs nested in modules out of class-based-repl
1 parent 88b531d commit 1588de1

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,18 +198,32 @@ trait MemberHandlers {
198198
class ModuleHandler(module: ModuleDef) extends MemberDefHandler(module) {
199199
override def definesTerm = Some(name.toTermName)
200200
override def definesValue = true
201+
override def definesValueClass = {
202+
var foundValueClass = false
203+
new Traverser {
204+
override def traverse(tree: Tree): Unit = tree match {
205+
case _ if foundValueClass => ()
206+
case cdef: ClassDef if isValueClass(cdef) => foundValueClass = true
207+
case mdef: ModuleDef => traverseStats(mdef.impl.body, mdef.impl.symbol)
208+
case _ => () // skip anything else
209+
}
210+
}.traverse(module)
211+
foundValueClass
212+
}
201213

202214
override def resultExtractionCode(req: Request) = codegenln("defined object ", name)
203215
}
204216

217+
private def isValueClass(cdef: ClassDef) = cdef.impl.parents match {
218+
case Ident(tpnme.AnyVal) :: _ => true // approximating with a syntactic check
219+
case _ => false
220+
}
221+
205222
class ClassHandler(member: ClassDef) extends MemberDefHandler(member) {
206223
override def definedSymbols = List(symbol, symbol.companionSymbol) filterNot (_ == NoSymbol)
207224
override def definesType = Some(name.toTypeName)
208225
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-
}
226+
override def definesValueClass = isValueClass(member)
213227

214228
override def resultExtractionCode(req: Request) =
215229
codegenln("defined %s %s".format(keyword, name))

test/files/run/repl-class-based-value-class.check

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,16 @@ defined class Meter
55
scala> val x = new Meter(1)
66
x: Meter = Meter@XXXXXXXX
77

8+
scala> object T { class Meter(val value: Int) extends AnyVal }
9+
defined object T
10+
11+
scala> val y = new T.Meter(2)
12+
y: T.Meter = T$Meter@XXXXXXXX
13+
14+
scala> object S { object T { class Meter(val value: Int) extends AnyVal } }
15+
defined object S
16+
17+
scala> val z = new S.T.Meter(3)
18+
z: S.T.Meter = S$T$Meter@XXXXXXXX
19+
820
scala> :quit

test/files/run/repl-class-based-value-class.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,9 @@ object Test extends ReplTest with Hashless {
1111
def code = """
1212
|class Meter(val value: Int) extends AnyVal
1313
|val x = new Meter(1)
14+
|object T { class Meter(val value: Int) extends AnyVal }
15+
|val y = new T.Meter(2)
16+
|object S { object T { class Meter(val value: Int) extends AnyVal } }
17+
|val z = new S.T.Meter(3)
1418
|""".stripMargin
1519
}

0 commit comments

Comments
 (0)
0