cue: allow omitting leading "#" for LookupDef

This is mostly to smooth the transition to #-style definitions.

Case in point: the internal filetypes package was upgraded and
to new-style definitions (included in this CL). The conversion was
automatic, but the code now requires a leading `#` prefix for
definitions. This change allows using `cue fix` without breaking
code.

Note that now a field name can never be a valid definition name
if it does not start with `#`.

Change-Id: Id69a9601e8d244c27a0855f454b730ce9baf6b9f
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/6240
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/types.go b/cue/types.go
index 179b133..a4b717a 100644
--- a/cue/types.go
+++ b/cue/types.go
@@ -1524,6 +1524,13 @@
 			return newChildValue(&o, i)
 		}
 	}
+	if !strings.HasPrefix(name, "#") {
+		alt := v.LookupDef("#" + name)
+		// Use the original error message if this resulted in an error as well.
+		if alt.Err() == nil {
+			return alt
+		}
+	}
 	return newErrValue(v, ctx.mkErr(v.path.v,
 		"defintion %q not found", name))
 }
diff --git a/internal/filetypes/filetypes_test.go b/internal/filetypes/filetypes_test.go
index 15eec97..090266d 100644
--- a/internal/filetypes/filetypes_test.go
+++ b/internal/filetypes/filetypes_test.go
@@ -42,7 +42,7 @@
 	}{{
 		name: "must specify encoding",
 		in:   build.File{},
-		out:  `FileInfo.encoding: non-concrete value string`,
+		out:  `#FileInfo.encoding: non-concrete value string`,
 	}, {
 		// Default without any
 		name: "cue",
diff --git a/internal/filetypes/types.cue b/internal/filetypes/types.cue
index 93d4714..1ddb67b 100644
--- a/internal/filetypes/types.cue
+++ b/internal/filetypes/types.cue
@@ -23,23 +23,23 @@
 // There
 
 // A File corresponds to a Go build.File.
-File :: {
+#File: {
 	filename:        string
-	encoding:        Encoding
-	interpretation?: Interpretation
-	form?:           Form
+	encoding:        #Encoding
+	interpretation?: #Interpretation
+	form?:           #Form
 	tags?: {[string]: string}
 }
 
 // Default is the file used for stdin and stdout. The settings depend
 // on the file mode.
-Default :: File & {
+#Default: #File & {
 	filename: *"-" | string
 }
 
 // A FileInfo defines how a file is encoded and interpreted.
-FileInfo :: {
-	File
+#FileInfo: {
+	#File
 
 	// For each of these fields it is explained what a true value means
 	// for encoding/decoding.
@@ -68,12 +68,11 @@
 // In input mode, settings flags are interpreted as what is allowed to occur
 // in the input. The default settings, therefore, tend to be permissive.
 modes: input: {
-	Default :: {
+	#Default: {
 		encoding: *"cue" | _
 		...
 	}
-
-	FileInfo :: x, x = {
+	#FileInfo: x, let x = {
 		docs:       *true | false
 		attributes: *true | false
 	}
@@ -86,12 +85,11 @@
 }
 
 modes: export: {
-	Default :: {
+	#Default: {
 		encoding: *"json" | _
 		...
 	}
-
-	FileInfo :: x, x = {
+	#FileInfo: x, let x = {
 		docs:       true | *false
 		attributes: true | *false
 	}
@@ -101,7 +99,7 @@
 }
 
 modes: ouptut: {
-	FileInfo :: x, x = {
+	#FileInfo: x, let x = {
 		docs:       true | *false
 		attributes: true | *false
 	}
@@ -112,11 +110,11 @@
 
 // eval is a legacy mode
 modes: eval: {
-	Default :: {
+	#Default: {
 		encoding: *"cue" | _
 		...
 	}
-	FileInfo :: x, x = {
+	#FileInfo: x, let x = {
 		docs:       true | *false
 		attributes: true | *false
 	}
@@ -126,12 +124,11 @@
 }
 
 modes: def: {
-	Default :: {
+	#Default: {
 		encoding: *"cue" | _
 		...
 	}
-
-	FileInfo :: x, x = {
+	#FileInfo: x, let x = {
 		docs:       *true | false
 		attributes: *true | false
 	}
@@ -159,16 +156,15 @@
 }
 
 // A Encoding indicates a file format for representing a program.
-Encoding :: !="" // | error("no encoding specified")
+#Encoding: !="" // | error("no encoding specified")
 
 // An Interpretation determines how a certain program should be interpreted.
 // For instance, data may be interpreted as describing a schema, which itself
 // can be converted to a CUE schema.
-Interpretation :: string
+#Interpretation: string
+#Form:           string
 
-Form :: string
-
-file: FileInfo & {
+file: #FileInfo & {
 
 	filename: "foo.json"
 	form:     "schema"
@@ -219,7 +215,7 @@
 }
 
 // forms defines schema for all forms. It does not include the form ID.
-forms: [Name=string]: FileInfo
+forms: [Name=string]: #FileInfo
 
 forms: "": _
 
@@ -327,7 +323,7 @@
 	stream: false
 }
 
-interpretations: [Name=string]: FileInfo
+interpretations: [Name=string]: #FileInfo
 
 interpretations: "": _
 
diff --git a/internal/filetypes/types.go b/internal/filetypes/types.go
index a8c79ee..fdbcc21 100644
--- a/internal/filetypes/types.go
+++ b/internal/filetypes/types.go
@@ -9,13 +9,6 @@
 	"cuelang.org/go/encoding/gocode/gocodec"
 )
 
-var cuegenvalFileInfo = cuegenMake("FileInfo", &FileInfo{})
-
-// Validate validates x.
-func (x *FileInfo) Validate() error {
-	return cuegenCodec.Validate(cuegenvalFileInfo, x)
-}
-
 var cuegenCodec, cuegenInstance = func() (*gocodec.Codec, *cue.Instance) {
 	var r *cue.Runtime
 	r = &cue.Runtime{}
@@ -47,5 +40,5 @@
 	return v
 }
 
-// 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")
+// Data size: 1131 bytes.
+var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xd4W_\x8b\xe4D\x10O\u03eeb7\xa7\xe8\a\x10b\x16\x8es\xc0y\x15\x06\x8e}9\x0f\xeeE\xc4\xd7\xe5Xz\x93N6^&\x1d\x92\x8e\xec\xe2\u0383z\x9e~Y\xbf\u008dTW\xffIw2w\xee\u0081\xce\xcbn~\xd5\xf5\xbf\xaa\xbb\xea\xd3\u00df+\xb2:\xfc\x95\x90\xc3oI\xf2\xed\xe1\xd7\x13B\x1e\xd5\xed\xa0x\x9b\x8bg\\q\xc0\xc9\t9\xfdQJEV\t9\xfd\x81\xabk\xf2(!\x1f=\xaf\x1b1\x90\u00db$I\xbe<\xfc\xb1\"\u4ccb\x97\xf9(6e\xdd\x18\xce7\t9\xbcN\x92'\x87\xdfO\b\xf9\xc4\xe3\xaf\x13\xb2\"\xa7\xdf\xf3\x9d\x00A\xa7\x1adI\x92\xbc\xfd\xe2c\xb0\x84\x90\x15!T\xddvb\xd8\xe4\xa3 o?\xff\xbb\xe3\xf9+^\x89\xf4j\xac\x9b\x82\xb13\u043dM\u007fa\x14\x84\xb6|'\xb6\xa9\xf9\r\xaa\xaf\u06caQ\xd1\u6ca8\xdb\xca\x11\u03be3\b\xa3u\xabD\xdf\xf5BqU\xcb\xf6|\x9b\x9e\xbd\b\x10FK\xd9\xef\xce\x1d+p?\x97\xfd\x8eQ\u016b\xe1\\+\xa6\x17\xa8\xe9\xe5\u05a9\u0733=sZ,\xf3WO\xb3\x8cE\xf2\x1d\x8b\x96:UcpP\xa3\xb5(q\xa3P\x9d\xf7'\x030cT\x1b\x89\xccY\xc1\x15\xcf\xc0\x02\n\xff!\a\x92'\xa4|\x143Y\xf9(\x908\xe4\xd7b\x17r\"\x84\xe4\x9f\x060;b\x06\u0413\x9bEz\x83\an\xf9nN\a\x10\u0255\x8c\x89\xf8\xcbrY\x80\x81Q\u02b6i\x06\xa0\v\x13\xa5\r\xd7\x12+\t\xf8^\xcb\xecz\xa9fb3\x8d\x1a\xa5=\xef\xae\x03\x8f5b\xe3XEa\xacL\x14e1\v\u30cc\xb5ec\xcc\xe5\xe3\xdcZ\xfc\xad1\xd0\xe9]z\xb9$\x1c\x18}\x16\xa6y\xbc\xa7 \u03ce\xe2d'Z\xde\xd5\x0f\x92ex3\xd3\x15\xcfD\xc9\xc7FmS\u0779\xe9\xe3\xb0u\xd7\xd97 \xc8\x04d\x8f\xed\xfd\xa2-1\x1eX\xd1\xf6\xb7V\xfd(\u04bb\xb4\xe4\xcd \x18\xedE)z\xd1\xe6b\xd8\u0389\xf9m\xde a\x81\xb3\x10e\xdd\xd6`.\x9c\xb8\x92\xb2\x01\x8f\xe1\x9b7\u0202X.\xdbA\xf5\xbcn\x95?\xf7J\x88\u03b84l\rV\xb7\xb9\xdcu\x8dP\xfa.2\u062e\x93\xbd\xb2\x16 6\xa8^p\xd7\xf4\x88\x152\x1f\xbc\x8b\x88q\xa5\xfa\xfajT\xe8\x00b:0l\xcfv\xb2\x10XLu\u06cd\xe6\x86\xf0A\xd6E\xe6\x13\xb6\xd6]n2E7\x9b\r\xd6\x1c\r\xc3L\x03+\xa2`\xd1\xc0\x9c\x19\xd1\u02f4Zm\xa9\xbb;\x87\xd25t\u04b0\xc1\n\xb3\xd6\xec-\u07cd\x12\xed\x80\xc9\xd0\u01f3\x8d\xae/\xcb\x1c\x17\xd8\x1a\xcb>\x10\x83e\x05\xac\xfaby \xeb=9u\x81#\xbb\xb8\x81l\xbf7\x19\u04fe\xf9\x97\xd90\xf1^/fcF\xbcO6\xa0\xb9\x8e\xf9#\xc7N\xb9\xe2\xfa\xcfY'~\xe6\xcd\a(\xfc\x0f\xe7LY\xb7\xbc9\xe6M!\xca\xff\u007f\x17\xc3U\x1f\xb2:F{\xeb\x19e\xceo?WL\xefE\fpz\xa7\x03\xceB\x9f\xac\xb9SW,\xe6\xabf\xa2\u008f\x1e\x81\x11\x90G#\x1e\xd9\xf4\xe3\x1f\x99\x161\x06\xe7#5~T\x8b|=r\\.Zu\xec\xf8\xbb\x87\x19:M\u0284\xcb\xcf*\xcbJ&\fL#\xfa\xf0\x05L\xe6O\xddx\xeb\n\xccJ\u0372mzi?\xe6s\xa3{\xa9\xed\x00\x99\u07a5\x99.~\xfd\x9f\x9d\xb1\xa2\a8\xae\xc6\xf0)~\x12\x90\xbfN\x1f\xc7\b\xa3\xd1C\x1d\xcb\v\x9f\xec\x98\x1a>\xde3j\xf0\x8c\xc7\xd4\xf0A\x8f\xae\b\x97\n\x1d\x80\xa50\x99\xd0\xcc\\^6\xfch\xfeP\xcbl\xa4\xf5\xc9\xc0\xb8C\x06`\x94\u017fz3\x88\x06,\xdbrAv\x96\xb3b\xd10\xf2\xef6<\x8c\xf4r\x84\xe3\xd8E\xb3\xb8^\xaa\\\x19\xd9!/\x8cL\xdc\xcc\xf1Z\xe4\xb73\x1c\xec\xc3A\xd296\x1d \x17c\xb0\x18\x82E\xaf\xe2\xf66\vc4\xf8@o\x99\xdf%\xf3CP\x9a\xc2\xfa\xa0\xbf\x98\x9fo\f\n_\u030d.1\n\xaf\x86GsH.\x8a\u0547\x9dX}\xb6)\x8c\xbe\x10n\x97au\xa3&\x92\xe1\xfe\x03\xb4\x92\xc6\x05\x8dV\x120\xbc\xa7\xac:\xfd\x057\x8e^\xe2\xdd\xf5\x12o\x05Y)\xe5\u01ac\x98\x93U\xd7n({\x16\x8eg\x0f\xb8\xbb\xfc\xcau\xa4\x9d\x8e/T\xe1\x18w\x84\xfd\xc8\x02\xf5\x1e^\x96$\xff\x04\x00\x00\xff\xff^\x83Y\u0756\x11\x00\x00")