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

org.sazabi.regexmacro.Impl.scala Maven / Gradle / Ivy

package org.sazabi.regexmacro

import java.util.regex.Pattern
import scala.language.experimental.macros
import scala.reflect.macros.whitebox

class Impl(val c: whitebox.Context) {
  import c.universe._

  def apply_impl(args: Tree*): Tree = {
    checkRegexSyntax(extractParts().mkString(" "))

    val sc = c.prefix.tree match { case q"""$a($tree).$b""" => tree }

    val pats = q"""_root_.scala.collection.Seq[String](..$args).map(
      _root_.java.util.regex.Pattern.quote)"""

    q"new _root_.scala.util.matching.Regex($sc.raw($pats: _*))"
  }

  def unapplySeq_impl(target: Tree): Tree = {
    val regex = extractParts().mkString("(.*)")

    checkRegexSyntax(regex)

    q"$regex.r.unapplySeq($target)"
  }

  private def extractParts(): Seq[String] = {
    c.prefix.tree match {
      case q"$a($b(..$xs)).$c" => xs.map { case q"${x: String}" => x }
    }
  }

  private[this] def checkRegexSyntax(re: String) {
    try {
      Pattern.compile(re)
    } catch {
      case e: java.util.regex.PatternSyntaxException => {
        c.abort(c.enclosingPosition, f"Syntax error in regex: ${e.getMessage}")
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy