summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2013-10-02 16:47:11 +0200
committerEugene Burmako <xeno.by@gmail.com>2013-10-02 22:46:01 +0200
commitfe074bbca1a9a3ae7d46301d652c5bf0f34e2c6e (patch)
tree402d565771638ee12625b1a0fdb7d441e434bc5d /src
parent5db26e5136c635af062801218fc7edec280e63ff (diff)
downloadscala-fe074bbca1a9a3ae7d46301d652c5bf0f34e2c6e.tar.gz
scala-fe074bbca1a9a3ae7d46301d652c5bf0f34e2c6e.tar.bz2
scala-fe074bbca1a9a3ae7d46301d652c5bf0f34e2c6e.zip
macro bundles are now usable in repl
One of the previous commits relaxed the top-level restriction for bundles, turning it into a requirement of staticness (i.e. bundles nested in static objects are also okay now). This means that we can now define bundles in repl. Almost. There's still a little problem remaining that arises from the fact that when compiling a line of input, repl doesn't automatically import all previously defined symbols, but rather uses an heuristic to scan the input and guess what symbols need to be imported. Unfortunately for bundles, this heuristic fails, because when scanning a macro definition that looks like `def foo = macro Macros.foo`, it thinks that it's only necessary to import a term symbol called Macros (a vanilla way of defining macro impls), but not a type symbol called Macros (a new way of writing macro impls in bundles). This commit fixes the problem by making the repl look for both term and type symbols corresponding to the identifiers used in macro definitions.
Diffstat (limited to 'src')
-rw-r--r--src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala b/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala
index 28b95aa442..f4cbcb50fe 100644
--- a/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala
+++ b/src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala
@@ -87,10 +87,11 @@ trait MemberHandlers {
def definesTerm = Option.empty[TermName]
def definesType = Option.empty[TypeName]
- lazy val referencedNames = ImportVarsTraverser(member)
- def importedNames = List[Name]()
- def definedNames = definesTerm.toList ++ definesType.toList
- def definedSymbols = List[Symbol]()
+ private lazy val _referencedNames = ImportVarsTraverser(member)
+ def referencedNames = _referencedNames
+ def importedNames = List[Name]()
+ def definedNames = definesTerm.toList ++ definesType.toList
+ def definedSymbols = List[Symbol]()
def extraCodeToEvaluate(req: Request): String = ""
def resultExtractionCode(req: Request): String = ""
@@ -130,6 +131,7 @@ trait MemberHandlers {
}
abstract class MacroHandler(member: DefDef) extends MemberDefHandler(member) {
+ override def referencedNames = super.referencedNames.flatMap(name => List(name.toTermName, name.toTypeName))
override def definesValue = false
override def definesTerm: Option[TermName] = Some(name.toTermName)
override def definesType: Option[TypeName] = None