All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalamacros.paradise.parser.Precedence.scala Maven / Gradle / Ivy

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)
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy