"cast" syntax support

- Now it parses unsafe/safe cast. For now it's just sugar syntax.
This commit is contained in:
Jaime Humberto Macias Bustamante
2025-07-26 01:59:57 -07:00
parent 2c6f48b1bc
commit 0b1fbf66dc
5 changed files with 31 additions and 1 deletions
+2
View File
@@ -130,6 +130,8 @@ class Bytes {
// TODO // TODO
case EEnum(en): case EEnum(en):
// TODO // TODO
case ECast(e, _):
// TODO
case EConst(c): case EConst(c):
doEncodeConst(c); doEncodeConst(c);
case EIdent(v): case EIdent(v):
+1
View File
@@ -82,6 +82,7 @@ enum Expr {
EImport( c : String, ?asname:String, ?isUsing:Bool ); EImport( c : String, ?asname:String, ?isUsing:Bool );
EClass( name:String, fields:Array<Expr>, ?extend:String, interfaces:Array<String>, ?isFinal:Bool, ?isPrivate:Bool ); EClass( name:String, fields:Array<Expr>, ?extend:String, interfaces:Array<String>, ?isFinal:Bool, ?isPrivate:Bool );
EEnum( en:EnumDecl, ?isAbstract:Bool ); EEnum( en:EnumDecl, ?isAbstract:Bool );
ECast(e:Expr, ?t:CType);
} }
@:structInit @:structInit
+2
View File
@@ -882,6 +882,8 @@ class Interp {
} }
variables.set(en.name, enumThingy); variables.set(en.name, enumThingy);
case ECast(e, _): // TODO
return expr(e);
case EConst(c): case EConst(c):
switch (c) { switch (c) {
case CInt(v): return v; case CInt(v): return v;
+16 -1
View File
@@ -1146,7 +1146,22 @@ class Parser {
} }
mk(EEnum({ name: name, fields: fields }, false), p1); 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": case "return":
var tk = token(); var tk = token();
push(tk); push(tk);
+10
View File
@@ -171,6 +171,16 @@ class Printer {
tabs = tabs.substr(1); tabs = tabs.substr(1);
add("}"); 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): case EConst(c):
switch( c ) { switch( c ) {
case CInt(i): add(i); case CInt(i): add(i);