internal/filetypes: print attributes for definitions

Change-Id: Ie83998f34381668d6c170ed24568736072752c89
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/5742
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cmd/cue/cmd/testdata/script/def_jsonschema.txt b/cmd/cue/cmd/testdata/script/def_jsonschema.txt
index 7a24e5e..96e665f 100644
--- a/cmd/cue/cmd/testdata/script/def_jsonschema.txt
+++ b/cmd/cue/cmd/testdata/script/def_jsonschema.txt
@@ -25,7 +25,7 @@
 		// Age in years which must be equal to or greater than zero.
 		age?: >=0
 		...
-	}
+	} @jsonschema(schema="http://json-schema.org/draft-07/schema#",id="https://example.com/person.schema.json")
 }
 -- schema.json --
 {
diff --git a/internal/filetypes/filetypes_test.go b/internal/filetypes/filetypes_test.go
index 90a0ce8..15eec97 100644
--- a/internal/filetypes/filetypes_test.go
+++ b/internal/filetypes/filetypes_test.go
@@ -67,6 +67,7 @@
 			Incomplete:   true,
 			Imports:      true,
 			Docs:         true,
+			Attributes:   true,
 		},
 	}, {
 		name: "yaml",
@@ -85,6 +86,7 @@
 			Cycles:     true,
 			Stream:     true,
 			Docs:       true,
+			Attributes: true,
 		},
 	}, {
 		name: "yaml+openapi",
@@ -109,6 +111,7 @@
 			Incomplete:   true,
 			Imports:      true,
 			Docs:         true,
+			Attributes:   true,
 		},
 	}, {
 		name: "JSONDefault",
@@ -133,6 +136,7 @@
 			Incomplete:   true,
 			Imports:      true,
 			Docs:         true,
+			Attributes:   true,
 		},
 	}, {
 		name: "JSONSchema",
@@ -157,6 +161,7 @@
 			Incomplete:   true,
 			Imports:      true,
 			Docs:         true,
+			Attributes:   true,
 		},
 	}, {
 		name: "JSONOpenAPI",
@@ -182,6 +187,7 @@
 			Incomplete:   true,
 			Imports:      true,
 			Docs:         true,
+			Attributes:   true,
 		},
 	}, {
 		name: "OpenAPIDefaults",
@@ -207,6 +213,7 @@
 			Incomplete:   true,
 			Imports:      true,
 			Docs:         true,
+			Attributes:   true,
 		},
 	}, {
 		name: "Go",
@@ -232,6 +239,7 @@
 			Imports:      true,
 			Stream:       false,
 			Docs:         true,
+			Attributes:   true,
 		},
 	}}
 	for _, tc := range testCases {
diff --git a/internal/filetypes/types.cue b/internal/filetypes/types.cue
index 5191f38..93d4714 100644
--- a/internal/filetypes/types.cue
+++ b/internal/filetypes/types.cue
@@ -55,7 +55,7 @@
 	imports:      bool          // don't expand/allow imports
 	stream:       bool          // permit streaming
 	docs:         bool          // show/allow docs
-	attributes:   true | *false // include/allow attributes
+	attributes:   bool          // include/allow attributes
 }
 
 // modes sets defaults for different operational modes.
