File tree Expand file tree Collapse file tree 3 files changed +88
-4
lines changed Expand file tree Collapse file tree 3 files changed +88
-4
lines changed Original file line number Diff line number Diff line change @@ -124,6 +124,7 @@ enum ModuleDecl {
124
124
DImport ( path : Array <String >, ? everything : Bool , ? name : String );
125
125
DClass ( c : ClassDecl );
126
126
DTypedef ( c : TypeDecl );
127
+ DEnum ( e : EnumDecl );
127
128
}
128
129
129
130
typedef ModuleType = {
@@ -140,6 +141,21 @@ typedef ClassDecl = {> ModuleType,
140
141
var isExtern : Bool ;
141
142
}
142
143
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
+
143
159
typedef TypeDecl = {> ModuleType ,
144
160
var t : CType ;
145
161
}
Original file line number Diff line number Diff line change @@ -523,21 +523,50 @@ class Interp {
523
523
case ETernary (econd ,e1 ,e2 ):
524
524
return if ( expr (econd ) == true ) expr (e1 ) else expr (e2 );
525
525
case ESwitch (e , cases , def ):
526
+ var old : Int = declared .length ;
526
527
var val : Dynamic = expr (e );
527
528
var match = false ;
528
529
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
+ }
533
560
}
561
+ }
534
562
if ( match ) {
535
563
val = expr (c .expr );
536
564
break ;
537
565
}
538
566
}
539
567
if ( ! match )
540
568
val = def == null ? null : expr (def );
569
+ restore (old );
541
570
return val ;
542
571
case EMeta (_ , _ , e ):
543
572
return expr (e );
Original file line number Diff line number Diff line change @@ -1228,6 +1228,20 @@ class Parser {
1228
1228
isPrivate : isPrivate ,
1229
1229
t : t ,
1230
1230
});
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
+ });
1231
1245
default :
1232
1246
unexpected (TId (ident ));
1233
1247
}
@@ -1306,6 +1320,31 @@ class Parser {
1306
1320
return null ;
1307
1321
}
1308
1322
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
+
1309
1348
// ------------------------ lexing -------------------------------
1310
1349
1311
1350
inline function readChar () {
You can’t perform that action at this time.
0 commit comments