diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-11-08 23:23:11 -0800 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-11-08 23:23:11 -0800 |
commit | bf512ae9165768ef6c1e4952d14b6b6e9a2f670d (patch) | |
tree | 1b256f5fae5307fd96f7071459ba9b0cf524dfd0 /src/reflect | |
parent | 0e7543e9e969354072ae29f9a091013880cc75e5 (diff) | |
parent | e1fdf86438a6771ff3735a977ca85ba16a99484c (diff) | |
download | scala-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.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) + } +} |