summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2013-10-13 06:34:04 -0700
committerSom Snytt <som.snytt@gmail.com>2013-11-08 11:09:20 -0800
commita38c36d4ce90e5c50adcc2e56b54aae0a668fa8f (patch)
tree9d1a64fadaf6b007da0122db241b26fe0b175397
parent4cdce8546181d96db1b982f00ff4cd229aa0bd2f (diff)
downloadscala-a38c36d4ce90e5c50adcc2e56b54aae0a668fa8f.tar.gz
scala-a38c36d4ce90e5c50adcc2e56b54aae0a668fa8f.tar.bz2
scala-a38c36d4ce90e5c50adcc2e56b54aae0a668fa8f.zip
A value class for Precedence.
One fewer Int to be whizzing around the parser hoping to be confused with other Ints.
-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)
+ }
+}