summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-28 06:46:30 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-28 06:46:30 -0800
commitd6a356156c1f9e8d8f9207b70731cb917fb38ee9 (patch)
tree65e368f70b29e7a2b4c92ddc6724d25bfb79754f
parentccd7035677b30d0707dfded548a9830855335573 (diff)
downloadhands-on-scala-js-d6a356156c1f9e8d8f9207b70731cb917fb38ee9.tar.gz
hands-on-scala-js-d6a356156c1f9e8d8f9207b70731cb917fb38ee9.tar.bz2
hands-on-scala-js-d6a356156c1f9e8d8f9207b70731cb917fb38ee9.zip
All scala-js files are parsed
-rw-r--r--scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala28
-rw-r--r--scalaParser/src/main/scala/scalaParser/syntax/Literals.scala22
-rw-r--r--scalaParser/src/test/resources/test.scala7
-rw-r--r--scalaParser/src/test/scala/scalaParser/SyntaxTest.scala13
4 files changed, 49 insertions, 21 deletions
diff --git a/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala b/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala
index 0792fd9..ef5eb4a 100644
--- a/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala
+++ b/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala
@@ -277,7 +277,9 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
oneOrMore(Pattern1).separatedBy('|')
}
def Pattern1: R0 = rule {
- K.W("_") ~ K.O(":") ~ TypePat | VarId ~ K.O(":") ~ TypePat | Pattern2
+ K.W("_") ~ K.O(":") ~ TypePat |
+ VarId ~ K.O(":") ~ TypePat |
+ Pattern2
}
def Pattern2: R0 = {
def Pattern3: R0 = rule {
@@ -289,18 +291,18 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
def SimplePattern: R0 = {
def Patterns: R0 = rule { K.W("_") ~ '*' | oneOrMore(Pattern).separatedBy(',') }
rule {
- K.W("_") |
- Literal |
- '(' ~ optional(Patterns) ~ ')' |
- (
- StableId ~
- optional(
- '(' ~
- (optional(Patterns ~ ',') ~ optional(VarId ~ '@') ~ K.W("_") ~ '*' | optional(Patterns)) ~
- ')'
- )
- ) |
- VarId
+ K.W("_") ~ optional(K.O(":") ~ TypePat) |
+ Literal |
+ '(' ~ optional(Patterns) ~ ')' |
+ (
+ StableId ~
+ optional(
+ '(' ~
+ (optional(Patterns ~ ',') ~ optional(VarId ~ '@') ~ K.W("_") ~ '*' | optional(Patterns)) ~
+ ')'
+ )
+ ) |
+ VarId
}
}
diff --git a/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala b/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala
index 4e3d119..f854671 100644
--- a/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala
+++ b/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala
@@ -4,6 +4,7 @@ import acyclic.file
import org.parboiled2._
trait Literals { self: Parser with Basic with Identifiers =>
+ def Expr: Rule0
object Literals{
import Basic._
def FloatingPointLiteral = rule {
@@ -23,7 +24,7 @@ trait Literals { self: Parser with Basic with Identifiers =>
def MultilineComment: Rule0 = rule { "/*" ~ zeroOrMore(MultilineComment | !"*/" ~ ANY) ~ "*/" }
def Comment: Rule0 = rule {
MultilineComment |
- "//" ~ zeroOrMore(!Basic.Newline ~ ANY) ~ &(Basic.Newline | EOI)
+ "//" ~ zeroOrMore(!Basic.Newline ~ ANY) ~ &(Basic.Newline | EOI)
}
def Literal = rule {
@@ -36,18 +37,27 @@ trait Literals { self: Parser with Basic with Identifiers =>
}
- def EscapedChars = rule { '\\' ~ anyOf("rnt\\\"") }
+ def EscapedChars = rule { '\\' ~ anyOf("btnfr'\\\"") }
// Note that symbols can take on the same values as keywords!
def SymbolLiteral = rule { ''' ~ (Identifiers.PlainId | Identifiers.Keywords) }
- def CharacterLiteral = rule { ''' ~ (UnicodeExcape | EscapedChars | !'\\' ~ CharPredicate.from(isPrintableChar)) ~ ''' }
+ def CharacterLiteral = rule {
+ ''' ~ (UnicodeExcape | EscapedChars | !'\\' ~ CharPredicate.from(isPrintableChar)) ~ '''
+ }
- def MultiLineChars = rule { zeroOrMore(optional('"') ~ optional('"') ~ noneOf("\"")) }
+ def MultiLineChars = rule {
+ zeroOrMore(Interpolation | optional('"') ~ optional('"') ~ noneOf("\""))
+ }
def pr(s: String) = rule { run(println(s"LOGGING $cursor: $s")) }
+ def Interpolation = rule{
+ "$" ~ Identifiers.Id | "${" ~ Expr ~ "}" | "$$"
+ }
def StringLiteral = rule {
- (optional(Identifiers.Id) ~ "\"\"\"" ~ MultiLineChars ~ ("\"\"\"" ~ zeroOrMore('"'))) |
- (optional(Identifiers.Id) ~ '"' ~ zeroOrMore("\\\"" | "\\\\" | noneOf("\n\"")) ~ '"')
+ (Identifiers.Id ~ "\"\"\"" ~ MultiLineChars ~ ("\"\"\"" ~ zeroOrMore('"'))) |
+ (Identifiers.Id ~ '"' ~ zeroOrMore(Interpolation | "\\\"" | "\\\\" | noneOf("\n\"")) ~ '"') |
+ ("\"\"\"" ~ MultiLineChars ~ ("\"\"\"" ~ zeroOrMore('"'))) |
+ ('"' ~ zeroOrMore("\\\"" | "\\\\" | noneOf("\n\"")) ~ '"')
}
def isPrintableChar(c: Char): Boolean = {
diff --git a/scalaParser/src/test/resources/test.scala b/scalaParser/src/test/resources/test.scala
index 60f93d8..62dd0a3 100644
--- a/scalaParser/src/test/resources/test.scala
+++ b/scalaParser/src/test/resources/test.scala
@@ -1,3 +1,6 @@
-@RawJSType // Don't do this at home!
-sealed trait UndefOr[A]
+object OptimizerCore {
+ tpe match {
+ case NothingType | _:RecordType=> 1
+ }
+}
diff --git a/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala b/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala
index abb17fe..6388d71 100644
--- a/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala
+++ b/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala
@@ -595,6 +595,19 @@ object SyntaxTest extends TestSuite{
|
""".stripMargin
)
+ * - check(
+ """trait Writer{
+ | '\f'
+ |}
+ """.stripMargin
+ )
+ * - check(
+ """object CyclicDependencyException {
+ | def str(info: ResolutionInfo) =
+ | s"${info.resourceName} from: ${info.origins.mkString(", ")}"
+ |}
+ """.stripMargin
+ )
}
'neg{
* - checkNeg(