diff options
| -rw-r--r-- | interp/interpreter_test.go | 14 | ||||
| -rw-r--r-- | parser/decl.go | 28 |
2 files changed, 32 insertions, 10 deletions
diff --git a/interp/interpreter_test.go b/interp/interpreter_test.go index 4e8721a..b9816d3 100644 --- a/interp/interpreter_test.go +++ b/interp/interpreter_test.go @@ -72,13 +72,13 @@ func TestExpr(t *testing.T) { func TestAssign(t *testing.T) { run(t, []etest{ - {src: "var a int = 1; a", res: "1"}, // #00 - {src: "var a, b int = 1, 2; b", res: "2"}, // #01 - {src: "var a, b int; a, b = 1, 2; b", res: "2"}, // #02 - {src: "a, b := 1, 2; b", res: "2"}, // #03 - {src: "func f() int {return 2}; a := f(); a", res: "2"}, // #04 - {src: "func f() (int, int) {return 2, 3}; a, b := f(); b", res: "3"}, // #05 - // {src: "func f() (int, int) {return 2, 3}; var a, b = f(); b", res: "3"}, // #06 + {src: "var a int = 1; a", res: "1"}, // #00 + {src: "var a, b int = 1, 2; b", res: "2"}, // #01 + {src: "var a, b int; a, b = 1, 2; b", res: "2"}, // #02 + {src: "a, b := 1, 2; b", res: "2"}, // #03 + {src: "func f() int {return 2}; a := f(); a", res: "2"}, // #04 + {src: "func f() (int, int) {return 2, 3}; a, b := f(); b", res: "3"}, // #05 + {src: "func f() (int, int) {return 2, 3}; var a, b = f(); b", res: "3"}, // #06 }) } diff --git a/parser/decl.go b/parser/decl.go index 0ba0075..bbcbb94 100644 --- a/parser/decl.go +++ b/parser/decl.go @@ -332,8 +332,10 @@ func (p *Parser) parseVarLine(in Tokens) (out Tokens, err error) { decl = decl[:i] } var vars []string + var undefinedType bool if _, vars, err = p.parseParamTypes(decl, parseTypeVar); err != nil { if errors.Is(err, ErrMissingType) { + undefinedType = true for _, lt := range decl.Split(lang.Comma) { vars = append(vars, lt[0].Str) name := strings.TrimPrefix(p.scope+"/"+lt[0].Str, "/") @@ -349,8 +351,24 @@ func (p *Parser) parseVarLine(in Tokens) (out Tokens, err error) { } } values := assign.Split(lang.Comma) - if len(values) == 1 && len(values[0]) == 0 { - values = nil + if len(values) == 1 { + if len(values[0]) == 0 { + return out, err + } + for _, v := range vars { + out = append(out, newIdent(v, 0)) + } + toks, err := p.parseExpr(values[0], "") + if err != nil { + return out, err + } + out = append(out, toks...) + if undefinedType { + out = append(out, newToken(lang.Define, "", 0, len(vars))) + } else { + out = append(out, newToken(lang.Assign, "", 0, len(vars))) + } + return out, err } for i, v := range values { if v, err = p.parseExpr(v, ""); err != nil { @@ -358,7 +376,11 @@ func (p *Parser) parseVarLine(in Tokens) (out Tokens, err error) { } out = append(out, newIdent(vars[i], 0)) out = append(out, v...) - out = append(out, newToken(lang.Assign, "", 0, 1)) + if undefinedType { + out = append(out, newToken(lang.Define, "", 0, len(vars))) + } else { + out = append(out, newToken(lang.Assign, "", 0, 1)) + } } return out, err } |
