diff options
author | Paul Phillips <paulp@improving.org> | 2013-10-13 06:34:04 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2013-11-08 11:09:20 -0800 |
commit | a38c36d4ce90e5c50adcc2e56b54aae0a668fa8f (patch) | |
tree | 9d1a64fadaf6b007da0122db241b26fe0b175397 | |
parent | 4cdce8546181d96db1b982f00ff4cd229aa0bd2f (diff) | |
download | scala-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.scala | 38 |
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) + } +} |