internal: add ToFile and ToExpr

Also fixes cue/gen.go

Change-Id: I6497649e3863dbacd896d0246661ef2c9780f84e
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/5560
Reviewed-by: Marcel van Lohuizen <mpvl@google.com>
diff --git a/internal/encoding/encoding.go b/internal/encoding/encoding.go
index 14d579b..6618a02 100644
--- a/internal/encoding/encoding.go
+++ b/internal/encoding/encoding.go
@@ -37,6 +37,7 @@
 	"cuelang.org/go/encoding/jsonschema"
 	"cuelang.org/go/encoding/openapi"
 	"cuelang.org/go/encoding/protobuf"
+	"cuelang.org/go/internal"
 	"cuelang.org/go/internal/filetypes"
 	"cuelang.org/go/internal/third_party/yaml"
 )
@@ -91,25 +92,11 @@
 }
 
 func toFile(x ast.Expr) *ast.File {
-	switch x := x.(type) {
-	case nil:
-		return nil
-	case *ast.StructLit:
-		return &ast.File{Decls: x.Elts}
-	default:
-		return &ast.File{Decls: []ast.Decl{&ast.EmbedDecl{Expr: x}}}
-	}
+	return internal.ToFile(x)
 }
 
 func valueToFile(v cue.Value) *ast.File {
-	switch x := v.Syntax().(type) {
-	case *ast.File:
-		return x
-	case ast.Expr:
-		return toFile(x)
-	default:
-		panic("unrreachable")
-	}
+	return internal.ToFile(v.Syntax())
 }
 
 func (i *Decoder) File() *ast.File {