From 02099a8b3bcedc63052306b85aad09dbfa719464 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sat, 1 Nov 2014 11:20:10 -0700 Subject: Error messages in argument lists work --- .../src/main/scala/scalatex/stages/Compiler.scala | 29 +- .../src/test/scala/scalatex/ErrorTests.scala | 623 +++++++++++---------- 2 files changed, 336 insertions(+), 316 deletions(-) (limited to 'scalatexApi') 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 """, -// """ -// 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 """, + """ + 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 + ^ + """ + ) + } } } -- cgit v1.2.3