cue: uniform handling of definitions

This mostly affects spacing, which will be tested in followup CLs.

Change-Id: I5308aca574308131d737173d6b9d344317a34356
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/5941
Reviewed-by: Marcel van Lohuizen <mpvl@google.com>
diff --git a/internal/encoding/encoding.go b/internal/encoding/encoding.go
index 03fc7ab..a828a1b 100644
--- a/internal/encoding/encoding.go
+++ b/internal/encoding/encoding.go
@@ -367,8 +367,9 @@
 		check(n, i.Imports, "imports", true)
 
 	case *ast.Field:
-		check(n, i.Definitions, "definitions", x.Token == token.ISA)
-		check(n, i.Data, "regular fields", x.Token != token.ISA)
+		check(n, i.Definitions, "definitions",
+			x.Token == token.ISA || internal.IsDefinition(x.Label))
+		check(n, i.Data, "regular fields", internal.IsRegularField(x))
 		check(n, constraints, "optional fields", x.Optional != token.NoPos)
 
 		_, _, err := ast.LabelName(x.Label)
diff --git a/internal/internal.go b/internal/internal.go
index a2cd8c7..ffc8e66 100644
--- a/internal/internal.go
+++ b/internal/internal.go
@@ -280,6 +280,38 @@
 	return false
 }
 
+func IsDefinition(label ast.Label) bool {
+	switch x := label.(type) {
+	case *ast.Alias:
+		if ident, ok := x.Expr.(*ast.Ident); ok {
+			return strings.HasPrefix(ident.Name, "#")
+		}
+	case *ast.Ident:
+		return strings.HasPrefix(x.Name, "#")
+	}
+	return false
+}
+
+func IsRegularField(f *ast.Field) bool {
+	if f.Token == token.ISA {
+		return false
+	}
+	var ident *ast.Ident
+	switch x := f.Label.(type) {
+	case *ast.Alias:
+		ident, _ = x.Expr.(*ast.Ident)
+	case *ast.Ident:
+		ident = x
+	}
+	if ident == nil {
+		return true
+	}
+	if strings.HasPrefix(ident.Name, "#") || strings.HasPrefix(ident.Name, "_") {
+		return false
+	}
+	return true
+}
+
 func EmbedStruct(s *ast.StructLit) *ast.EmbedDecl {
 	e := &ast.EmbedDecl{Expr: s}
 	if len(s.Elts) == 1 {