@@ -267,7 +267,7 @@ class Parser {
267
267
return switch ( expr (e ) ) {
268
268
case EBlock (_ ), EObject (_ ), ESwitch (_ ): true ;
269
269
case EFunction (_ ,e ,_ ,_ ): isBlock (e );
270
- case EVar (_ , t , e ): e != null ? isBlock (e ) : t != null ? t .match (CTAnon (_ )) : false ;
270
+ case EVar (_ , t , e ) | EFinal ( _ , t , e ) : e != null ? isBlock (e ) : t != null ? t .match (CTAnon (_ )) : false ;
271
271
case EIf (_ ,e1 ,e2 ): if ( e2 != null ) isBlock (e2 ) else isBlock (e1 );
272
272
case EBinop (_ ,_ ,e ): isBlock (e );
273
273
case EUnop (_ ,prefix ,e ): ! prefix && isBlock (e );
@@ -614,6 +614,27 @@ class Parser {
614
614
}
615
615
616
616
mk (EVar (ident ,t ,e ),p1 ,(e == null ) ? tokenMax : pmax (e ));
617
+ case " final" :
618
+ var ident = getIdent ();
619
+ var tk = token ();
620
+ var t = null ;
621
+ if ( tk == TDoubleDot && allowTypes ) {
622
+ t = parseType ();
623
+ tk = token ();
624
+ }
625
+ var e = null ;
626
+
627
+ switch (tk )
628
+ {
629
+ case TOp (" =" ): e = parseExpr ();
630
+ case TOp (_ ): unexpected (tk );
631
+ case TComma | TSemicolon : push (tk );
632
+ // Above case should be enough but semicolon is not mandatory after }
633
+ case _ if (t != null ): push (tk );
634
+ default : unexpected (tk );
635
+ }
636
+
637
+ mk (EFinal (ident ,t ,e ),p1 ,(e == null ) ? tokenMax : pmax (e ));
617
638
case " while" :
618
639
var econd = parseExpr ();
619
640
var e = parseExpr ();
@@ -1225,7 +1246,7 @@ class Parser {
1225
1246
ret : inf .ret ,
1226
1247
}),
1227
1248
};
1228
- case " var" :
1249
+ case " var" | " final " :
1229
1250
var name = getIdent ();
1230
1251
var get = null , set = null ;
1231
1252
if ( maybe (TPOpen ) ) {
@@ -1256,6 +1277,7 @@ class Parser {
1256
1277
set : set ,
1257
1278
type : type ,
1258
1279
expr : expr ,
1280
+ isfinal : (id == " final" )
1259
1281
}),
1260
1282
};
1261
1283
default :
0 commit comments