encoding/gocode: make work for definitions

The Go code could only be correlated with
values so far. Allow either.

Change-Id: I3ebf8fd532a66eb11fe933f8e40a8e28b8eb5c42
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/4981
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/encoding/gocode/generator.go b/encoding/gocode/generator.go
index 557bdcd..f1e8166 100644
--- a/encoding/gocode/generator.go
+++ b/encoding/gocode/generator.go
@@ -139,7 +139,7 @@
 		pkgName = g.pkg.Name
 
 		for _, obj := range g.pkg.TypesInfo.Defs {
-			if obj == nil || obj.Pkg() != g.pkg.Types {
+			if obj == nil || obj.Pkg() != g.pkg.Types || obj.Parent() == nil {
 				continue
 			}
 			g.typeMap[obj.Name()] = obj.Type()
@@ -152,7 +152,7 @@
 		"pkgName": pkgName,
 	})
 
-	iter, err := inst.Value().Fields()
+	iter, err := inst.Value().Fields(cue.Definitions(true))
 	g.addErr(err)
 
 	for iter.Next() {
@@ -231,7 +231,10 @@
 
 	zero := "nil"
 
-	typ := g.typeMap[goTypeName]
+	typ, ok := g.typeMap[goTypeName]
+	if !ok && !mappedGoTypes(goTypeName) {
+		return
+	}
 	if goType == "" {
 		goType = goTypeName
 		if typ != nil {
@@ -276,3 +279,13 @@
 	}
 	return have
 }
+
+func mappedGoTypes(s string) bool {
+	switch s {
+	case "bool", "float32", "float64",
+		"int", "int8", "int16", "int32", "int64", "string",
+		"uint", "uint8", "uint16", "uint32", "uint64":
+		return true
+	}
+	return false
+}
diff --git a/encoding/gocode/templates.go b/encoding/gocode/templates.go
index db1b906..22fb940 100644
--- a/encoding/gocode/templates.go
+++ b/encoding/gocode/templates.go
@@ -19,7 +19,7 @@
 // Inputs:
 // .pkgName  the Go package name
 var headerCode = template.Must(template.New("header").Parse(
-	`// Code generated by gogen.Generate; DO NOT EDIT.
+	`// Code generated by gocode.Generate; DO NOT EDIT.
 
 package {{.pkgName}}
 
@@ -80,10 +80,11 @@
 // {{.prefix}}Make is called in the init phase to initialize CUE values for
 // validation functions.
 func {{.prefix}}Make(name string, x interface{}) cue.Value {
-	v := {{.prefix}}Instance.Lookup(name)
-	if !v.Exists() {
+	f, err := {{.prefix}}Instance.LookupField(name)
+	if err != nil {
 		panic(fmt.Errorf("could not find type %q in instance", name))
 	}
+	v := f.Value
 	if x != nil {
 		w, err := {{.prefix}}Codec.ExtractType(x)
 		if err != nil {
diff --git a/encoding/gocode/testdata/pkg1/cue_gen.go b/encoding/gocode/testdata/pkg1/cue_gen.go
index 1fe592f..ab8ac04 100644
--- a/encoding/gocode/testdata/pkg1/cue_gen.go
+++ b/encoding/gocode/testdata/pkg1/cue_gen.go
@@ -1,4 +1,4 @@
-// Code generated by gogen.Generate; DO NOT EDIT.
+// Code generated by gocode.Generate; DO NOT EDIT.
 
 package pkg1
 
@@ -65,10 +65,11 @@
 // cuegenMake is called in the init phase to initialize CUE values for
 // validation functions.
 func cuegenMake(name string, x interface{}) cue.Value {
-	v := cuegenInstance.Lookup(name)
-	if !v.Exists() {
+	f, err := cuegenInstance.LookupField(name)
+	if err != nil {
 		panic(fmt.Errorf("could not find type %q in instance", name))
 	}
+	v := f.Value
 	if x != nil {
 		w, err := cuegenCodec.ExtractType(x)
 		if err != nil {
@@ -79,5 +80,5 @@
 	return v
 }
 
-// Data size: 518 bytes.
-var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\x94R]k\xd4@\x14\x9d\x9b\xae`.U\xf0\a\b\xe3<m\xa4\xcd~\x80\b\xa1Qk\xad\u0407v\x17\x8b\"\x88\x0f\xe3\xeclv\xd8l&$w\u0165\xb6\xa0\xd6\xda_\xe7\xab\xff\xa6\x91|\xb5\xabo\xcd\xcb\\n\xe6\x9c{\xe6\xdcs\xaf\xf8\xe5\x80S\\2(\xbe3\xf6\xb4\xf8\xb6\x01\xb0i\x92\x9cd\xa2\xf4+I\xb2\xec\xc3\x06t\xdeXK\xe00\xe8\x8c%\xcd`\x93\xc1\x9d\xd7&\xd69\x14\x17\x8c\xb1\x87\xc5O\a\xe0\xfe\x87\x8fj\xa9\xfd\xa9\x89\x1b\xe4\x05\x83\u2731n\xf1c\x03\xe0\xeeM\xff\x9c\x81\x03\x9d#\xb9\xd0%Q\xa7j\"c\xec\xca\xf9]\\2\a\x00\xb6\xd4R\xc72\x89|\x9bE\xbd\xc8\xf6t\xa2\xec\xc4$e\xad\xecD\xf7H\xe74\x91${\xe9<\x1a\x00\xc0\x83\xf2\ucd7a}\xb5\xd4p\x05\u007fR\xa9\xe62\u04bc\xfc\x89h\x16\xa9\u0348w\xd1\x15\xb7`\x1f\nt\xc5B\u04ac<s\xcaL\x12\xe5\x02=\xc4\xc3\xd51eKE\x01?Aw7\xe0|'\x1c\xf4\xd1}\x19p\x1e\x9e\t%I\xf0\xaf\xfc\xb1\x98\xd8H\xa0;z\x1e\xf0\x11\xcdtVc\xd0=\bx)k\xe8\x1fT\xaa\x0e5\x9e\xf2\x17\x91\xedn)\xbbHcM:\xdck\n\x0f\u05c0\xed\xb0F\x88\xbfg\x13\x92&\xc9w\x93UW\xbc\x17\x1e\xba\xe3\xa0\xe6\x1d\x1b5/Y\xf1\xb8\xba\x1a\xf0\xe6{\x14\n\xd1\xd6\xd5\xc0\xcf26\x13I:|\xd7\x14{o\xf7=<N\xb522n\xc1\xe1\x99\xc8\ub3a8Q\xb4JuX\xab\xf0p\xb40t=\x80s\x93\x10_\x1f\xb1\xed\xe1\x91M\xf6\xbf\x98\x9c*\xb2\x93\u02a5\x1a\xdc<{\xdb\u00e9\xb5A\t\xc51e\xed3K\xdf\xfd\xc3eL&\x8d\xf5h\xda\x1d\xf4=<E\u019c\xdb\xe4c\xd8\xe4c\xf8o>\xe4Z:\x86\xd7\xe9\xb8Y1\xb6\x9bi\xc5\xec\f\xfa\xfd5\xe5\xff\x99/?)Q\x8a\xab}\x0f\xf8\xb3'\xc8\xd8\xdf\x00\x00\x00\xff\xff\xa9a\xee\x8d^\x03\x00\x00")
+// Data size: 533 bytes.
+var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\x94R]k\x13M\x14\x9e\xb3\xcd\v\xef\x1e\xaa\xe0\x0f\x10\u01b9\xcaJ\xbb\xf9\x00\x11\x96\xaeZk\x85\\\xa4\tFE\x10/\xc6\xc9d3d3\xb3\xecN\xc4P\x1bPk\xed\x9f\xf4\u059f\u0455\xfdj\xa3w\u075b9\x9c\xdd\xe7c\xe7y\xee\xe4?\x1dp\xf2K\x02\xf97B\x1e\xe7_w\x00v\x95\xce,\xd7B\xbe\xe0\x96\x17{\u0601\xd6+c,8\x04Zcn\xe7\xb0K\u0fd7*\x96\x19\xe4\x17\x84\x90\xfb\xf9\x0f\a\xe0\xee\xfb\x0fb%\xfd\x99\x8ak\xe4\x05\x81\xfc\x9c\x90v\xfe}\a\xe0\xff\x9b\xfd9\x01\aZ'|)\v\xa2V\xb9DB\u0215\xf3+\xbf$\x0e\x00\uc255\x8c\xb9\x8e|\x93F\x9d\xc8t\xa4\x16f\xaat1\v3\x95\x1d+3;\xe5\x96w\x92E\xd4\x03\x80{\xc5\xd9i|\xfbb%\xe1\n~'\\,x$i\xf1\x12Q-\x13\x93Z\xdaF\x97\u0742\xbd\xcf\xd0eKn\xe7\u0159\xd9T\xe9(c\xe8!\x0e\xd7\x13\x9b\xae\x84\r\xe8)\xba\x87\x01\xa5\aa\xaf\x8b\xee\xf3\x80\xd2p\xc3\x04\xb7\x8c~\xa1\x0f\xd9\xd4D\f\xdd\xd1\u04c0\x8e\xec\\\xa6\x15\x06\xddA@\v[}\u007fP\xba\x1aJ<\xa3\xcf\"\xd3\xde\x13f\x99\xc4\xd2\xca\xf0\xa8\x1e<\xdc\x026b\xb5\x11\xff\xc8h\u02d5\xce\x0e\xf5\xba\xcd\xde1\x0f\xddqP\xf1\x8e\x95X\x14\xac8)?\rh\xfd<\b\x19k\xe6R\xf0\x13\x8f\u0554[\x19\xbe\xad\x87\xa37\xc7\x1eN\x12)\x14\x8f\x1bp\xb8aY\xb5a\x15\u02ae\x13\x19V.<\x1cD\u06a4\xf2\xf5\\e\xa5L\xb8a3c\x18\x8e\x96\xca^\xebR\xaa\xb4-\xb1\xfb\x1e\x9e\x18}\xfcYe\xb6\xe4>-/\xad\xe2\xaaoa\xdf\u00d91A\x01\xc1\xb1M\x9b\xbf.b\xf0\x87\xab\u062a$\x96\xa3Y\xbb\xd7\xf5\xf0\f\tqnS\x97~]\x97\xfe\xdfu\xe1[e\xe9_\x97\xe5&ql\x82j\xcc\x1c\xf4\xba\xdd-\xe7\xffd\xc1?\nV\x98\xabb\b\xe8\x93GH\u021f\x00\x00\x00\xff\xffv\xf2MLm\x03\x00\x00")
diff --git a/encoding/gocode/testdata/pkg1/instance.cue b/encoding/gocode/testdata/pkg1/instance.cue
index 3358cbe..2e7dffd 100644
--- a/encoding/gocode/testdata/pkg1/instance.cue
+++ b/encoding/gocode/testdata/pkg1/instance.cue
@@ -22,6 +22,8 @@
 
 SpecialString: =~"special" @go(,type=string)
 
+IgnoreThis: =~"foo" // No corresponding Go type
+
 Omit: int @go(-)
 
 // NonExisting will be omitted as there is no equivalent Go type.
diff --git a/encoding/gocode/testdata/pkg2/cue_gen.go b/encoding/gocode/testdata/pkg2/cue_gen.go
index 74917b3..927bf6e 100644
--- a/encoding/gocode/testdata/pkg2/cue_gen.go
+++ b/encoding/gocode/testdata/pkg2/cue_gen.go
@@ -1,4 +1,4 @@
-// Code generated by gogen.Generate; DO NOT EDIT.
+// Code generated by gocode.Generate; DO NOT EDIT.
 
 package pkg2
 
@@ -39,10 +39,11 @@
 // cuegenMake is called in the init phase to initialize CUE values for
 // validation functions.
 func cuegenMake(name string, x interface{}) cue.Value {
-	v := cuegenInstance.Lookup(name)
-	if !v.Exists() {
+	f, err := cuegenInstance.LookupField(name)
+	if err != nil {
 		panic(fmt.Errorf("could not find type %q in instance", name))
 	}
+	v := f.Value
 	if x != nil {
 		w, err := cuegenCodec.ExtractType(x)
 		if err != nil {