diff --git a/src/main/scala/millfork/error/ConsoleLogger.scala b/src/main/scala/millfork/error/ConsoleLogger.scala index c8860e40..fd7c639a 100644 --- a/src/main/scala/millfork/error/ConsoleLogger.scala +++ b/src/main/scala/millfork/error/ConsoleLogger.scala @@ -22,14 +22,17 @@ class ConsoleLogger extends Logger { private def printErrorContext(pos: Option[Position]): Unit = synchronized { pos.foreach { position => sourceLines.get(position.moduleName).foreach { lines => - val line = lines.apply(pos.get.line - 1) - val column = pos.get.column - 1 - val margin = " " - print(margin) - println(line) - print(margin) - print(" " * column) - println("^") + val lineIx = pos.get.line - 1 + if (lineIx < lines.length) { + val line = lines.apply(lineIx) + val column = pos.get.column - 1 + val margin = " " + print(margin) + println(line) + print(margin) + print(" " * column) + println("^") + } } } } diff --git a/src/test/scala/millfork/test/BasicSymonTest.scala b/src/test/scala/millfork/test/BasicSymonTest.scala index d8175e05..e1a45b56 100644 --- a/src/test/scala/millfork/test/BasicSymonTest.scala +++ b/src/test/scala/millfork/test/BasicSymonTest.scala @@ -147,10 +147,14 @@ class BasicSymonTest extends FunSuite with Matchers { test("Segment syntax") { EmuUnoptimizedCrossPlatformRun(Cpu.Mos, Cpu.Z80, Cpu.Intel8080, Cpu.Sharp, Cpu.Intel8086, Cpu.Motorola6809)( """ - | segment(default)byte output @$c000 + | segment ( default ) byte output @$c000 | segment(default)array x[3] | segment(default)void main () { | } + | segment (default) { + | const byte a = 1 + | // + | } """.stripMargin){ m => () } } diff --git a/src/test/scala/millfork/test/ParserSuite.scala b/src/test/scala/millfork/test/ParserSuite.scala new file mode 100644 index 00000000..c7dabc18 --- /dev/null +++ b/src/test/scala/millfork/test/ParserSuite.scala @@ -0,0 +1,56 @@ +package millfork.test + +import millfork.Cpu +import millfork.test.emu.{EmuUnoptimizedCrossPlatformRun, ShouldNotCompile} +import org.scalatest.{FunSuite, Matchers} + +/** + * @author Karol Stasiak + */ +class ParserSuite extends FunSuite with Matchers { + + test("Require space between flags and types") { + ShouldNotCompile( + """ + | constbyte a = 2 + | + """.stripMargin) + } + + test("Comment after last constant") { + EmuUnoptimizedCrossPlatformRun(Cpu.Mos, Cpu.Z80, Cpu.Motorola6809)( + """ + | + | byte __panic() = 1 + | const byte x = 5; + | const byte a = 2; + | + |void main () {}// + | + | + |// + | + """.stripMargin){ m => + + } + } + + test("Allow negation") { + EmuUnoptimizedCrossPlatformRun(Cpu.Mos, Cpu.Z80, Cpu.Motorola6809)( + """ + | array output[100] @$c000 + | const byte x = 5 + | void main() { + | output[0] = -x + | output[1] = 0 | (-x) + | output[2] = 1 * (-x) + | if (x != -x) { output[3] = 5 } + | } + """.stripMargin){ m => + m.readByte(0xc000) should equal(251) + m.readByte(0xc001) should equal(251) + m.readByte(0xc002) should equal(251) + m.readByte(0xc003) should equal(5) + } + } +}