@@ -384,6 +384,7 @@ func (s *Session) Eval(in string) (string, bytes.Buffer, error) {
384
384
}
385
385
386
386
// Extract statements.
387
+ priorListLength := len (s .mainBody .List )
387
388
if err := s .separateEvalStmt (in ); err != nil {
388
389
return "" , bytes.Buffer {}, err
389
390
}
@@ -404,39 +405,77 @@ func (s *Session) Eval(in string) (string, bytes.Buffer, error) {
404
405
errorf ("%s" , err )
405
406
}
406
407
408
+ // Cleanup the session file.
409
+ s .mainBody .List = s .mainBody .List [0 :priorListLength ]
410
+ if err := s .cleanEvalStmt (in ); err != nil {
411
+ return "" , bytes.Buffer {}, err
412
+ }
413
+ f , err := os .Create (s .FilePath )
414
+ if err != nil {
415
+ return "" , bytes.Buffer {}, err
416
+ }
417
+ err = printer .Fprint (f , s .Fset , s .File )
418
+ if err != nil {
419
+ return "" , bytes.Buffer {}, err
420
+ }
421
+
407
422
return string (output ), strerr , err
408
423
}
409
424
410
425
// separateEvalStmt separates what can be evaluated via evalExpr from what cannot.
411
426
func (s * Session ) separateEvalStmt (in string ) error {
412
427
var stmtLines []string
413
428
var exprCount int
429
+ var bracketCount int
414
430
415
431
inLines := strings .Split (in , "\n " )
416
432
417
433
for _ , line := range inLines {
418
434
419
- priorLen := len (s .mainBody .List )
420
-
421
- if _ , err := s .evalExpr (line ); err != nil {
422
- stmtLines = append (stmtLines , line )
435
+ if bracketCount == 0 {
436
+ if _ , err := s .evalExpr (line ); err != nil {
437
+ if strings .LastIndex (line , "{" ) == len (line )- 1 {
438
+ bracketCount ++
439
+ }
440
+ stmtLines = append (stmtLines , line )
441
+ continue
442
+ }
423
443
continue
424
444
}
425
445
426
- if len (stmtLines ) != 0 {
446
+ if strings .LastIndex (line , "}" ) == len (line )- 1 {
447
+ bracketCount --
448
+ }
449
+ stmtLines = append (stmtLines , line )
427
450
428
- currentLen := len (s .mainBody .List )
429
- trimNum := currentLen - priorLen
430
- s .mainBody .List = s .mainBody .List [0 : currentLen - trimNum ]
451
+ exprCount ++
452
+ }
431
453
432
- if err := s .evalStmt (strings .Join (stmtLines , "\n " ), true ); err != nil {
433
- return err
434
- }
435
- stmtLines = []string {}
454
+ if len (stmtLines ) != 0 {
455
+ var noPrint bool
456
+ if exprCount > 0 {
457
+ noPrint = true
458
+ }
459
+ if err := s .evalStmt (strings .Join (stmtLines , "\n " ), noPrint ); err != nil {
460
+ return err
461
+ }
462
+ }
436
463
437
- if _ , err := s .evalExpr (line ); err != nil {
438
- return err
439
- }
464
+ return nil
465
+ }
466
+
467
+ // cleanEvalStmt cleans up prior print statements etc.
468
+ func (s * Session ) cleanEvalStmt (in string ) error {
469
+ var stmtLines []string
470
+ var exprCount int
471
+
472
+ inLines := strings .Split (in , "\n " )
473
+
474
+ for _ , line := range inLines {
475
+
476
+ if _ , err := s .evalExpr (line ); err != nil {
477
+ stmtLines = append (stmtLines , line )
478
+ continue
440
479
}
441
480
442
481
exprCount ++
0 commit comments