@@ -74,7 +74,8 @@
 	}
 
 	FileInfo :: x, x = {
-		docs: *true | false
+		docs:       *true | false
+		attributes: *true | false
 	}
 	encodings: cue: {
 		*forms.schema | _
@@ -91,7 +92,8 @@
 	}
 
 	FileInfo :: x, x = {
-		docs: true | *false
+		docs:       true | *false
+		attributes: true | *false
 	}
 	encodings: cue: {
 		*forms.data | _
@@ -100,7 +102,8 @@
 
 modes: ouptut: {
 	FileInfo :: x, x = {
-		docs: true | *false
+		docs:       true | *false
+		attributes: true | *false
 	}
 	encodings: cue: {
 		*forms.data | _
@@ -114,7 +117,8 @@
 		...
 	}
 	FileInfo :: x, x = {
-		docs: true | *false
+		docs:       true | *false
+		attributes: true | *false
 	}
 	encodings: cue: {
 		*forms.final | _
@@ -128,7 +132,8 @@
 	}
 
 	FileInfo :: x, x = {
-		docs: *true | false
+		docs:       *true | false
+		attributes: *true | false
 	}
 	encodings: cue: {
 		*forms.schema | _
@@ -277,8 +282,9 @@
 
 encodings: json: {
 	forms.data
-	stream: *false | true
-	docs:   false
+	stream:     *false | true
+	docs:       false
+	attributes: false
 }
 
 encodings: yaml: {
diff --git a/internal/filetypes/types.go b/internal/filetypes/types.go
index 9428c2d..a8c79ee 100644
--- a/internal/filetypes/types.go
+++ b/internal/filetypes/types.go
@@ -47,5 +47,5 @@
 	return v
 }
 
-// Data size: 1122 bytes.
-var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xccW_k\xe46\x10\xb76)T\xe2Z\xee\v\x14T?\x1c\u05c5\xeeC_\n\vG^\xae\aG\xa1\x94\xbe\x86#(^\xed\xc6=[2\xb6\\\x12\x9a}h{\xbd\xf6S\u07d6\xd1H\x96%{\x13\x92\x96r~I\xf67\x9a?\xfa\u034c4\xfa\xec\xf0\u05c2,\x0e\u007fg\xe4\xf0{\x96}{\xf8\ud110'\xa5\xea\x8cP\x85|)\x8c\x00\x9c\x9c\x90\u04df\xb46d\x91\x91\xd3\x1f\x85\xb9\"O2\xf2\u026b\xb2\x92\x1d9\xbc\u03f2\xec\x8b\u00df\vB>?\u007fS\xf4r\xb5-+\xa7\xf9>#\x87wY\xf6\xfc\xf0\xc7\t!\x9f\x06\xfc]F\x16\xe4\xf4\aQK0tjA\x96e\u0647\xa7\xdfC$\x84,\b\xa1\u6991\u076a\xe8%\xf9\xf0\xf4\x9bF\x14o\xc5N\xf2\u02fe\xac6\x8c\x81k\xbe^\xf3_\x19\x05\xabJ\xd4r\xcd\xdd\u05d9\xb6T;F\xa5*\xf4\xa6T\xbbA\xf0\x9d\x03\x18-\x95\x91m\xd3J#L\xa9\xd5\u065a\xbf\x8e\x00F\xb7\xba\xad\xcf\x06E\xce\xf9+\xdd\u058c\x1a\xb1\xeb\u03acWz\x8en\u07ac\a\u007f{\xb6g\xde\x05\u0106\u07d7/\xf2\x9c\xc5\xe6A\xe8\x94\xc0lX;\x8a\x1e<YGF^\x1b\xf4\x18\xf6\x93\x03\x983j\xc3D\xe5|#\x8c\xc8!\b\n\xff\xa1\x06\x8aG\xa2\xa2\x97\x13[E/Q\xd8\x15W\xb2\x8e5\x11B\xf1\u03ddV\x13e\x00\x83\xb8\x9a\x95W\xb8\xe0F\xd4S9\x80(\xde\xe9T\x88_^\xe8\r\x04\x98\xe4l\xcds\x00\a\x9a(\xad\x84\xb5\xb8\u04c0\xef\xad\u0366\xd5fb6\xb7\xa8s\u068a\xe6*\u06b1E<\x8f\xbb\x84\u019dcQo&4>*X_9.\\\xd1O\xa3\xc5o\x89D\xf3[~1g\x1c\x14C\x16\xc6y|\xa0\xa1\xa0\x8e\xe6t#\x95h\xcaG\xd9r\xba96\xc6K\xb9\x15}e\xa0\xd6m\xef>\x8b[w\x99\u007f\r\x86\x1c!{\xdb\u07ef\xd5V\xbb\x1e\u01d2\xf6\xdf\u04b4\xbd\xe4\xb7|+\xaaN2\xda\u02adl\xa5*d\xb7\x9e\n\x8b\x9b\xa2B\xc1\x8c\xe6FnKUB\xbc\xb0\xe2R\xeb\n\xb6\f\xbfE\x85*\x88\x15Zu\xa6\x15\xa52a\xdd[)\x1b\xb7\xa9n\xed\xb0R\x15\xban*i\xeca\u4c3a\u046d\xf1\x11 \u0599V\x8a\xda\a\x85\xd8F\x17]\xd8\"b\u0098\xb6\xbc\xec\rn\xc0\u017et\xc1\x03El\xcfj\xbd\x91XU\xa5jzwT\x8c\u0636\xe5\x16R\xb7\xb4\xfd\xeerFW\xab\x15V\x1fM\b\xa7.\x9e\x84\xb0\xb1\x86\xb7\xe9Kz8[(]B\xc7t+\xac$\xefk\xef\xf5\xae\x8dT\x1drn\x97\xe7+[G^9-\xa4%\x96wd\x06\xcb\aT\xed\x01\xf2H\xd5\aj\xdaBFuy\rI\xbd\x9f\xebq\x83\xdcOv\x92\xe0\x87\x91\r-r,\\\xdd7\u0197\xc6\xff\xed[\xfe\"\xaa\xff\xb8(\xffU\xac\xdbR\x89\xeaX\xb0\x1b\xb9\xfd\xe8\x1b\bN\xd3XuP\xf4\xe7\x8as6l+\\\xdd~\x05r\xc7o-\x97\x8c\x0e\xa7\x8f\x0f3\xe4ud&\xdc\xe0\x91#H\x853\x83j\xf6\x0eM\xdc'\x8a\xd1\xfa\xc4M\x98x\x92\xfd\x1cY\xaeg\xa3:\xb6\xfc\ue640\x8e\x89\x1fi\x85+\u007f\xde\xc9H\x81Y\xc4.>\x87\t\xf7\xc50(\xfa\x12\xf1F\xf3|\xcd/\xfc\x8f\xe9\xf45\\w~\f\xe3\xb7<\xb7\xe5k\xff\xf3\x93Jr\x8b\xa5\x05\x17\xdfg\xcf#\xf1W\xfcY\x8a0\x9a\xdcv\xa9\xbd\xf8\xdeK\xa5\xf1\r8\x91Fwa*\x8do\u0164\u0247LX\x02\xe6hr\xd4L\xb6<\x1f\xf8\xd1\xf4\xa1\x97\xc9`\x18\x92\x81\xbcC\x06` \u013fv\xbeN\xa6\x14\xdfYQv\xe6\xb3\xe2\u0458\xf9\xbb\x03\x8f\x99\x9eg8\xe5.\x99h\xed\xe3d(#?)\xc5\u0324\xbd\x9c>.\xc2+\a\xc7\xe3x\x1a\x1b66\x9e\xc2f9\x98\xa5`vWiw\xbb\x97W2V@o\xb9\uf085\x11\x83s\x18\xc2\xed/\x16\xa6\a\x87\xc2/6\f\x06)\n\xc7~@\vH.\x9a\xb5\x8b\a\xb3vm\xb5q\xfebX\xcd\xc3\xe6\u068c,\xc3\xf1\a\xe8N\xbb-Xt\xa7\x01\xc3c\u02bb\xb3\xbf\xe0\xc0)+\x19N\x97t\xb4\u03b7Z\xaf\xdc;m\xf4^\xf4c\xfe\x9e\u0173\xcf\xc3O\xae\xf0l9\xd2L\xc7\x1f%\xf1\x84tD\xfd\xc8#\xe4\x1e]\x96e\xff\x04\x00\x00\xff\xff\xbe\xea\xa5\xf0\xdb\x10\x00\x00")
+// Data size: 1132 bytes.
+var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xdcWO\x8b\xdc6\x14\xb7&[\xa8DR\xda\x0fPP}\b\xe9@\xe7Z\x18\b\xb9\xa4\x81\\J\xe9u\t\x8b\u05a3\xf1\xba\xb1%c\xcbe\x97\xee\x1c\u06a6i?p\u03d9\xf2\xf4$\u02d2=Iw!P\xaa\u02cc\u007fO\xef\xff{\xd2\u04e3\xe3\x9f+\xb2:\xfe\x95\x91\xe3oY\xf6\xed\xf1\xd7\a\x84<\xacTo\x84*\xe4sa\x04\xe0\xe4\x019\xfbQkCV\x199\xfbA\x98+\xf20#\x9f\xbc\xa8j\u0653\xe3\xdb,\u02fe<\xfe\xb1\"\xe4\xb3\xf3W\xc5 7\xfb\xaav\x9co3r|\x93eO\x8e\xbf? \xe4\u04c0\xbf\xc9\u020a\x9c}/\x1a\t\x82\xce,\u0232,{\xf7\xc5#\xb0\x84\x90\x15!\xd4\u0734\xb2\xdf\x14\x83$\xef>\xff\xbb\x15\xc5kQJ~9T\xf5\x8e1P\u0377[\xfe\v\xa3 U\x89Fn\xb9[\xbd\xe9*U2*U\xa1w\x95*G\xc2w\x0e`\xb4RFvm'\x8d0\x95V\u03f6\xfce\x040\xba\xd7]\xf3ld\u473f\xd0]\u00e8\x11e\xff\xccj\xa5\xe7\xa8\xe6\xd5v\xd4w`\a\xe6U\x80m\xb8\xbez\x9a\xe7,\x16\x0fD\xc7\x04b\xc3\u0789\xf5\xa0\xc9*2\xf2\u06a0\xc6\xe0O\x0e`\u03a85\x13\x99\xf3\x9d0\"\a#(\xfcC\x0e$OH\xc5 g\xb2\x8aA\"\xb1/\xaed\x13s\"\x84\xe4\x9fz\xadf\xcc\x00\x06r\xbdH\xafq\u00cdh\xe6t\x00\x91\\\ua508+/\xf4\x0e\fLr\xb6\xe59\x80c\x98(\xad\x85\x95Xj\xc0\x0fVf\xdbi3\x13\x9b[\xd4)\xedD{\x15yl\x11\x1f\xc72\tc\u98a8w\xb30\xde\xcbX_9\xce\\1\u032d\u0175\xc6@\xf3[~\xb1$\x1c\x18C\x16\xa6y\xbc\xa3\xa0\xc0\x8e\xe2t+\x95h\xab{\xc9r\xbc96\xc6s\xb9\x17Cm\xa0\xd6m\xef>\x8e[w\x9d\u007f\x03\x82\\@\x0e\xb6\xbf_\xaa\xbdv=\x8e%\xed\xd7\xdat\x83\xe4\xb7|/\xea^2\xda\u027d\xec\xa4*d\xbf\x9d\x13\x8b\x9b\xa2F\xc2\x02\xe7N\xee+U\x81\xbd\xb0\xe3R\xeb\x1a\\\x86oQ#\vb\x85V\xbd\xe9D\xa5L\xd8\xf7Z\xca\xd69\xd5o\x1dV\xa9B7m-\x8d=\x8c\x1c\u05b4\xba3\xde\x02\xc4z\xd3I\xd1x\xa3\x10\xdb\xe9\xa2\x0f.\"&\x8c\xe9\xaa\xcb\xc1\xa0\x03\x88Ad\u06015z'\xb1\x98*\xd5\x0e\ue118\x04\xd9VY\xc8\xd8\u06b6\xb9K\x15\xddl6Xt4\x893\x8d\xccH\xa2E#{f\xc4 \u052b\xf5\xc5>\x9e:\x94\xae\xa1\x97\xfa\r\u05987\xe7\xe0\xf9\xae\x8dT=f\xc3n\xcf7\xb6\xc2<sZbk,\xfcH\f\x16\x16\xb0\u06a3\u57acw\xe4\xb4%\x8e\xec\xf2\x1a\xd2\xfd\xe1tL[\xe7\xdf\xe6\xc3E|\xbd\x98\x8f\x19\xf1.\xf9\x80\xfe:\xe5\x91\x1eZ\xe3\v\xec?h\x9e\xfcY\xd4\x1f\xa5\xfa?\x9e;\xfbJ\x89\xfa\x94?;\xb9\xff?43\x9c\xf91\xeb\xc8\xe8O?\xa7l\xf4<\f\x18\xd3\xf3\x11C\xccom\xc8Y\xec\x937w\xea\x8a\xc7B\xe5LT\x84\x19$2\x022\xe9\xc4#\x9b\x9d\x02\x12\xd3\x12\xc6h\u007f\xa2&\xccl\x89\xaf'\xb6\xebE\xabNm\u007f\xffTC\xa7I\x99p\x85\xa1eY\u0244\x81Y\xc4n>\x87\x19\xfd\xe98\xea\xfa\n\xf3B\xf3|\xcb/\xfc\xc7|~\x1c/l?H\xf2[\x9e\xdb\xea\xb7\xff\xfc\xac\x95\xdc\xc3i1\xc67\xf2\x93\x88\xfc5\u007f\x9c\"\x8c&\xf7u*/\xbe\xb9Sj|\x87\u03e8\xd1m\x9eR\xe3{=9#\xc6L\xd8\x00,\x85\u0245f\xe6\xf2\xb2\xe1'\u04c7Zf\xa3mH\x06\xc6\x1d2\x00#-\xfe\xda\x17B2g\xf9\x8e\x8b\xb2\xb3\x9c\x15\x8f\u0191\u007f\xbf\xe1q\xa4\x97#\x9c\xc6.\x99\xc9\xed\xf3j,#?\xeb\u0151I{9}\x1e\x85w\x1a\x0e\xf8\xf1<9:6\x9d#\x17c\xb0\x18\x82E\xaf\xd2\xeevo\xc7d\xfc\x81\xder\ub085Q\x88sxF\xd8/\x16\xa6\x1c\x87\xc2\x17\x1b\a\x98\x14\x85[#\xa0\x05$\x17\xc5\xda\u0363X\xbb\xb7\xde9}1\xac\x96asm&\x92\xe1\xf8\x03\xb4\xd4\xce\x05\x8b\x96\x1a0<\xa6\xbc:\xfb\x05\aNU\xcbp\xba\xa4\x8f\x83|\xaf\xf5\u01bd4'/^\xffP9\xb0xF\xbb\xfb\xc9\x15\x1e^'\x9a\xe9\xf4\xb3*\x9e\xe4N\xb0\x9fxF}\x80\x97e\xd9?\x01\x00\x00\xff\xffjB\xe5G\x9d\x11\x00\x00")