summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-01 11:20:10 -0700
committerLi Haoyi <haoyi@dropbox.com>2014-11-01 11:20:10 -0700
commit02099a8b3bcedc63052306b85aad09dbfa719464 (patch)
treefde1350ff133929900d65fd16ff7b18674d41fd4
parent0d91fb8632b4f7db48778c15f0a9699f82f92e6c (diff)
downloadhands-on-scala-js-02099a8b3bcedc63052306b85aad09dbfa719464.tar.gz
hands-on-scala-js-02099a8b3bcedc63052306b85aad09dbfa719464.tar.bz2
hands-on-scala-js-02099a8b3bcedc63052306b85aad09dbfa719464.zip
Error messages in argument lists work
-rw-r--r--scalatexApi/src/main/scala/scalatex/stages/Compiler.scala29
-rw-r--r--scalatexApi/src/test/scala/scalatex/ErrorTests.scala623
2 files changed, 336 insertions, 316 deletions
diff --git a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
index 292610c..618402c 100644
--- a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
+++ b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala
@@ -121,16 +121,35 @@ object Compiler{
val res = atPos(posFor(fragPos.point + b.offset))(q"$l(..$contentTrees)")
res
- case (l, WN.Block(ws, Some(args), content, _)) =>
+ case (l, b @ WN.Block(ws, Some(args), content, _)) =>
+
val snippet = s"{$args ()}"
val skeleton = c.parse(snippet)
- val Function(vparamss, body) = skeleton
- val func = Function(vparamss, q"Seq[$fragType](..${content.map(compileTree(_))})")
+ val Function(vparams, body) = skeleton
+ println("XXXXX")
+ println(snippet)
+ println("XXXXX")
+ println(vparams.map(showCode(_, printPositions = true)))
+ vparams.map(_.foreach { t =>
+ println(t + "\t" + t.pos)
+ if (t.pos != NoPosition)
+ c.internal.setPos(t, posFor(fragPos.point + t.pos.point))
+ })
+ println(vparams.map(showCode(_, printPositions = true)))
+ println("XXXXX")
+ val contentTrees = content.map{t =>
+ val tree = compileTree(t)
+ c.internal.setPos(tree, posFor(fragPos.point + t.offset))
+ tree
+ }
+
+ val func = Function(vparams, q"Seq[$fragType](..$contentTrees)")
c.internal.setPos(func, posFor(fragPos.point + skeleton.pos.point))
val res = q"$l($func)"
- c.internal.setPos(res, fragPos)
- println("BB " + res)
+ c.internal.setPos(res, posFor(fragPos.point + b.offset))
+ println(showCode(res, printPositions = true))
+ println("XXXXX")
res
}
diff --git a/scalatexApi/src/test/scala/scalatex/ErrorTests.scala b/scalatexApi/src/test/scala/scalatex/ErrorTests.scala
index 0a68550..e377965 100644
--- a/scalatexApi/src/test/scala/scalatex/ErrorTests.scala
+++ b/scalatexApi/src/test/scala/scalatex/ErrorTests.scala
@@ -28,321 +28,322 @@ object ErrorTests extends TestSuite{
}
val tests = TestSuite{
-//
-//
-// 'simple - check(
-// twRuntimeErrors("omg @notInScope lol"),
-// """not found: value notInScope""",
-// """
-// twRuntimeErrors("omg @notInScope lol"),
-// ^
-// """
-// )
-//
-// 'chained{
-// 'properties {
-// * - check(
-// twRuntimeErrors("omg @math.lol lol"),
-// """object lol is not a member of package math""",
-// """
-// twRuntimeErrors("omg @math.lol lol"),
-// ^
-// """
-// )
-//
-// * - check(
-// twRuntimeErrors("omg @math.E.lol lol"),
-// """value lol is not a member of Double""",
-// """
-// twRuntimeErrors("omg @math.E.lol lol"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("omg @_root_.scala.math.lol lol"),
-// """object lol is not a member of package math""",
-// """
-// twRuntimeErrors("omg @_root_.scala.math.lol lol"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("omg @_root_.scala.gg.lol lol"),
-// """object gg is not a member of package scala""",
-// """
-// twRuntimeErrors("omg @_root_.scala.gg.lol lol"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("omg @_root_.ggnore.math.lol lol"),
-// """object ggnore is not a member of package <root>""",
-// """
-// twRuntimeErrors("omg @_root_.ggnore.math.lol lol"),
-// ^
-// """
-// )
-// }
-// 'calls{
-// * - check(
-// twRuntimeErrors("@scala.QQ.abs(-10).tdo(10).sum.z"),
-// """object QQ is not a member of package scala""",
-// """
-// twRuntimeErrors("@scala.QQ.abs(-10).tdo(10).sum.z"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@scala.math.abs(-10).tdo(10).sum.z"),
-// "value tdo is not a member of Int",
-// """
-// twRuntimeErrors("@scala.math.abs(-10).tdo(10).sum.z"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z"),
-// "value z is not a member of Int",
-// """
-// twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z()"),
-// "value z is not a member of Int",
-// """
-// twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z()"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@scala.math.abs(-10).cow.sum.z"),
-// "value cow is not a member of Int",
-// """
-// twRuntimeErrors("@scala.math.abs(-10).cow.sum.z"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@scala.smath.abs.cow.sum.z"),
-// "object smath is not a member of package scala",
-// """
-// twRuntimeErrors("@scala.smath.abs.cow.sum.z"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("""
-// I am cow hear me moo
-// @scala.math.abs(-10).tdo(10).sum.z
-// I weigh twice as much as you
-// """),
-// "value tdo is not a member of Int",
-// """
-// @scala.math.abs(-10).tdo(10).sum.z
-// ^
-// """
-// )
-// }
-// 'curlies{
-// * - check(
-// twRuntimeErrors("@p{@Seq(1, 2, 3).foldLeft(0)}"),
-// "missing arguments for method foldLeft",
-// """
-// twRuntimeErrors("@p{@Seq(1, 2, 3).foldLeft(0)}"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@Nil.foldLeft{XY}"),
-// "missing arguments for method foldLeft",
-// """
-// twRuntimeErrors("@Nil.foldLeft{XY}"),
-// ^
-// """
-// )
+
+ 'simple - check(
+ twRuntimeErrors("omg @notInScope lol"),
+ """not found: value notInScope""",
+ """
+ twRuntimeErrors("omg @notInScope lol"),
+ ^
+ """
+ )
+
+ 'chained{
+ 'properties {
* - check(
- twRuntimeErrors("@Seq(1).map{x => XY}"),
- "missing arguments for method foldLeft",
- """
- twRuntimeErrors("@Nil.foldLeft{XY}"),
+ twRuntimeErrors("omg @math.lol lol"),
+ """object lol is not a member of package math""",
+ """
+ twRuntimeErrors("omg @math.lol lol"),
+ ^
+ """
+ )
+
+ * - check(
+ twRuntimeErrors("omg @math.E.lol lol"),
+ """value lol is not a member of Double""",
+ """
+ twRuntimeErrors("omg @math.E.lol lol"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("omg @_root_.scala.math.lol lol"),
+ """object lol is not a member of package math""",
+ """
+ twRuntimeErrors("omg @_root_.scala.math.lol lol"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("omg @_root_.scala.gg.lol lol"),
+ """object gg is not a member of package scala""",
+ """
+ twRuntimeErrors("omg @_root_.scala.gg.lol lol"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("omg @_root_.ggnore.math.lol lol"),
+ """object ggnore is not a member of package <root>""",
+ """
+ twRuntimeErrors("omg @_root_.ggnore.math.lol lol"),
+ ^
+ """
+ )
+ }
+ 'calls{
+ * - check(
+ twRuntimeErrors("@scala.QQ.abs(-10).tdo(10).sum.z"),
+ """object QQ is not a member of package scala""",
+ """
+ twRuntimeErrors("@scala.QQ.abs(-10).tdo(10).sum.z"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("@scala.math.abs(-10).tdo(10).sum.z"),
+ "value tdo is not a member of Int",
+ """
+ twRuntimeErrors("@scala.math.abs(-10).tdo(10).sum.z"),
^
+ """
+ )
+ * - check(
+ twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z"),
+ "value z is not a member of Int",
+ """
+ twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z()"),
+ "value z is not a member of Int",
+ """
+ twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z()"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("@scala.math.abs(-10).cow.sum.z"),
+ "value cow is not a member of Int",
+ """
+ twRuntimeErrors("@scala.math.abs(-10).cow.sum.z"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("@scala.smath.abs.cow.sum.z"),
+ "object smath is not a member of package scala",
+ """
+ twRuntimeErrors("@scala.smath.abs.cow.sum.z"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("""
+ I am cow hear me moo
+ @scala.math.abs(-10).tdo(10).sum.z
+ I weigh twice as much as you
+ """),
+ "value tdo is not a member of Int",
+ """
+ @scala.math.abs(-10).tdo(10).sum.z
+ ^
+ """
+ )
+ }
+ 'curlies{
+ * - check(
+ twRuntimeErrors("@p{@Seq(1, 2, 3).foldLeft(0)}"),
+ "missing arguments for method foldLeft",
+ """
+ twRuntimeErrors("@p{@Seq(1, 2, 3).foldLeft(0)}"),
+ ^
+ """
+ )
+
+ * - check(
+ twRuntimeErrors("@Nil.foldLeft{XY}"),
+ "missing arguments for method foldLeft",
+ """
+ twRuntimeErrors("@Nil.foldLeft{XY}"),
+ ^
+ """
+ )
+
+ * - check(
+ twRuntimeErrors("@Nil.map{(x: Int, y: String) => omg}"),
+ "type mismatch",
+ """
+ twRuntimeErrors("@Nil.map{(x: Int, y: String) => omg}"),
+ ^
"""
)
-// }
-// 'callContents{
-// * - check(
-// twRuntimeErrors("@scala.math.abs((1, 2).wtf)"),
-// "value wtf is not a member of (Int, Int)",
-// """
-// twRuntimeErrors("@scala.math.abs((1, 2).wtf)"),
-// ^
-// """
-// )
-//
-// * - check(
-// twRuntimeErrors("@scala.math.abs((1, 2).swap._1.toString().map(_.toString.wtf))"),
-// "value wtf is not a member of String",
-// """
-// twRuntimeErrors("@scala.math.abs((1, 2).swap._1.toString().map(_.toString.wtf))"),
-// ^
-// """
-// )
-// }
-// }
-// 'ifElse{
-// 'oneLine {
-// * - check(
-// twRuntimeErrors("@if(math > 10){ 1 }else{ 2 }"),
-// "object > is not a member of package math",
-// """
-// twRuntimeErrors("@if(math > 10){ 1 }else{ 2 }"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@if(true){ (@math.pow(10)) * 10 }else{ 2 }"),
-// "Unspecified value parameter y",
-// """
-// twRuntimeErrors("@if(true){ (@math.pow(10)) * 10 }else{ 2 }"),
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("@if(true){ * 10 }else{ @math.sin(3, 4, 5) }"),
-// "too many arguments for method sin: (x: Double)Double",
-// """
-// twRuntimeErrors("@if(true){ * 10 }else{ @math.sin(3, 4, 5) }"),
-// ^
-// """
-// )
-// }
-// 'multiLine{
-// * - check(
-// twRuntimeErrors("""
-// Ho Ho Ho
-//
-// @if(math != 10)
-// I am a cow
-// @else
-// You are a cow
-// GG
-// """),
-// "object != is not a member of package math",
-// """
-// @if(math != 10)
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("""
-// Ho Ho Ho
-//
-// @if(4 != 10)
-// I am a cow @math.lols
-// @else
-// You are a cow
-// GG
-// """),
-// "object lols is not a member of package math",
-// """
-// I am a cow @math.lols
-// ^
-// """
-// )
-// * - check(
-// twRuntimeErrors("""
-// Ho Ho Ho
-//
-// @if(12 != 10)
-// I am a cow
-// @else
-// @math.E.toString.gog(1)
-// GG
-// """),
-// "value gog is not a member of String",
-// """
-// @math.E.toString.gog(1)
-// ^
-// """
-// )
-// }
-// }
-// 'forLoop{
-// 'oneLine{
-// 'header - check(
-// twRuntimeErrors("omg @for(x <- (0 + 1 + 2) omglolol (10 + 11 + 2)){ hello }"),
-// """value omglolol is not a member of Int""",
-// """
-// twRuntimeErrors("omg @for(x <- (0 + 1 + 2) omglolol (10 + 11 + 2)){ hello }"),
-// ^
-// """
-// )
-//
-// 'body - check(
-// twRuntimeErrors("omg @for(x <- 0 until 10){ @((x, 2) + (1, 2)) }"),
-// """too many arguments for method +""",
-// """
-// twRuntimeErrors("omg @for(x <- 0 until 10){ @((x, 2) + (1, 2)) }"),
-// ^
-// """
-// )
-// }
-// 'multiLine{
-// 'body - check(
-// twRuntimeErrors("""
-// omg
-// @for(x <- 0 until 10)
-// I am cow hear me moo
-// I weigh twice as much as @x.kkk
-// """),
-// """value kkk is not a member of Int""",
-// """
-// I weigh twice as much as @x.kkk
-// ^
-// """
-// )
-// }
-// }
-// 'multiLine{
-// 'missingVar - check(
-// twRuntimeErrors("""
-// omg @notInScope lol
-// """),
-// """not found: value notInScope""",
-// """
-// omg @notInScope lol
-// ^
-// """
-// )
-// 'wrongType - check(
-// twRuntimeErrors("""
-// omg @{() => ()} lol
-// """),
-// """type mismatch""",
-// """
-// omg @{() => ()} lol
-// ^
-// """
-// )
-//
-// 'bigExpression - check(
-// twRuntimeErrors("""
-// @{
-// val x = 1 + 2
-// val y = new Object()
-// val z = y * x
-// x
-// }
-// """),
-// "value * is not a member of Object",
-// """
-// val z = y * x
-// ^
-// """
-// )
-// }
+ }
+ 'callContents{
+ * - check(
+ twRuntimeErrors("@scala.math.abs((1, 2).wtf)"),
+ "value wtf is not a member of (Int, Int)",
+ """
+ twRuntimeErrors("@scala.math.abs((1, 2).wtf)"),
+ ^
+ """
+ )
+
+ * - check(
+ twRuntimeErrors("@scala.math.abs((1, 2).swap._1.toString().map(_.toString.wtf))"),
+ "value wtf is not a member of String",
+ """
+ twRuntimeErrors("@scala.math.abs((1, 2).swap._1.toString().map(_.toString.wtf))"),
+ ^
+ """
+ )
+ }
+ }
+ 'ifElse{
+ 'oneLine {
+ * - check(
+ twRuntimeErrors("@if(math > 10){ 1 }else{ 2 }"),
+ "object > is not a member of package math",
+ """
+ twRuntimeErrors("@if(math > 10){ 1 }else{ 2 }"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("@if(true){ (@math.pow(10)) * 10 }else{ 2 }"),
+ "Unspecified value parameter y",
+ """
+ twRuntimeErrors("@if(true){ (@math.pow(10)) * 10 }else{ 2 }"),
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("@if(true){ * 10 }else{ @math.sin(3, 4, 5) }"),
+ "too many arguments for method sin: (x: Double)Double",
+ """
+ twRuntimeErrors("@if(true){ * 10 }else{ @math.sin(3, 4, 5) }"),
+ ^
+ """
+ )
+ }
+ 'multiLine{
+ * - check(
+ twRuntimeErrors("""
+ Ho Ho Ho
+
+ @if(math != 10)
+ I am a cow
+ @else
+ You are a cow
+ GG
+ """),
+ "object != is not a member of package math",
+ """
+ @if(math != 10)
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("""
+ Ho Ho Ho
+
+ @if(4 != 10)
+ I am a cow @math.lols
+ @else
+ You are a cow
+ GG
+ """),
+ "object lols is not a member of package math",
+ """
+ I am a cow @math.lols
+ ^
+ """
+ )
+ * - check(
+ twRuntimeErrors("""
+ Ho Ho Ho
+
+ @if(12 != 10)
+ I am a cow
+ @else
+ @math.E.toString.gog(1)
+ GG
+ """),
+ "value gog is not a member of String",
+ """
+ @math.E.toString.gog(1)
+ ^
+ """
+ )
+ }
+ }
+ 'forLoop{
+ 'oneLine{
+ 'header - check(
+ twRuntimeErrors("omg @for(x <- (0 + 1 + 2) omglolol (10 + 11 + 2)){ hello }"),
+ """value omglolol is not a member of Int""",
+ """
+ twRuntimeErrors("omg @for(x <- (0 + 1 + 2) omglolol (10 + 11 + 2)){ hello }"),
+ ^
+ """
+ )
+
+ 'body - check(
+ twRuntimeErrors("omg @for(x <- 0 until 10){ @((x, 2) + (1, 2)) }"),
+ """too many arguments for method +""",
+ """
+ twRuntimeErrors("omg @for(x <- 0 until 10){ @((x, 2) + (1, 2)) }"),
+ ^
+ """
+ )
+ }
+ 'multiLine{
+ 'body - check(
+ twRuntimeErrors("""
+ omg
+ @for(x <- 0 until 10)
+ I am cow hear me moo
+ I weigh twice as much as @x.kkk
+ """),
+ """value kkk is not a member of Int""",
+ """
+ I weigh twice as much as @x.kkk
+ ^
+ """
+ )
+ }
+ }
+ 'multiLine{
+ 'missingVar - check(
+ twRuntimeErrors("""
+ omg @notInScope lol
+ """),
+ """not found: value notInScope""",
+ """
+ omg @notInScope lol
+ ^
+ """
+ )
+ 'wrongType - check(
+ twRuntimeErrors("""
+ omg @{() => ()} lol
+ """),
+ """type mismatch""",
+ """
+ omg @{() => ()} lol
+ ^
+ """
+ )
+
+ 'bigExpression - check(
+ twRuntimeErrors("""
+ @{
+ val x = 1 + 2
+ val y = new Object()
+ val z = y * x
+ x
+ }
+ """),
+ "value * is not a member of Object",
+ """
+ val z = y * x
+ ^
+ """
+ )
+ }
}
}