mirror of https://github.com/sbt/sbt.git
Merge pull request #3952 from jrudolph/jr/speedup-validId
Speedup Parsers.validID
This commit is contained in:
commit
b393631c90
|
|
@ -12,15 +12,17 @@ import Parser._
|
|||
import java.io.File
|
||||
import java.net.URI
|
||||
import java.lang.Character.{
|
||||
getType,
|
||||
MATH_SYMBOL,
|
||||
OTHER_SYMBOL,
|
||||
CURRENCY_SYMBOL,
|
||||
DASH_PUNCTUATION,
|
||||
OTHER_PUNCTUATION,
|
||||
MATH_SYMBOL,
|
||||
MODIFIER_SYMBOL,
|
||||
CURRENCY_SYMBOL
|
||||
OTHER_PUNCTUATION,
|
||||
OTHER_SYMBOL,
|
||||
getType
|
||||
}
|
||||
|
||||
import scala.annotation.tailrec
|
||||
|
||||
/** Provides standard implementations of commonly useful [[Parser]]s. */
|
||||
trait Parsers {
|
||||
|
||||
|
|
@ -313,6 +315,16 @@ object DefaultParsers extends Parsers with ParserMain {
|
|||
apply(p)(s).resultEmpty.isValid
|
||||
|
||||
/** Returns `true` if `s` parses successfully according to [[ID]].*/
|
||||
def validID(s: String): Boolean = matches(ID, s)
|
||||
def validID(s: String): Boolean = {
|
||||
// Handwritten version of `matches(ID, s)` because validID turned up in profiling.
|
||||
def isIdChar(c: Char): Boolean = Character.isLetterOrDigit(c) || (c == '_')
|
||||
@tailrec def isRestIdChar(cur: Int, s: String, length: Int): Boolean =
|
||||
if (cur < length)
|
||||
isIdChar(s.charAt(cur)) && isRestIdChar(cur + 1, s, length)
|
||||
else
|
||||
true
|
||||
|
||||
!s.isEmpty && Character.isLetter(s.charAt(0)) && isRestIdChar(1, s, s.length)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* sbt
|
||||
* Copyright 2011 - 2017, Lightbend, Inc.
|
||||
* Copyright 2008 - 2010, Mark Harrah
|
||||
* Licensed under BSD-3-Clause license (see LICENSE)
|
||||
*/
|
||||
|
||||
package sbt.internal.util
|
||||
package complete
|
||||
|
||||
import org.scalacheck._, Prop._
|
||||
|
||||
object DefaultParsersSpec extends Properties("DefaultParsers") {
|
||||
import DefaultParsers._
|
||||
|
||||
property("validID == matches(ID, s)") = forAll((s: String) => validID(s) == matches(ID, s))
|
||||
}
|
||||
Loading…
Reference in New Issue