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 @@ -122,6 +122,7 @@ enum ModuleDecl {
122
122
DImport ( path : Array <String >, ? everything : Bool );
123
123
DClass ( c : ClassDecl );
124
124
DTypedef ( c : TypeDecl );
125
+ DEnum ( e : EnumDecl );
125
126
}
126
127
127
128
typedef ModuleType = {
@@ -138,6 +139,21 @@ typedef ClassDecl = {> ModuleType,
138
139
var isExtern : Bool ;
139
140
}
140
141
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
+
141
157
typedef TypeDecl = {> ModuleType ,
142
158
var t : CType ;
143
159
}
Original file line number Diff line number Diff line change @@ -511,21 +511,50 @@ class Interp {
511
511
case ETernary (econd ,e1 ,e2 ):
512
512
return if ( expr (econd ) == true ) expr (e1 ) else expr (e2 );
513
513
case ESwitch (e , cases , def ):
514
+ var old : Int = declared .length ;
514
515
var val : Dynamic = expr (e );
515
516
var match = false ;
516
517
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
+ }
521
548
}
549
+ }
522
550
if ( match ) {
523
551
val = expr (c .expr );
524
552
break ;
525
553
}
526
554
}
527
555
if ( ! match )
528
556
val = def == null ? null : expr (def );
557
+ restore (old );
529
558
return val ;
530
559
case EMeta (_ , _ , e ):
531
560
return expr (e );
Original file line number Diff line number Diff line change @@ -1188,6 +1188,20 @@ class Parser {
1188
1188
isPrivate : isPrivate ,
1189
1189
t : t ,
1190
1190
});
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
+ });
1191
1205
default :
1192
1206
unexpected (TId (ident ));
1193
1207
}
@@ -1266,6 +1280,31 @@ class Parser {
1266
1280
return null ;
1267
1281
}
1268
1282
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
+
1269
1308
// ------------------------ lexing -------------------------------
1270
1309
1271
1310
inline function readChar () {
You can’t perform that action at this time.
0 commit comments