diff --git a/gnovm/pkg/gnolang/preprocess.go b/gnovm/pkg/gnolang/preprocess.go index 8e794d7bd55..9168fc6f7c1 100644 --- a/gnovm/pkg/gnolang/preprocess.go +++ b/gnovm/pkg/gnolang/preprocess.go @@ -45,11 +45,12 @@ func PredefineFileSet(store Store, pn *PackageNode, fset *FileSet) { // skip declarations already predefined // (e.g. through recursion for a // dependent) - } else { - // recursively predefine dependencies. - d2, _ := predefineNow(store, fn, d) - fn.Decls[i] = d2 + continue } + + // recursively predefine dependencies. + d2, _ := predefineNow(store, fn, d) + fn.Decls[i] = d2 } } } @@ -63,11 +64,12 @@ func PredefineFileSet(store Store, pn *PackageNode, fset *FileSet) { // skip declarations already predefined // (e.g. through recursion for a // dependent) - } else { - // recursively predefine dependencies. - d2, _ := predefineNow(store, fn, d) - fn.Decls[i] = d2 + continue } + + // recursively predefine dependencies. + d2, _ := predefineNow(store, fn, d) + fn.Decls[i] = d2 } } } @@ -81,11 +83,12 @@ func PredefineFileSet(store Store, pn *PackageNode, fset *FileSet) { // skip declarations already predefined // (e.g. through recursion for a // dependent) - } else { - // recursively predefine dependencies. - d2, _ := predefineNow(store, fn, d) - fn.Decls[i] = d2 + continue } + + // recursively predefine dependencies. + d2, _ := predefineNow(store, fn, d) + fn.Decls[i] = d2 } } } @@ -97,11 +100,36 @@ func PredefineFileSet(store Store, pn *PackageNode, fset *FileSet) { if d.GetAttribute(ATTR_PREDEFINED) == true { // skip declarations already predefined (e.g. // through recursion for a dependent) - } else { - // recursively predefine dependencies. - d2, _ := predefineNow(store, fn, d) - fn.Decls[i] = d2 + continue } + + if vd, ok := d.(*ValueDecl); ok && len(vd.NameExprs) > 1 && len(vd.Values) == len(vd.NameExprs) { + split := make([]Decl, len(vd.NameExprs)) + + for j := 0; j < len(vd.NameExprs); j++ { + base := vd.Copy().(*ValueDecl) + base.NameExprs = NameExprs{NameExpr{ + Attributes: base.NameExprs[j].Attributes, + Path: base.NameExprs[j].Path, + Name: base.NameExprs[j].Name, + }} + + if j < len(base.Values) { + base.Values = Exprs{base.Values[j].Copy().(Expr)} + } + + split[j], _ = predefineNow(store, fn, base) + } + + fn.Decls = append(fn.Decls[:i], append(split, fn.Decls[i+1:]...)...) //nolint:makezero + i += len(vd.NameExprs) + continue + } + + // recursively predefine dependencies. + d2, _ := predefineNow(store, fn, d) + + fn.Decls[i] = d2 } } } diff --git a/gnovm/tests/files/var19.gno b/gnovm/tests/files/var19.gno index cbdce802e0a..99d7452f603 100644 --- a/gnovm/tests/files/var19.gno +++ b/gnovm/tests/files/var19.gno @@ -2,6 +2,7 @@ package main func main() { var a, b, c = 1, a+1 + println(a) println(b) println(c) diff --git a/gnovm/tests/files/var29.gno b/gnovm/tests/files/var29.gno new file mode 100644 index 00000000000..a37ccddd240 --- /dev/null +++ b/gnovm/tests/files/var29.gno @@ -0,0 +1,14 @@ +package main + +func main() { + println(a) + println(b) + println(c) +} + +var a, b, c = 1, a + 1, b + 1 + +// Output: +// 1 +// 2 +// 3 \ No newline at end of file diff --git a/gnovm/tests/files/var30.gno b/gnovm/tests/files/var30.gno new file mode 100644 index 00000000000..c8c9efabdef --- /dev/null +++ b/gnovm/tests/files/var30.gno @@ -0,0 +1,17 @@ +package main + +func main() { + println(a) + println(b) + println(c) + println(d) +} + +var a, b, c = 1, a + d, 3 +var d = a + +// Output: +// 1 +// 2 +// 3 +// 1 \ No newline at end of file