summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interp/interpreter_test.go14
-rw-r--r--parser/decl.go28
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
}