@@ -237,10 +237,10 @@ func (p *CodeBuilder) Pkg() *Package {
237
237
return p .pkg
238
238
}
239
239
240
- func (p * CodeBuilder ) startFuncBody (fn * Func , old * funcBodyCtx ) * CodeBuilder {
240
+ func (p * CodeBuilder ) startFuncBody (fn * Func , src []ast. Node , old * funcBodyCtx ) * CodeBuilder {
241
241
p .current .fn , old .fn = fn , p .current .fn
242
242
p .current .labels , old .labels = nil , p .current .labels
243
- p .startBlockStmt (fn , "func " + fn .Name (), & old .codeBlockCtx )
243
+ p .startBlockStmt (fn , src , "func " + fn .Name (), & old .codeBlockCtx )
244
244
scope := p .current .scope
245
245
sig := fn .Type ().(* types.Signature )
246
246
insertParams (scope , sig .Params ())
@@ -268,8 +268,12 @@ func (p *CodeBuilder) endFuncBody(old funcBodyCtx) []ast.Stmt {
268
268
return stmts
269
269
}
270
270
271
- func (p * CodeBuilder ) startBlockStmt (current codeBlock , comment string , old * codeBlockCtx ) * CodeBuilder {
272
- scope := types .NewScope (p .current .scope , token .NoPos , token .NoPos , comment )
271
+ func (p * CodeBuilder ) startBlockStmt (current codeBlock , src []ast.Node , comment string , old * codeBlockCtx ) * CodeBuilder {
272
+ var start , end token.Pos
273
+ if src != nil {
274
+ start , end = src [0 ].Pos (), src [0 ].End ()
275
+ }
276
+ scope := types .NewScope (p .current .scope , start , end , comment )
273
277
p .current .codeBlockCtx , * old = codeBlockCtx {current , scope , p .stk .Len (), nil , nil , 0 }, p .current .codeBlockCtx
274
278
return p
275
279
}
@@ -537,7 +541,7 @@ func (p *CodeBuilder) CallInlineClosureStart(sig *types.Signature, arity int, el
537
541
for i , n := 0 , results .Len (); i < n ; i ++ {
538
542
p .emitVar (pkg , closure , results .At (i ), false )
539
543
}
540
- p .startFuncBody (closure , & closure .old )
544
+ p .startFuncBody (closure , nil , & closure .old )
541
545
args := p .stk .GetArgs (arity )
542
546
var flags InstrFlags
543
547
if ellipsis {
@@ -2182,12 +2186,12 @@ func (p *CodeBuilder) Go() *CodeBuilder {
2182
2186
}
2183
2187
2184
2188
// Block starts a block statement.
2185
- func (p * CodeBuilder ) Block () * CodeBuilder {
2189
+ func (p * CodeBuilder ) Block (src ... ast. Node ) * CodeBuilder {
2186
2190
if debugInstr {
2187
2191
log .Println ("Block" )
2188
2192
}
2189
2193
stmt := & blockStmt {}
2190
- p .startBlockStmt (stmt , "block statement" , & stmt .old )
2194
+ p .startBlockStmt (stmt , src , "block statement" , & stmt .old )
2191
2195
return p
2192
2196
}
2193
2197
@@ -2208,37 +2212,37 @@ func (p *CodeBuilder) InVBlock() bool {
2208
2212
}
2209
2213
2210
2214
// Block starts a if statement.
2211
- func (p * CodeBuilder ) If () * CodeBuilder {
2215
+ func (p * CodeBuilder ) If (src ... ast. Node ) * CodeBuilder {
2212
2216
if debugInstr {
2213
2217
log .Println ("If" )
2214
2218
}
2215
2219
stmt := & ifStmt {}
2216
- p .startBlockStmt (stmt , "if statement" , & stmt .old )
2220
+ p .startBlockStmt (stmt , src , "if statement" , & stmt .old )
2217
2221
return p
2218
2222
}
2219
2223
2220
2224
// Then starts body of a if/switch/for statement.
2221
- func (p * CodeBuilder ) Then () * CodeBuilder {
2225
+ func (p * CodeBuilder ) Then (src ... ast. Node ) * CodeBuilder {
2222
2226
if debugInstr {
2223
2227
log .Println ("Then" )
2224
2228
}
2225
2229
if p .stk .Len () == p .current .base {
2226
2230
panic ("use None() for empty expr" )
2227
2231
}
2228
2232
if flow , ok := p .current .codeBlock .(controlFlow ); ok {
2229
- flow .Then (p )
2233
+ flow .Then (p , src ... )
2230
2234
return p
2231
2235
}
2232
2236
panic ("use if..then or switch..then or for..then please" )
2233
2237
}
2234
2238
2235
2239
// Else starts else body of a if..else statement.
2236
- func (p * CodeBuilder ) Else () * CodeBuilder {
2240
+ func (p * CodeBuilder ) Else (src ... ast. Node ) * CodeBuilder {
2237
2241
if debugInstr {
2238
2242
log .Println ("Else" )
2239
2243
}
2240
2244
if flow , ok := p .current .codeBlock .(* ifStmt ); ok {
2241
- flow .Else (p )
2245
+ flow .Else (p , src ... )
2242
2246
return p
2243
2247
}
2244
2248
panic ("use if..else please" )
@@ -2260,12 +2264,12 @@ func (p *CodeBuilder) Else() *CodeBuilder {
2260
2264
//
2261
2265
// end
2262
2266
// </pre>
2263
- func (p * CodeBuilder ) TypeSwitch (name string ) * CodeBuilder {
2267
+ func (p * CodeBuilder ) TypeSwitch (name string , src ... ast. Node ) * CodeBuilder {
2264
2268
if debugInstr {
2265
2269
log .Println ("TypeSwitch" )
2266
2270
}
2267
2271
stmt := & typeSwitchStmt {name : name }
2268
- p .startBlockStmt (stmt , "type switch statement" , & stmt .old )
2272
+ p .startBlockStmt (stmt , src , "type switch statement" , & stmt .old )
2269
2273
return p
2270
2274
}
2271
2275
@@ -2333,59 +2337,59 @@ func (p *CodeBuilder) TypeAssertThen() *CodeBuilder {
2333
2337
}
2334
2338
2335
2339
// TypeCase starts case body of a type switch statement.
2336
- func (p * CodeBuilder ) TypeCase (n int ) * CodeBuilder { // n=0 means default case
2340
+ func (p * CodeBuilder ) TypeCase (n int , src ... ast. Node ) * CodeBuilder { // n=0 means default case
2337
2341
if debugInstr {
2338
2342
log .Println ("TypeCase" , n )
2339
2343
}
2340
2344
if flow , ok := p .current .codeBlock .(* typeSwitchStmt ); ok {
2341
- flow .TypeCase (p , n )
2345
+ flow .TypeCase (p , n , src ... )
2342
2346
return p
2343
2347
}
2344
2348
panic ("use switch x.(type) .. case please" )
2345
2349
}
2346
2350
2347
2351
// Select starts a select statement.
2348
- func (p * CodeBuilder ) Select () * CodeBuilder {
2352
+ func (p * CodeBuilder ) Select (src ... ast. Node ) * CodeBuilder {
2349
2353
if debugInstr {
2350
2354
log .Println ("Select" )
2351
2355
}
2352
2356
stmt := & selectStmt {}
2353
- p .startBlockStmt (stmt , "select statement" , & stmt .old )
2357
+ p .startBlockStmt (stmt , src , "select statement" , & stmt .old )
2354
2358
return p
2355
2359
}
2356
2360
2357
2361
// CommCase starts case body of a select..case statement.
2358
- func (p * CodeBuilder ) CommCase (n int ) * CodeBuilder {
2362
+ func (p * CodeBuilder ) CommCase (n int , src ... ast. Node ) * CodeBuilder {
2359
2363
if debugInstr {
2360
2364
log .Println ("CommCase" , n )
2361
2365
}
2362
2366
if n > 1 {
2363
2367
panic ("TODO: multi commStmt in select..case?" )
2364
2368
}
2365
2369
if flow , ok := p .current .codeBlock .(* selectStmt ); ok {
2366
- flow .CommCase (p , n )
2370
+ flow .CommCase (p , n , src ... )
2367
2371
return p
2368
2372
}
2369
2373
panic ("use select..case please" )
2370
2374
}
2371
2375
2372
2376
// Switch starts a switch statement.
2373
- func (p * CodeBuilder ) Switch () * CodeBuilder {
2377
+ func (p * CodeBuilder ) Switch (src ... ast. Node ) * CodeBuilder {
2374
2378
if debugInstr {
2375
2379
log .Println ("Switch" )
2376
2380
}
2377
2381
stmt := & switchStmt {}
2378
- p .startBlockStmt (stmt , "switch statement" , & stmt .old )
2382
+ p .startBlockStmt (stmt , src , "switch statement" , & stmt .old )
2379
2383
return p
2380
2384
}
2381
2385
2382
2386
// Case starts case body of a switch..case statement.
2383
- func (p * CodeBuilder ) Case (n int ) * CodeBuilder { // n=0 means default case
2387
+ func (p * CodeBuilder ) Case (n int , src ... ast. Node ) * CodeBuilder { // n=0 means default case
2384
2388
if debugInstr {
2385
2389
log .Println ("Case" , n )
2386
2390
}
2387
2391
if flow , ok := p .current .codeBlock .(* switchStmt ); ok {
2388
- flow .Case (p , n )
2392
+ flow .Case (p , n , src ... )
2389
2393
return p
2390
2394
}
2391
2395
panic ("use switch..case please" )
@@ -2483,12 +2487,12 @@ func (p *CodeBuilder) Fallthrough() *CodeBuilder {
2483
2487
}
2484
2488
2485
2489
// For func
2486
- func (p * CodeBuilder ) For () * CodeBuilder {
2490
+ func (p * CodeBuilder ) For (src ... ast. Node ) * CodeBuilder {
2487
2491
if debugInstr {
2488
2492
log .Println ("For" )
2489
2493
}
2490
2494
stmt := & forStmt {}
2491
- p .startBlockStmt (stmt , "for statement" , & stmt .old )
2495
+ p .startBlockStmt (stmt , src , "for statement" , & stmt .old )
2492
2496
return p
2493
2497
}
2494
2498
@@ -2506,11 +2510,16 @@ func (p *CodeBuilder) Post() *CodeBuilder {
2506
2510
2507
2511
// ForRange func
2508
2512
func (p * CodeBuilder ) ForRange (names ... string ) * CodeBuilder {
2513
+ return p .ForRangeEx (names )
2514
+ }
2515
+
2516
+ // ForRangeEx func
2517
+ func (p * CodeBuilder ) ForRangeEx (names []string , src ... ast.Node ) * CodeBuilder {
2509
2518
if debugInstr {
2510
2519
log .Println ("ForRange" , names )
2511
2520
}
2512
2521
stmt := & forRangeStmt {names : names }
2513
- p .startBlockStmt (stmt , "for range statement" , & stmt .old )
2522
+ p .startBlockStmt (stmt , src , "for range statement" , & stmt .old )
2514
2523
return p
2515
2524
}
2516
2525
0 commit comments