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 {