summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-12-12 03:31:40 +0000
committerPaul Phillips <paulp@improving.org>2010-12-12 03:31:40 +0000
commite61fb59b9db0f5d24fdffe760536c2e5431546f8 (patch)
treeca97573fac699ff815902b74f5e7cac778b2b8a2
parent6c59d99c5e1efcd5dae0cd5fb7ecf4fe7cba7408 (diff)
downloadscala-e61fb59b9db0f5d24fdffe760536c2e5431546f8.tar.gz
scala-e61fb59b9db0f5d24fdffe760536c2e5431546f8.tar.bz2
scala-e61fb59b9db0f5d24fdffe760536c2e5431546f8.zip
A little more finnesse needed with backquoting.
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreePrinters.scala26
-rw-r--r--test/files/run/repl-backticks.check2
-rw-r--r--test/files/run/repl-backticks.scala18
3 files changed, 35 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
index 8d36bae609..a99ec1f42f 100644
--- a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
@@ -18,9 +18,12 @@ trait TreePrinters { trees: SymbolTable =>
final val showOuterTests = false
/** Adds backticks if the name is a scala keyword. */
- def quotedName(name: Name): String =
- if (nme.keywords(name.toTermName)) "`%s`" format name
- else name.toString
+ def quotedName(name: Name, decode: Boolean): String = {
+ val s = if (decode) name.decode else name.toString
+ if (nme.keywords(name.toTermName)) "`%s`" format s
+ else s
+ }
+ def quotedName(name: Name): String = quotedName(name, false)
/** Turns a path into a String, introducing backquotes
* as necessary.
@@ -116,12 +119,11 @@ trait TreePrinters { trees: SymbolTable =>
private def ifSym(tree: Tree, p: Symbol => Boolean) = symFn(tree, p, false)
private def symNameInternal(tree: Tree, name: Name, decoded: Boolean): String = {
- val nameToString: Name => String = if (decoded) _.decode else quotedName
def nameFn(sym: Symbol) = {
- val prefix = if (sym.isMixinConstructor) "/*%s*/".format(nameToString(sym.owner.name)) else ""
+ val prefix = if (sym.isMixinConstructor) "/*%s*/".format(quotedName(sym.owner.name, decoded)) else ""
prefix + tree.symbol.nameString
}
- symFn(tree, nameFn, nameToString(name))
+ symFn(tree, nameFn, quotedName(name, decoded))
}
def decodedSymName(tree: Tree, name: Name) = symNameInternal(tree, name, true)
@@ -154,7 +156,7 @@ trait TreePrinters { trees: SymbolTable =>
}
def print(str: String) { out.print(str) }
- def print(name: Name) { print(name.toString()) }
+ def print(name: Name) { print(quotedName(name)) }
private var currentOwner: Symbol = NoSymbol
private var selectorType: Type = NoType
@@ -219,9 +221,11 @@ trait TreePrinters { trees: SymbolTable =>
case Import(expr, selectors) =>
// Is this selector remapping a name (i.e, {name1 => name2})
def isNotRemap(s: ImportSelector) : Boolean = (s.name == nme.WILDCARD || s.name == s.rename)
- def selectorToString(s: ImportSelector): String =
- if (isNotRemap(s)) s.name.toString else s.name + "=>" + s.rename
-
+ def selectorToString(s: ImportSelector): String = {
+ val from = quotedName(s.name)
+ if (isNotRemap(s)) from
+ else from + "=>" + quotedName(s.rename)
+ }
print("import "); print(backquotedPath(expr))
print(".")
selectors match {
@@ -509,7 +513,7 @@ trait TreePrinters { trees: SymbolTable =>
case Select(qualifier, name) =>
printRaw(qualifier)
print(".")
- print(name.decode)
+ print(quotedName(name, true))
// target.toString() ==> target.toString
case Apply(fn, Nil) => printRaw(fn)
diff --git a/test/files/run/repl-backticks.check b/test/files/run/repl-backticks.check
new file mode 100644
index 0000000000..c0561abd7c
--- /dev/null
+++ b/test/files/run/repl-backticks.check
@@ -0,0 +1,2 @@
+import java.lang.Thread.`yield`
+import scala.`package`.Throwable
diff --git a/test/files/run/repl-backticks.scala b/test/files/run/repl-backticks.scala
new file mode 100644
index 0000000000..94e34d1438
--- /dev/null
+++ b/test/files/run/repl-backticks.scala
@@ -0,0 +1,18 @@
+import scala.tools.nsc._
+
+object Test {
+ val testCode = <code>
+ import java.lang.Thread.`yield`
+ import scala.`package`.Throwable
+
+ `yield`
+ </code>.text
+
+ def main(args: Array[String]) = {
+ val settings = new Settings()
+ settings.classpath.value = System.getProperty("java.class.path")
+ val repl = new Interpreter(settings)
+ repl.interpret(testCode)
+ }
+}
+