44  AstBlock , 
55  AstNode , 
66  BinOpNode , 
7-      ChainingCallsNode , 
7+   ChainingCallsNode , 
88  ChainingObjectAccessNode , 
99  ConstNode , 
1010  CreateArrayNode , 
@@ -139,12 +139,29 @@ export class Evaluator {
139139
140140    if  ( node . type  ===  'if' )  { 
141141      const  ifNode  =  node  as  IfNode ; 
142+       let  doElse  =  true ; 
142143      if  ( this . evalNode ( ifNode . conditionNode ,  blockContext ) )  { 
143144        this . evalBlock ( 
144145          {  name : blockContext . moduleName ,  type : 'if' ,  body : ifNode . ifBody  }  as  AstBlock , 
145146          blockContext 
146147        ) ; 
147-       }  else  if  ( ifNode . elseBody )  { 
148+         doElse  =  false ; 
149+       }  else  if  ( ifNode . elifs ?. length )  { 
150+         for  ( let  i  =  0 ;  i  <  ifNode . elifs . length ;  i ++ )  { 
151+           const  elIfNode  =  ifNode . elifs [ i ] ; 
152+ 
153+           if  ( this . evalNode ( elIfNode . conditionNode ,  blockContext ) )  { 
154+             this . evalBlock ( 
155+               {  name : blockContext . moduleName ,  type : 'if' ,  body : elIfNode . elifBody  }  as  AstBlock , 
156+               blockContext 
157+             ) ; 
158+             doElse  =  false ; 
159+             break ; 
160+           } 
161+         } 
162+       } 
163+       
164+       if  ( doElse  &&  ifNode . elseBody )  { 
148165        this . evalBlock ( 
149166          {  name : blockContext . moduleName ,  type : 'if' ,  body : ifNode . elseBody  }  as  AstBlock , 
150167          blockContext 
@@ -369,10 +386,7 @@ export class Evaluator {
369386
370387      if  ( assignNode . target . type  ===  'getSingleVar' )  { 
371388        const  node  =  assignNode . target  as  SetSingleVarNode ; 
372-         blockContext . blockScope . set ( 
373-           node . name , 
374-           this . evalNode ( assignNode . source ,  blockContext ) 
375-         ) ; 
389+         blockContext . blockScope . set ( node . name ,  this . evalNode ( assignNode . source ,  blockContext ) ) ; 
376390      }  else  if  ( assignNode . target . type  ===  'chainingCalls' )  { 
377391        const  targetNode  =  assignNode . target  as  ChainingCallsNode ; 
378392
@@ -382,7 +396,7 @@ export class Evaluator {
382396          targetNode . innerNodes . slice ( 0 ,  targetNode . innerNodes . length  -  1 ) , 
383397          targetNode . loc 
384398        ) ; 
385-         const  targetObject  =  ( this . evalNode ( targetObjectNode ,  blockContext ) )  as  Record < 
399+         const  targetObject  =  this . evalNode ( targetObjectNode ,  blockContext )  as  Record < 
386400          string , 
387401          unknown 
388402        > ; 
@@ -393,10 +407,10 @@ export class Evaluator {
393407        if  ( lastInnerNode . type  ===  'getSingleVar' )  { 
394408          lastPropertyName  =  ( lastInnerNode  as  GetSingleVarNode ) . name ; 
395409        }  else  if  ( lastInnerNode . type  ===  'chainingObjectAccess' )  { 
396-           lastPropertyName  =  ( this . evalNode ( 
410+           lastPropertyName  =  this . evalNode ( 
397411            ( lastInnerNode  as  ChainingObjectAccessNode ) . indexerBody , 
398412            blockContext 
399-           ) )  as  string ; 
413+           )  as  string ; 
400414        }  else  { 
401415          throw  Error ( 'Not implemented Assign operation with chaining calls' ) ; 
402416        } 
@@ -411,7 +425,6 @@ export class Evaluator {
411425      return  this . resolveChainingCallsNode ( node  as  ChainingCallsNode ,  blockContext ) ; 
412426    } 
413427
414- 
415428    if  ( node . type  ===  'createObject' )  { 
416429      const  createObjectNode  =  node  as  CreateObjectNode ; 
417430      const  obj  =  { }  as  Record < string ,  unknown > ; 
@@ -435,12 +448,9 @@ export class Evaluator {
435448    } 
436449  } 
437450
438-   private  resolveChainingCallsNode ( 
439-     chNode : ChainingCallsNode , 
440-     blockContext : BlockContext 
441-   ) : unknown  { 
451+   private  resolveChainingCallsNode ( chNode : ChainingCallsNode ,  blockContext : BlockContext ) : unknown  { 
442452    // eslint-disable-next-line @typescript-eslint/no-explicit-any 
443-     let  startObject  =  ( this . evalNode ( chNode . innerNodes [ 0 ] ,  blockContext ) )  as  any ; 
453+     let  startObject  =  this . evalNode ( chNode . innerNodes [ 0 ] ,  blockContext )  as  any ; 
444454
445455    for  ( let  i  =  1 ;  i  <  chNode . innerNodes . length ;  i ++ )  { 
446456      const  nestedProp  =  chNode . innerNodes [ i ] ; 
@@ -455,7 +465,7 @@ export class Evaluator {
455465        const  node  =  nestedProp  as  ChainingObjectAccessNode ; 
456466        // startObject = startObject[node.] as unknown; 
457467        startObject  =  startObject [ 
458-           ( this . evalNode ( node . indexerBody ,  blockContext ) )  as  string 
468+           this . evalNode ( node . indexerBody ,  blockContext )  as  string 
459469        ]  as  unknown ; 
460470      }  else  if  ( nestedProp . type  ===  'funcCall' )  { 
461471        const  funcCallNode  =  nestedProp  as  FunctionCallNode ; 
@@ -489,5 +499,4 @@ export class Evaluator {
489499
490500    return  startObject  ===  undefined  ? null  : startObject ; 
491501  } 
492- 
493502} 
0 commit comments