"cast" syntax support
- Now it parses unsafe/safe cast. For now it's just sugar syntax.
This commit is contained in:
@@ -130,6 +130,8 @@ class Bytes {
|
||||
// TODO
|
||||
case EEnum(en):
|
||||
// TODO
|
||||
case ECast(e, _):
|
||||
// TODO
|
||||
case EConst(c):
|
||||
doEncodeConst(c);
|
||||
case EIdent(v):
|
||||
|
||||
@@ -82,6 +82,7 @@ enum Expr {
|
||||
EImport( c : String, ?asname:String, ?isUsing:Bool );
|
||||
EClass( name:String, fields:Array<Expr>, ?extend:String, interfaces:Array<String>, ?isFinal:Bool, ?isPrivate:Bool );
|
||||
EEnum( en:EnumDecl, ?isAbstract:Bool );
|
||||
ECast(e:Expr, ?t:CType);
|
||||
}
|
||||
|
||||
@:structInit
|
||||
|
||||
@@ -882,6 +882,8 @@ class Interp {
|
||||
}
|
||||
|
||||
variables.set(en.name, enumThingy);
|
||||
case ECast(e, _): // TODO
|
||||
return expr(e);
|
||||
case EConst(c):
|
||||
switch (c) {
|
||||
case CInt(v): return v;
|
||||
|
||||
+16
-1
@@ -1146,7 +1146,22 @@ class Parser {
|
||||
}
|
||||
|
||||
mk(EEnum({ name: name, fields: fields }, false), p1);
|
||||
|
||||
case "cast":
|
||||
var tk = token();
|
||||
var e:Expr = null;
|
||||
var t:CType = null; // null if is unsafe cast
|
||||
switch(tk) {
|
||||
case TPOpen:
|
||||
e = parseExpr();
|
||||
ensure(TComma);
|
||||
t = parseType();
|
||||
ensure(TPClose);
|
||||
default:
|
||||
push(tk);
|
||||
e = parseExpr();
|
||||
}
|
||||
|
||||
mk(ECast(e, t));
|
||||
case "return":
|
||||
var tk = token();
|
||||
push(tk);
|
||||
|
||||
@@ -171,6 +171,16 @@ class Printer {
|
||||
|
||||
tabs = tabs.substr(1);
|
||||
add("}");
|
||||
case ECast(e, t):
|
||||
var safe = t != null;
|
||||
add("cast ");
|
||||
if(safe) add("(");
|
||||
expr(e);
|
||||
if(safe) {
|
||||
add(", ");
|
||||
addType(t);
|
||||
add(")");
|
||||
}
|
||||
case EConst(c):
|
||||
switch( c ) {
|
||||
case CInt(i): add(i);
|
||||
|
||||
Reference in New Issue
Block a user