@@ -39,7 +39,7 @@ import type {
3939 Word ,
4040} from "./types.ts" ;
4141import { LexContext , Token , Lexer , TokenValue } from "./lexer.ts" ;
42- import { parseArithmeticExpression } from "./arithmetic.ts" ;
42+ import { parseArithmeticExpression , drainArithCmdExps } from "./arithmetic.ts" ;
4343import { computeWordParts , computeHereDocBodyParts } from "./parts.ts" ;
4444import { WordImpl } from "./word.ts" ;
4545
@@ -62,7 +62,7 @@ class ArithmeticCommandImpl implements ArithmeticCommand {
6262 get expression ( ) : ArithmeticExpression | undefined {
6363 if ( this . #expression === null ) {
6464 this . #expression = parseArithmeticExpression ( this . body , this . pos + 2 ) ?? undefined ;
65- if ( this . #expression ) resolveArithmeticExpansions ( this . #expression ) ;
65+ resolveDrainedArithCmdExps ( ) ;
6666 }
6767 return this . #expression;
6868 }
@@ -112,10 +112,8 @@ class ArithmeticForImpl implements ArithmeticFor {
112112 if ( this . #initialize === null ) {
113113 if ( this . #initStr) {
114114 const expr = parseArithmeticExpression ( this . #initStr) ;
115- if ( expr ) {
116- offsetArith ( expr , this . #initPos) ;
117- resolveArithmeticExpansions ( expr ) ;
118- }
115+ if ( expr ) offsetArith ( expr , this . #initPos) ;
116+ resolveDrainedArithCmdExps ( ) ;
119117 this . #initialize = expr ?? undefined ;
120118 } else {
121119 this . #initialize = undefined ;
@@ -131,10 +129,8 @@ class ArithmeticForImpl implements ArithmeticFor {
131129 if ( this . #test === null ) {
132130 if ( this . #testStr) {
133131 const expr = parseArithmeticExpression ( this . #testStr) ;
134- if ( expr ) {
135- offsetArith ( expr , this . #testPos) ;
136- resolveArithmeticExpansions ( expr ) ;
137- }
132+ if ( expr ) offsetArith ( expr , this . #testPos) ;
133+ resolveDrainedArithCmdExps ( ) ;
138134 this . #test = expr ?? undefined ;
139135 } else {
140136 this . #test = undefined ;
@@ -150,10 +146,8 @@ class ArithmeticForImpl implements ArithmeticFor {
150146 if ( this . #update === null ) {
151147 if ( this . #updateStr) {
152148 const expr = parseArithmeticExpression ( this . #updateStr) ;
153- if ( expr ) {
154- offsetArith ( expr , this . #updatePos) ;
155- resolveArithmeticExpansions ( expr ) ;
156- }
149+ if ( expr ) offsetArith ( expr , this . #updatePos) ;
150+ resolveDrainedArithCmdExps ( ) ;
157151 this . #update = expr ?? undefined ;
158152 } else {
159153 this . #update = undefined ;
@@ -209,29 +203,14 @@ function offsetArith(node: ArithmeticExpression, base: number): void {
209203 }
210204}
211205
212- export function resolveArithmeticExpansions ( expr : ArithmeticExpression ) : void {
213- switch ( expr . type ) {
214- case "ArithmeticBinary" :
215- resolveArithmeticExpansions ( expr . left ) ;
216- resolveArithmeticExpansions ( expr . right ) ;
217- break ;
218- case "ArithmeticUnary" :
219- resolveArithmeticExpansions ( expr . operand ) ;
220- break ;
221- case "ArithmeticTernary" :
222- resolveArithmeticExpansions ( expr . test ) ;
223- resolveArithmeticExpansions ( expr . consequent ) ;
224- resolveArithmeticExpansions ( expr . alternate ) ;
225- break ;
226- case "ArithmeticGroup" :
227- resolveArithmeticExpansions ( expr . expression ) ;
228- break ;
229- case "ArithmeticCommandExpansion" :
230- if ( expr . inner !== undefined ) {
231- expr . script = parse ( expr . inner ) ;
232- expr . inner = undefined ;
233- }
234- break ;
206+ function resolveDrainedArithCmdExps ( ) : void {
207+ const list = drainArithCmdExps ( ) ;
208+ if ( ! list ) return ;
209+ for ( const node of list ) {
210+ if ( node . inner !== undefined ) {
211+ node . script = parse ( node . inner ) ;
212+ node . inner = undefined ;
213+ }
235214 }
236215}
237216
0 commit comments