4
4
AstBlock ,
5
5
AstNode ,
6
6
BinOpNode ,
7
- ChainingCallsNode ,
7
+ ChainingCallsNode ,
8
8
ChainingObjectAccessNode ,
9
9
ConstNode ,
10
10
CreateArrayNode ,
@@ -139,12 +139,29 @@ export class Evaluator {
139
139
140
140
if ( node . type === 'if' ) {
141
141
const ifNode = node as IfNode ;
142
+ let doElse = true ;
142
143
if ( this . evalNode ( ifNode . conditionNode , blockContext ) ) {
143
144
this . evalBlock (
144
145
{ name : blockContext . moduleName , type : 'if' , body : ifNode . ifBody } as AstBlock ,
145
146
blockContext
146
147
) ;
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 ) {
148
165
this . evalBlock (
149
166
{ name : blockContext . moduleName , type : 'if' , body : ifNode . elseBody } as AstBlock ,
150
167
blockContext
@@ -369,10 +386,7 @@ export class Evaluator {
369
386
370
387
if ( assignNode . target . type === 'getSingleVar' ) {
371
388
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 ) ) ;
376
390
} else if ( assignNode . target . type === 'chainingCalls' ) {
377
391
const targetNode = assignNode . target as ChainingCallsNode ;
378
392
@@ -382,7 +396,7 @@ export class Evaluator {
382
396
targetNode . innerNodes . slice ( 0 , targetNode . innerNodes . length - 1 ) ,
383
397
targetNode . loc
384
398
) ;
385
- const targetObject = ( this . evalNode ( targetObjectNode , blockContext ) ) as Record <
399
+ const targetObject = this . evalNode ( targetObjectNode , blockContext ) as Record <
386
400
string ,
387
401
unknown
388
402
> ;
@@ -393,10 +407,10 @@ export class Evaluator {
393
407
if ( lastInnerNode . type === 'getSingleVar' ) {
394
408
lastPropertyName = ( lastInnerNode as GetSingleVarNode ) . name ;
395
409
} else if ( lastInnerNode . type === 'chainingObjectAccess' ) {
396
- lastPropertyName = ( this . evalNode (
410
+ lastPropertyName = this . evalNode (
397
411
( lastInnerNode as ChainingObjectAccessNode ) . indexerBody ,
398
412
blockContext
399
- ) ) as string ;
413
+ ) as string ;
400
414
} else {
401
415
throw Error ( 'Not implemented Assign operation with chaining calls' ) ;
402
416
}
@@ -411,7 +425,6 @@ export class Evaluator {
411
425
return this . resolveChainingCallsNode ( node as ChainingCallsNode , blockContext ) ;
412
426
}
413
427
414
-
415
428
if ( node . type === 'createObject' ) {
416
429
const createObjectNode = node as CreateObjectNode ;
417
430
const obj = { } as Record < string , unknown > ;
@@ -435,12 +448,9 @@ export class Evaluator {
435
448
}
436
449
}
437
450
438
- private resolveChainingCallsNode (
439
- chNode : ChainingCallsNode ,
440
- blockContext : BlockContext
441
- ) : unknown {
451
+ private resolveChainingCallsNode ( chNode : ChainingCallsNode , blockContext : BlockContext ) : unknown {
442
452
// 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 ;
444
454
445
455
for ( let i = 1 ; i < chNode . innerNodes . length ; i ++ ) {
446
456
const nestedProp = chNode . innerNodes [ i ] ;
@@ -455,7 +465,7 @@ export class Evaluator {
455
465
const node = nestedProp as ChainingObjectAccessNode ;
456
466
// startObject = startObject[node.] as unknown;
457
467
startObject = startObject [
458
- ( this . evalNode ( node . indexerBody , blockContext ) ) as string
468
+ this . evalNode ( node . indexerBody , blockContext ) as string
459
469
] as unknown ;
460
470
} else if ( nestedProp . type === 'funcCall' ) {
461
471
const funcCallNode = nestedProp as FunctionCallNode ;
@@ -489,5 +499,4 @@ export class Evaluator {
489
499
490
500
return startObject === undefined ? null : startObject ;
491
501
}
492
-
493
502
}
0 commit comments