summaryrefslogtreecommitdiff
path: root/examples/scala-js/javalib/src/main/scala/java/util/regex/Pattern.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/javalib/src/main/scala/java/util/regex/Pattern.scala')
-rw-r--r--examples/scala-js/javalib/src/main/scala/java/util/regex/Pattern.scala154
1 files changed, 0 insertions, 154 deletions
diff --git a/examples/scala-js/javalib/src/main/scala/java/util/regex/Pattern.scala b/examples/scala-js/javalib/src/main/scala/java/util/regex/Pattern.scala
deleted file mode 100644
index fda103f..0000000
--- a/examples/scala-js/javalib/src/main/scala/java/util/regex/Pattern.scala
+++ /dev/null
@@ -1,154 +0,0 @@
-package java.util.regex
-
-import scala.annotation.switch
-
-import scala.scalajs.js
-
-final class Pattern private (pattern0: String, flags0: Int)
- extends Serializable {
-
- import Pattern._
-
- def pattern(): String = pattern0
- def flags(): Int = flags1
-
- private[regex] val (jspattern, flags1) = {
- if ((flags0 & LITERAL) != 0) (quote(pattern0), flags0)
- else {
- trySplitHack(pattern0, flags0) orElse
- tryFlagHack(pattern0, flags0) getOrElse
- (pattern0, flags0)
- }
- }
-
- private[regex] val jsflags = {
- var f = "g"
- if ((flags & CASE_INSENSITIVE) != 0)
- f += "i"
- if ((flags & MULTILINE) != 0)
- f += "m"
- f
- }
-
- override def toString(): String = pattern0
-
- def matcher(input: CharSequence): Matcher =
- new Matcher(this, input, 0, input.length)
-
- def split(input: CharSequence): Array[String] =
- split(input, 0)
-
- def split(input: CharSequence, limit: Int): Array[String] = {
- val lim = if (limit > 0) limit else Int.MaxValue
-
- val result = js.Array[String]()
- val inputStr = input.toString
- val matcher = this.matcher(inputStr)
- var prevEnd = 0
-
- // Actually split original string
- while ((result.length < lim-1) && matcher.find()) {
- result.push(inputStr.substring(prevEnd, matcher.start))
- prevEnd = matcher.end
- }
- result.push(inputStr.substring(prevEnd))
-
- // Remove a leading empty element iff the first match was zero-length
- // and there is no other place the regex matches
- if (prevEnd == 0 && result.length == 2 && (lim > 2 || !matcher.find())) {
- Array(inputStr)
- } else {
- var len = result.length
- if (limit == 0) {
- while (len > 1 && result(len-1).isEmpty)
- len -= 1
- }
-
- val actualResult = new Array[String](len)
- result.copyToArray(actualResult)
- actualResult
- }
- }
-}
-
-object Pattern {
- final val UNIX_LINES = 0x01
- final val CASE_INSENSITIVE = 0x02
- final val COMMENTS = 0x04
- final val MULTILINE = 0x08
- final val LITERAL = 0x10
- final val DOTALL = 0x20
- final val UNICODE_CASE = 0x40
- final val CANON_EQ = 0x80
- final val UNICODE_CHARACTER_CLASS = 0x100
-
- def compile(regex: String, flags: Int): Pattern =
- new Pattern(regex, flags)
-
- def compile(regex: String): Pattern =
- new Pattern(regex, 0)
-
- def matches(regex: String, input: CharSequence): Boolean =
- compile(regex).matcher(input).matches()
-
- def quote(s: String): String = {
- var result = ""
- var i = 0
- while (i < s.length) {
- val c = s.charAt(i)
- result += ((c: @switch) match {
- case '\\' | '.' | '(' | ')' | '[' | ']' | '{' | '}' | '|'
- | '?' | '*' | '+' | '^' | '$' => "\\"+c
- case _ => c
- })
- i += 1
- }
- result
- }
-
- /** This is a hack to support StringLike.split().
- * It replaces occurrences of \Q<char>\E by quoted(<char>)
- */
- @inline
- private def trySplitHack(pat: String, flags: Int) = {
- val m = splitHackPat.exec(pat)
- if (m != null)
- Some((quote(m(1).get), flags))
- else
- None
- }
-
- @inline
- private def tryFlagHack(pat: String, flags0: Int) = {
- val m = flagHackPat.exec(pat)
- if (m != null) {
- val newPat = pat.substring(m(0).get.length) // cut off the flag specifiers
- val flags1 = m(1).fold(flags0) { chars =>
- chars.foldLeft(flags0) { (f, c) => f | charToFlag(c) }
- }
- val flags2 = m(2).fold(flags1) { chars =>
- chars.foldLeft(flags1) { (f, c) => f & ~charToFlag(c) }
- }
- Some((newPat, flags2))
- } else
- None
- }
-
- private def charToFlag(c: Char) = (c: @switch) match {
- case 'i' => CASE_INSENSITIVE
- case 'd' => UNIX_LINES
- case 'm' => MULTILINE
- case 's' => DOTALL
- case 'u' => UNICODE_CASE
- case 'x' => COMMENTS
- case 'U' => UNICODE_CHARACTER_CLASS
- case _ => sys.error("bad in-pattern flag")
- }
-
- /** matches \Q<char>\E to support StringLike.split */
- private val splitHackPat = new js.RegExp("^\\\\Q(.|\\n|\\r)\\\\E$")
-
- /** regex to match flag specifiers in regex. E.g. (?u), (?-i), (?U-i) */
- private val flagHackPat =
- new js.RegExp("^\\(\\?([idmsuxU]*)(?:-([idmsuxU]*))?\\)")
-}