summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-11-08 23:23:11 -0800
committerJason Zaugg <jzaugg@gmail.com>2013-11-08 23:23:11 -0800
commitbf512ae9165768ef6c1e4952d14b6b6e9a2f670d (patch)
tree1b256f5fae5307fd96f7071459ba9b0cf524dfd0 /src/reflect
parent0e7543e9e969354072ae29f9a091013880cc75e5 (diff)
parente1fdf86438a6771ff3735a977ca85ba16a99484c (diff)
downloadscala-bf512ae9165768ef6c1e4952d14b6b6e9a2f670d.tar.gz
scala-bf512ae9165768ef6c1e4952d14b6b6e9a2f670d.tar.bz2
scala-bf512ae9165768ef6c1e4952d14b6b6e9a2f670d.zip
Merge pull request #3100 from som-snytt/paulp/reduction
Paulper stack reduction
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/Precedence.scala38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Precedence.scala b/src/reflect/scala/reflect/internal/Precedence.scala
new file mode 100644
index 0000000000..1430838b9d
--- /dev/null
+++ b/src/reflect/scala/reflect/internal/Precedence.scala
@@ -0,0 +1,38 @@
+package scala
+package reflect
+package internal
+
+import scala.annotation.switch
+import Chars._
+
+final class Precedence private (val level: Int) extends AnyVal with Ordered[Precedence] {
+ def compare(that: Precedence): Int = level compare that.level
+ override def toString = s"Precedence($level)"
+}
+
+
+object Precedence extends (Int => Precedence) {
+ private val ErrorName = "<error>"
+ private def isAssignmentOp(name: String) = name match {
+ case "!=" | "<=" | ">=" | "" => false
+ case _ => name.last == '=' && name.head != '=' && isOperatorPart(name.head)
+ }
+ private def firstChar(ch: Char): Precedence = apply((ch: @switch) match {
+ case '|' => 2
+ case '^' => 3
+ case '&' => 4
+ case '=' | '!' => 5
+ case '<' | '>' => 6
+ case ':' => 7
+ case '+' | '-' => 8
+ case '*' | '/' | '%' => 9
+ case _ => if (isScalaLetter(ch)) 1 else 10
+ })
+
+ def apply(level: Int): Precedence = new Precedence(level)
+ def apply(name: String): Precedence = name match {
+ case "" | ErrorName => this(-1)
+ case _ if isAssignmentOp(name) => this(0)
+ case _ => firstChar(name charAt 0)
+ }
+}