internal/core/export: extract docs from root

Change-Id: I0ddab86790c0447dbd8fab7e21dd37dd4e09c7b9
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9442
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Paul Jolly <paul@myitcv.org.uk>
diff --git a/internal/core/export/extract.go b/internal/core/export/extract.go
index 792563c..47cefaa 100644
--- a/internal/core/export/extract.go
+++ b/internal/core/export/extract.go
@@ -42,15 +42,22 @@
 			docs = append(docs, extractDocs(v, v.Conjuncts)...)
 			continue
 		}
-		f, ok := x.Source().(*ast.Field)
-		if !ok || hasShorthandValue(f) {
-			continue
-		}
 
-		fields = append(fields, f)
-		for _, cg := range f.Comments() {
-			if !containsDoc(docs, cg) && cg.Doc {
-				docs = append(docs, cg)
+		switch f := x.Source().(type) {
+		case *ast.Field:
+			if hasShorthandValue(f) {
+				continue
+			}
+			fields = append(fields, f)
+			for _, cg := range f.Comments() {
+				if !containsDoc(docs, cg) && cg.Doc {
+					docs = append(docs, cg)
+				}
+			}
+
+		case *ast.File:
+			if c := internal.FileComment(f); c != nil {
+				docs = append(docs, c)
 			}
 		}
 	}
diff --git a/internal/core/export/testdata/docs.txtar b/internal/core/export/testdata/docs.txtar
index 814b9f7..ae569e1 100644
--- a/internal/core/export/testdata/docs.txtar
+++ b/internal/core/export/testdata/docs.txtar
@@ -47,6 +47,8 @@
 -- out.txt --
 -- out/doc --
 []
+- foobar defines at least foo.
+
 [Foo]
 - A Foo fooses stuff.