org.scalamacros.paradise.parser.Precedence.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of paradise_2.10.7 Show documentation
Show all versions of paradise_2.10.7 Show documentation
Empowers production Scala compiler with latest macro developments
The newest version!
// NOTE: copy/pasted from scalac with minor patches applied for extensibility required in quasiquotes
// the alternative would be to inherit the existing parser and copy/paste half of it in a random fashion
package org.scalamacros.paradise
package parser
import scala.annotation.switch
import scala.reflect.internal.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 = ""
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)
}
}