Skip to content

Commit f82943e

Browse files
Merge pull request #5 from lemz1/feature/enum
[FEATURE] Enums
2 parents b6799be + cf0d8c0 commit f82943e

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
@@ -124,6 +124,7 @@ enum ModuleDecl {
124124
DImport( path : Array<String>, ?everything : Bool, ?name : String );
125125
DClass( c : ClassDecl );
126126
DTypedef( c : TypeDecl );
127+
DEnum( e : EnumDecl );
127128
}
128129

129130
typedef ModuleType = {
@@ -140,6 +141,21 @@ typedef ClassDecl = {> ModuleType,
140141
var isExtern : Bool;
141142
}
142143

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

hscript/Interp.hx

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -523,21 +523,50 @@ class Interp {
523523
case ETernary(econd,e1,e2):
524524
return if( expr(econd) == true ) expr(e1) else expr(e2);
525525
case ESwitch(e, cases, def):
526+
var old:Int = declared.length;
526527
var val : Dynamic = expr(e);
527528
var match = false;
528529
for( c in cases ) {
529-
for( v in c.values )
530-
if( expr(v) == val ) {
531-
match = true;
532-
break;
530+
for( v in c.values ) {
531+
switch ( Tools.expr(v) ) {
532+
case ECall(e, params):
533+
switch ( Tools.expr(e) ) {
534+
case EField(_, f):
535+
var valStr:String = cast val;
536+
valStr = valStr.substring(0, valStr.indexOf("("));
537+
if (valStr == f) {
538+
var valParams = Type.enumParameters(val);
539+
for (i => p in params) {
540+
switch ( Tools.expr(p) ) {
541+
case EIdent(n):
542+
declared.push({
543+
n: n,
544+
old: {r: locals.get(n)}
545+
});
546+
locals.set(n, {r: valParams[i]});
547+
default:
548+
}
549+
}
550+
match = true;
551+
break;
552+
}
553+
default:
554+
}
555+
default:
556+
if( expr(v) == val ) {
557+
match = true;
558+
break;
559+
}
533560
}
561+
}
534562
if( match ) {
535563
val = expr(c.expr);
536564
break;
537565
}
538566
}
539567
if( !match )
540568
val = def == null ? null : expr(def);
569+
restore(old);
541570
return val;
542571
case EMeta(_, _, e):
543572
return expr(e);

hscript/Parser.hx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,6 +1228,20 @@ class Parser {
12281228
isPrivate : isPrivate,
12291229
t : t,
12301230
});
1231+
case "enum":
1232+
var name = getIdent();
1233+
1234+
var fields = [];
1235+
ensure(TBrOpen);
1236+
while( !maybe(TBrClose) ) {
1237+
fields.push(parseEnumField());
1238+
ensure(TSemicolon);
1239+
}
1240+
1241+
return DEnum({
1242+
name: name,
1243+
fields: fields
1244+
});
12311245
default:
12321246
unexpected(TId(ident));
12331247
}
@@ -1306,6 +1320,31 @@ class Parser {
13061320
return null;
13071321
}
13081322

1323+
function parseEnumField() : EnumFieldDecl {
1324+
var name = getIdent();
1325+
1326+
var args = [];
1327+
if( maybe(TPOpen) ) {
1328+
while ( !maybe(TPClose) )
1329+
args.push(parseEnumArg());
1330+
}
1331+
1332+
return {
1333+
name: name,
1334+
args: args
1335+
};
1336+
}
1337+
1338+
function parseEnumArg() : EnumArgDecl {
1339+
var name = getIdent();
1340+
var type = maybe(TDoubleDot) ? parseType() : null;
1341+
1342+
return {
1343+
name: name,
1344+
type: type
1345+
};
1346+
}
1347+
13091348
// ------------------------ lexing -------------------------------
13101349

13111350
inline function readChar() {

0 commit comments

Comments
 (0)