Some cleanup

This commit is contained in:
NeeEoo
2024-04-25 17:38:25 +02:00
parent fb8f35e2a5
commit d38ddbb2b4
7 changed files with 73 additions and 42 deletions
+30 -4
View File
@@ -60,8 +60,34 @@ enum Error
EInvalidEscape( s : String );
}
enum abstract ErrorMessage(String) to String {
final INVALID_CHAR_CODE_MULTI = "'char'.code only works on single characters";
final FROM_CHAR_CODE_NON_INT = "String.fromCharCode only works on integers";
final EMPTY_INTERPOLATION = "Invalid interpolation: Expression cannot be empty";
enum abstract ErrorMessage(Int) from Int to Int {
final INVALID_CHAR_CODE_MULTI;
final FROM_CHAR_CODE_NON_INT;
final EMPTY_INTERPOLATION;
final UNKNOWN_MAP_TYPE;
final UNKNOWN_MAP_TYPE_RUNTIME;
final EXPECT_KEY_VALUE_SYNTAX;
public function toString():String {
return switch(cast this) {
case INVALID_CHAR_CODE_MULTI: "'char'.code only works on single characters";
case FROM_CHAR_CODE_NON_INT: "String.fromCharCode only works on integers";
case EMPTY_INTERPOLATION: "Invalid interpolation: Expression cannot be empty";
case UNKNOWN_MAP_TYPE: "Unknown Map Type";
case UNKNOWN_MAP_TYPE_RUNTIME: "Unknown Map Type, while parsing at runtime";
case EXPECT_KEY_VALUE_SYNTAX: "Expected a => b";
}
}
public static function fromString(s:String):ErrorMessage {
return switch(s) {
case "INVALID_CHAR_CODE_MULTI": INVALID_CHAR_CODE_MULTI;
case "FROM_CHAR_CODE_NON_INT": FROM_CHAR_CODE_NON_INT;
case "EMPTY_INTERPOLATION": EMPTY_INTERPOLATION;
case "UNKNOWN_MAP_TYPE": UNKNOWN_MAP_TYPE;
case "UNKNOWN_MAP_TYPE_RUNTIME": UNKNOWN_MAP_TYPE_RUNTIME;
case "EXPECT_KEY_VALUE_SYNTAX": EXPECT_KEY_VALUE_SYNTAX;
default: throw "Unknown ErrorMessage";
}
}
}
+1 -1
View File
@@ -818,7 +818,7 @@ class Interp {
var t = b2i(isKeyString) + b2i(isKeyInt) + b2i(isKeyObject) + b2i(isKeyEnum);
if(t != 1)
error(ECustom("Unknown Map Type"));
error(EPreset(UNKNOWN_MAP_TYPE_RUNTIME));
else if(isKeyInt) type = IntMap;
else if(isKeyString) type = StringMap;
else if(isKeyEnum) type = EnumMap;
+3 -3
View File
@@ -646,7 +646,7 @@ class Parser {
values.push(eValue);
}
default:
error(ECustom("Expected a => b"), p1, p1);
error(EPreset(EXPECT_KEY_VALUE_SYNTAX), p1, p1);
}
}
@@ -658,7 +658,7 @@ class Parser {
isKeyEnum = false;
} else {
if(!isKeyObject && !isKeyEnum) {
error(ECustom("Unknown Type Key"), p1, p1);
error(EPreset(UNKNOWN_MAP_TYPE), p1, p1);
}
}
}
@@ -673,7 +673,7 @@ class Parser {
else if(isKeyObject) type = ObjectMap;
if(type == null)
error(ECustom("Unknown Map Type"), p1, p1);
error(EPreset(UNKNOWN_MAP_TYPE), p1, p1);
return parseExprNext(mk(EMapDecl(type, keys, values), p1));
}
+7 -7
View File
@@ -18,7 +18,7 @@ class Preprocessor {
if(e == null)
return null;
trace(expr(e));
//trace(expr(e));
e = Tools.map(e, function(e) {
return process(e);
@@ -35,13 +35,13 @@ class Preprocessor {
case EConst(CInt(i)):
return mk(EConst(CString(String.fromCharCode(i))), e);
default:
// __StringWorkaround__fromCharCode(i);
#if !NO_FROM_CHAR_CODE_FIX
return mk(ECall(mk(EIdent("__StringWorkaround__fromCharCode"), e), [e]), e);
#else
throw Parser.getBaseError(EPreset(FROM_CHAR_CODE_NON_INT));
#end
}
// __StringWorkaround__fromCharCode(i);
#if !NO_FROM_CHAR_CODE_FIX
return mk(ECall(mk(EIdent("__StringWorkaround__fromCharCode"), e), [e]), e);
#else
throw Parser.getBaseError(EPreset(FROM_CHAR_CODE_NON_INT));
#end
default:
}
+8 -1
View File
@@ -521,6 +521,13 @@ class Printer {
return Type.enumEq(Tools.cleanError(e1), Tools.cleanError(e2));
}
public inline static function getPrintableError( e : Error ) {
return Tools.cleanError(switch( Tools.cleanError(e) ) {
case EPreset(msg): Parser.getBaseError(ECustom(msg.toString()));
default: e;
});
}
public static function errorToString( e : Error ) {
var message = switch( Tools.cleanError(e) ) {
case EInvalidChar(c): "Invalid character: '"+(StringTools.isEof(c) ? "EOF (End Of File)" : String.fromCharCode(c))+"' ("+c+")";
@@ -533,7 +540,7 @@ class Printer {
case EInvalidOp(op): "Invalid operator: "+op;
case EInvalidAccess(f): "Invalid access to field " + f;
case ECustom(msg): msg;
case EPreset(msg): msg;
case EPreset(msg): msg.toString();
case EInvalidClass(cla): "Invalid class: " + cla + " was not found.";
case EAlreadyExistingClass(cla): 'Custom Class named $cla already exists.';
case EInvalidEscape(s): "Invalid escape sequence: " + s;
+18 -22
View File
@@ -130,32 +130,28 @@ class StringCase extends TestCase {
assertEq("'hello ${5} world'", 'hello ${5} world');
assertEq("'hello ${5}'", 'hello ${5}');
//Util.runKnownBug("string.code doesnt work", () -> {
assertEq('"f".code', "f".code);
assertEq('"o".code', "o".code);
assertEq('"1".code', "1".code);
assertEq('"b".code', "b".code);
assertEq('"a".code', "a".code);
assertEq('"r".code', "r".code);
assertEq('"r".code', "r".code);
assertError('"foo".code', Parser.getBaseError(EPreset(INVALID_CHAR_CODE_MULTI))); // multiple chars causes error
assertError('"bar".code', Parser.getBaseError(EPreset(INVALID_CHAR_CODE_MULTI))); // multiple chars causes error
//});
assertEq('"f".code', "f".code);
assertEq('"o".code', "o".code);
assertEq('"1".code', "1".code);
assertEq('"b".code', "b".code);
assertEq('"a".code', "a".code);
assertEq('"r".code', "r".code);
assertEq('"r".code', "r".code);
assertError('"foo".code', Parser.getBaseError(EPreset(INVALID_CHAR_CODE_MULTI))); // multiple chars causes error
assertError('"bar".code', Parser.getBaseError(EPreset(INVALID_CHAR_CODE_MULTI))); // multiple chars causes error
headerCode = '';
var a = 103;
//Util.runKnownBug("String.fromCharCode doesnt work", () -> {
assertEq('String.fromCharCode(65)', String.fromCharCode(65));
assertEq('String.fromCharCode(97)', String.fromCharCode(97));
assertEq('String.fromCharCode(98)', String.fromCharCode(98));
assertEq('String.fromCharCode(99)', String.fromCharCode(99));
assertEq('String.fromCharCode(100)', String.fromCharCode(100));
assertEq('String.fromCharCode(101)', String.fromCharCode(101));
assertEq('String.fromCharCode(102)', String.fromCharCode(102));
assertEq('String.fromCharCode(103)', String.fromCharCode(103));
assertEq('var a = 103; String.fromCharCode(a)', String.fromCharCode(test));
//});
assertEq('String.fromCharCode(65)', String.fromCharCode(65));
assertEq('String.fromCharCode(97)', String.fromCharCode(97));
assertEq('String.fromCharCode(98)', String.fromCharCode(98));
assertEq('String.fromCharCode(99)', String.fromCharCode(99));
assertEq('String.fromCharCode(100)', String.fromCharCode(100));
assertEq('String.fromCharCode(101)', String.fromCharCode(101));
assertEq('String.fromCharCode(102)', String.fromCharCode(102));
assertEq('String.fromCharCode(103)', String.fromCharCode(103));
assertEq('var a = 103; String.fromCharCode(a)', String.fromCharCode(test));
assertError("'hello ${}'", Parser.getBaseError(EPreset(EMPTY_INTERPOLATION)));
}
+6 -4
View File
@@ -21,6 +21,7 @@ class TestCase extends HScriptRunner {
}
public function assertError(script:String, expectedError:hscript.Error, ?message:String, ?vars:Dynamic, ?pos:haxe.PosInfos) {
var expectedError = Printer.getPrintableError(expectedError);
if(message == null)
message = script;
try {
@@ -29,17 +30,18 @@ class TestCase extends HScriptRunner {
else
executeUnsafe(script);
Sys.println("# For script: " + script);
Sys.println("## Expected error: " + Tools.cleanError(expectedError));
Sys.println("## Expected error: " + expectedError);
Sys.println("## Got result: " + result);
Sys.println("> " + Printer.convertExprToString(lastExpr));
return Util.failed();
} catch(e:hscript.Error) {
if(Printer.compareErrors(e, expectedError)) {
var e = Printer.getPrintableError(e);
if(Type.enumEq(e, expectedError)) {
return Util.passed();
} else {
Sys.println("# For script: " + script);
Sys.println("## Expected error: " + Tools.cleanError(expectedError));
Sys.println("## Actual error: " + Tools.cleanError(e));
Sys.println("## Expected error: " + expectedError);
Sys.println("## Actual error: " + e);
return Util.failed();
}
}