Skip to content

Commit cf0d8c0

Browse files
committed
enums
1 parent 27c86f9 commit cf0d8c0

File tree

3 files changed

+88
-4
lines changed

3 files changed

+88
-4
lines changed

hscript/Expr.hx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ enum ModuleDecl {
122122
DImport( path : Array<String>, ?everything : Bool );
123123
DClass( c : ClassDecl );
124124
DTypedef( c : TypeDecl );
125+
DEnum( e : EnumDecl );
125126
}
126127

127128
typedef ModuleType = {
@@ -138,6 +139,21 @@ typedef ClassDecl = {> ModuleType,
138139
var isExtern : Bool;
139140
}
140141

142+
typedef EnumDecl = {
143+
var name: String;
144+
var fields : Array<EnumFieldDecl>;
145+
}
146+
147+
typedef EnumFieldDecl = {
148+
var name : String;
149+
var args : Array<EnumArgDecl>;
150+
}
151+
152+
typedef EnumArgDecl = {
153+
var name : String;
154+
var type : Null<CType>;
155+
}
156+
141157
typedef TypeDecl = {> ModuleType,
142158
var t : CType;
143159
}

hscript/Interp.hx

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -511,21 +511,50 @@ class Interp {
511511
case ETernary(econd,e1,e2):
512512
return if( expr(econd) == true ) expr(e1) else expr(e2);
513513
case ESwitch(e, cases, def):
514+
var old:Int = declared.length;
514515
var val : Dynamic = expr(e);
515516
var match = false;
516517
for( c in cases ) {
517-
for( v in c.values )
518-
if( expr(v) == val ) {
519-
match = true;
520-
break;
518+
for( v in c.values ) {
519+
switch ( Tools.expr(v) ) {
520+
case ECall(e, params):
521+
switch ( Tools.expr(e) ) {
522+
case EField(_, f):
523+
var valStr:String = cast val;
524+
valStr = valStr.substring(0, valStr.indexOf("("));
525+
if (valStr == f) {
526+
var valParams = Type.enumParameters(val);
527+
for (i => p in params) {
528+
switch ( Tools.expr(p) ) {
529+
case EIdent(n):
530+
declared.push({
531+
n: n,
532+
old: {r: locals.get(n)}
533+
});
534+
locals.set(n, {r: valParams[i]});
535+
default:
536+
}
537+
}
538+
match = true;
539+
break;
540+
}
541+
default:
542+
}
543+
default:
544+
if( expr(v) == val ) {
545+
match = true;
546+
break;
547+
}
521548
}
549+
}
522550
if( match ) {
523551
val = expr(c.expr);
524552
break;
525553
}
526554
}
527555
if( !match )
528556
val = def == null ? null : expr(def);
557+
restore(old);
529558
return val;
530559
case EMeta(_, _, e):
531560
return expr(e);

hscript/Parser.hx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,20 @@ class Parser {
11881188
isPrivate : isPrivate,
11891189
t : t,
11901190
});
1191+
case "enum":
1192+
var name = getIdent();
1193+
1194+
var fields = [];
1195+
ensure(TBrOpen);
1196+
while( !maybe(TBrClose) ) {
1197+
fields.push(parseEnumField());
1198+
ensure(TSemicolon);
1199+
}
1200+
1201+
return DEnum({
1202+
name: name,
1203+
fields: fields
1204+
});
11911205
default:
11921206
unexpected(TId(ident));
11931207
}
@@ -1266,6 +1280,31 @@ class Parser {
12661280
return null;
12671281
}
12681282

1283+
function parseEnumField() : EnumFieldDecl {
1284+
var name = getIdent();
1285+
1286+
var args = [];
1287+
if( maybe(TPOpen) ) {
1288+
while ( !maybe(TPClose) )
1289+
args.push(parseEnumArg());
1290+
}
1291+
1292+
return {
1293+
name: name,
1294+
args: args
1295+
};
1296+
}
1297+
1298+
function parseEnumArg() : EnumArgDecl {
1299+
var name = getIdent();
1300+
var type = maybe(TDoubleDot) ? parseType() : null;
1301+
1302+
return {
1303+
name: name,
1304+
type: type
1305+
};
1306+
}
1307+
12691308
// ------------------------ lexing -------------------------------
12701309

12711310
inline function readChar() {

0 commit comments

Comments
 (0)