Skip to content

Commit

Permalink
Merge pull request #27 from mcheshkov/sharp_error
Browse files Browse the repository at this point in the history
Proper handle #error tokens
  • Loading branch information
Simn committed Apr 2, 2015
2 parents 3ce6e7b + a3baf16 commit 317838b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/haxeparser/HaxeParser.hx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ enum ParserErrorMsg {
MissingType;
DuplicateDefault;
UnclosedMacro;
Unimplemented;
Custom(s:String);
}

Expand Down Expand Up @@ -124,9 +125,12 @@ class HaxeTokenSource {
var state = getSt();
switch [tk.tok,state] {
case [CommentLine(_) | Comment(_) | Sharp("line"),_]:
case [Sharp("error"),_]:
tk = condParser.peek(0);
switch tk.tok {case Const(CString(_)):tk = lexerToken();case _:}
case [Sharp("error"),Consume]:
var nextTok = lexerToken();
switch nextTok.tok {
case Const(CString(str)):throw new ParserError(Custom(str), tk.pos);
case _:throw new ParserError(Unimplemented, tk.pos);
}
case [Sharp("if"),Consume]:
mstack.push(tk.pos);
pushSt( enterMacro() ? Consume : SkipBranch );
Expand Down
36 changes: 36 additions & 0 deletions test/Test.hx
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,39 @@ class Test extends haxe.unit.TestCase {
perr("#if false class C{} #elseif true class C{} #else");
}

function testError() {
eeq("#if true 1 #else #error #end", "1");
eeq("#if false #error #else 2 #end", "2");
eeq("#if true 1 #else #error \"Test failed\" #end", "1");
eeq("#if false #error \"Test failed\" #else 2 #end", "2");

var err = null;

err = perr("#if true #error #else 2 #end");
assertTrue(Std.is(err, haxeparser.HaxeParser.ParserError));
assertEquals(haxeparser.HaxeParser.ParserErrorMsg.Unimplemented, err.msg);
assertEquals(9, err.pos.min);
assertEquals(15, err.pos.max);

err = perr("#if false 1 #else #error #end");
assertTrue(Std.is(err, haxeparser.HaxeParser.ParserError));
assertEquals(haxeparser.HaxeParser.ParserErrorMsg.Unimplemented, err.msg);
assertEquals(18, err.pos.min);
assertEquals(24, err.pos.max);

err = perr("#if true #error \"Test passed\" #else 2 #end");
assertTrue(Std.is(err, haxeparser.HaxeParser.ParserError));
assertTrue(err.msg.match(haxeparser.HaxeParser.ParserErrorMsg.Custom("Test passed")));
assertEquals(9, err.pos.min);
assertEquals(15, err.pos.max);

err = perr("#if false 1 #else #error \"Test passed\" #end");
assertTrue(Std.is(err, haxeparser.HaxeParser.ParserError));
assertTrue(err.msg.match(haxeparser.HaxeParser.ParserErrorMsg.Custom("Test passed")));
assertEquals(18, err.pos.min);
assertEquals(24, err.pos.max);
}

function testMacro(){
var fakePosInfos = {
fileName: "Macro.hx",
Expand Down Expand Up @@ -430,13 +463,16 @@ class Test extends haxe.unit.TestCase {

function perr(inputCode:String, ?p:haxe.PosInfos){
var catchError = false;
var err:Dynamic = null;
try {
parseFile(inputCode);
}
catch (e:Dynamic){
catchError = true;
err = e;
}
assertTrue(catchError);
return err;
}

function peq(inputCode:String, ?expectedCode:String, ?p:haxe.PosInfos) {
Expand Down

0 comments on commit 317838b

Please sign in to comment.