cue/ast: make package clause a declaration

This makes handling comments during generation
and analysis considerably easier.

Also fixes comments printing of import specs.

Change-Id: I0a77405524b40eff47e1e1e0dd3183ed3563b263
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2865
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/encoding/protobuf/parse.go b/encoding/protobuf/parse.go
index 4df5977..6432fce 100644
--- a/encoding/protobuf/parse.go
+++ b/encoding/protobuf/parse.go
@@ -112,11 +112,9 @@
 					default:
 						failf(x.Position, "unexpected ';' in %q", str)
 					}
-					p.file.Name = ast.NewIdent(p.shortPkgName)
 
 				case len(split) == 1:
 					p.shortPkgName = split[0]
-					p.file.Name = ast.NewIdent(p.shortPkgName)
 
 				default:
 					failf(x.Position, "malformed go_package clause %s", str)
@@ -127,6 +125,10 @@
 		}
 	}
 
+	if name := p.shortName(); name != "" {
+		p.file.Decls = append(p.file.Decls, &ast.Package{Name: ast.NewIdent(name)})
+	}
+
 	for _, e := range d.Elements {
 		switch x := e.(type) {
 		case *proto.Import:
@@ -137,6 +139,7 @@
 	}
 
 	imports := &ast.ImportDecl{}
+	importIdx := len(p.file.Decls)
 	p.file.Decls = append(p.file.Decls, imports)
 
 	for _, e := range d.Elements {
@@ -159,7 +162,9 @@
 	}
 
 	if len(imports.Specs) == 0 {
-		p.file.Decls = p.file.Decls[1:]
+		a := p.file.Decls
+		copy(a[importIdx:], a[importIdx+1:])
+		p.file.Decls = a[:len(a)-1]
 	}
 
 	return p, nil
@@ -209,7 +214,6 @@
 	if p.shortPkgName == "" && p.protoPkg != "" {
 		split := strings.Split(p.protoPkg, ".")
 		p.shortPkgName = split[len(split)-1]
-		p.file.Name = ast.NewIdent(p.shortPkgName)
 	}
 	return p.shortPkgName
 }