internal/core/export: explicit generation of adt types

Change-Id: Ib51a41d9103c6f9e684395a009c8c3b81462c273
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/6622
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
diff --git a/internal/core/export/extract.go b/internal/core/export/extract.go
index c3b11ef..22d901a 100644
--- a/internal/core/export/extract.go
+++ b/internal/core/export/extract.go
@@ -29,10 +29,14 @@
 //     foo: bar: 2
 //
 func ExtractDoc(v *adt.Vertex) (docs []*ast.CommentGroup) {
+	return extractDocs(v, v.Conjuncts)
+}
+
+func extractDocs(v *adt.Vertex, a []adt.Conjunct) (docs []*ast.CommentGroup) {
 	fields := []*ast.Field{}
 
 	// Collect docs directly related to this Vertex.
-	for _, x := range v.Conjuncts {
+	for _, x := range a {
 		f, ok := x.Source().(*ast.Field)
 		if !ok || hasShorthandValue(f) {
 			continue
@@ -46,6 +50,10 @@
 		}
 	}
 
+	if v == nil {
+		return docs
+	}
+
 	// Collect docs from parent scopes in collapsed fields.
 	for p := v.Parent; p != nil; p = p.Parent {