summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)
+ }
+}