File tree Expand file tree Collapse file tree 3 files changed +25
-3
lines changed Expand file tree Collapse file tree 3 files changed +25
-3
lines changed Original file line number Diff line number Diff line change @@ -6,6 +6,10 @@ export class AST {
66    throw  new  BaseException ( "Not supported" ) ; 
77  } 
88
9+   get  isAssignable ( )  { 
10+     return  false ; 
11+   } 
12+ 
913  assign ( context ,  value )  { 
1014    throw  new  BaseException ( "Not supported" ) ; 
1115  } 
@@ -75,6 +79,10 @@ export class FieldRead extends AST {
7579    return  this . getter ( this . receiver . eval ( context ) ) ; 
7680  } 
7781
82+   get  isAssignable ( )  { 
83+     return  true ; 
84+   } 
85+ 
7886  assign ( context ,  value )  { 
7987    return  this . setter ( this . receiver . eval ( context ) ,  value ) ; 
8088  } 
@@ -101,6 +109,11 @@ export class KeyedAccess extends AST {
101109      throw  new  BaseException ( `Cannot access ${ key }   on ${ obj }  ` ) ; 
102110    } 
103111  } 
112+ 
113+   get  isAssignable ( )  { 
114+     return  true ; 
115+   } 
116+ 
104117  assign ( context ,  value )  { 
105118    var  obj  =  this . obj . eval ( context ) ; 
106119    var  key  =  this . key . eval ( context ) ; 
Original file line number Diff line number Diff line change @@ -150,9 +150,16 @@ class _ParseAST {
150150  } 
151151
152152  parseExpression ( )  { 
153+     var  start  =  this . inputIndex ; 
153154    var  result  =  this . parseConditional ( ) ; 
154155
155156    while  ( this . next . isOperator ( '=' ) )  { 
157+       if  ( ! result . isAssignable )  { 
158+         var  end  =  this . inputIndex ; 
159+         var  expression  =  this . input . substring ( start ,  end ) ; 
160+         this . error ( `Expression ${ expression }   is not assignable` ) ; 
161+       } 
162+ 
156163      this . expectOperator ( '=' ) ; 
157164      result  =  new  Assignment ( result ,  this . parseConditional ( ) ) ; 
158165    } 
Original file line number Diff line number Diff line change @@ -179,6 +179,10 @@ export function main() {
179179        expect ( MapWrapper . get ( context . a [ 0 ] ,  "key" ) ) . toEqual ( 200 ) ; 
180180      } ) ; 
181181
182+       it ( 'should throw on bad assignment' ,  ( )  =>  { 
183+         expectEvalError ( "5=4" ) . toThrowError ( new  RegExp ( "Expression 5 is not assignable" ) ) ; 
184+       } ) ; 
185+ 
182186      it ( 'should evaluate array' ,  ( )  =>  { 
183187        expectEval ( "[1][0]" ) . toEqual ( 1 ) ; 
184188        expectEval ( "[[1]][0][0]" ) . toEqual ( 1 ) ; 
@@ -188,7 +192,7 @@ export function main() {
188192      } ) ; 
189193
190194      it ( "should error when unfinished exception" ,  ( )  =>  { 
191-         expectEvalError ( 'a[0 = 200 ' ) . toThrowError ( new  RegExp ( "Missing expected ]" ) ) ; 
195+         expectEvalError ( 'a[0' ) . toThrowError ( new  RegExp ( "Missing expected ]" ) ) ; 
192196      } ) ; 
193197
194198      it ( 'should evaluate map' ,  ( )  =>  { 
@@ -201,8 +205,6 @@ export function main() {
201205      } ) ; 
202206
203207      describe ( "parseBinding" ,  ( )  =>  { 
204-         //throw on assignment 
205- 
206208        it ( "should parse formatters" ,  function  ( )  { 
207209          var  exp  =  parseBinding ( "'Foo'|uppercase" ) ; 
208210          expect ( exp ) . toBeAnInstanceOf ( Formatter ) ; 
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments