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