Switch to the new go generator in the mojo tree. (does not affect known clients)

R=vardhan@google.com

Review URL: https://codereview.chromium.org/2091493002 .
diff --git a/mojo/public/tools/bindings/generators/mojom_go_generator.py b/mojo/public/tools/bindings/generators/mojom_go_generator.py
index 88d83ac..5ea0d5d 100644
--- a/mojo/public/tools/bindings/generators/mojom_go_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_go_generator.py
@@ -331,7 +331,7 @@
   def GenerateFiles(self, args):
     self.should_gen_mojom_types = "--generate_type_info" in args
 
-    self.Write(self.GenerateSource(), os.path.join("go", "src",
+    self.Write(self.GenerateSource(), os.path.join(
         GetPackagePath(self.module), "%s.go" % self.module.name))
 
   def GetJinjaParameters(self):
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni
index 6a59ff1..21c6dde 100644
--- a/mojo/public/tools/bindings/mojom.gni
+++ b/mojo/public/tools/bindings/mojom.gni
@@ -129,6 +129,8 @@
       "$generator_root/mojom_tool/bin/mac64/mojom.sha1",
       "$generator_root/mojom_tool/bin/linux64/generators/c.sha1",
       "$generator_root/mojom_tool/bin/mac64/generators/c.sha1",
+      "$generator_root/mojom_tool/bin/linux64/generators/go.sha1",
+      "$generator_root/mojom_tool/bin/mac64/generators/go.sha1",
       "$generator_root/pylib/mojom/__init__.py",
       "$generator_root/pylib/mojom/error.py",
       "$generator_root/pylib/mojom/generate/__init__.py",
@@ -210,7 +212,7 @@
         rebase_path(root_gen_dir),
         "--no-gen-imports",
         "--generators",
-        "legacy,c",
+        "legacy,c,go",
       ]
 
       if (defined(invoker.generate_type_info) && invoker.generate_type_info) {
diff --git a/mojo/public/tools/bindings/mojom_tool/bin/linux64/generators/go.sha1 b/mojo/public/tools/bindings/mojom_tool/bin/linux64/generators/go.sha1
index 5218915..8cfc7fa 100644
--- a/mojo/public/tools/bindings/mojom_tool/bin/linux64/generators/go.sha1
+++ b/mojo/public/tools/bindings/mojom_tool/bin/linux64/generators/go.sha1
@@ -1 +1 @@
-4a50903d242f3a1c295074f5c5e6eae4c5fe9c18
\ No newline at end of file
+c4324b8b93392c4e599de19014a1090b98ad2d5e
\ No newline at end of file
diff --git a/mojo/public/tools/bindings/mojom_tool/bin/mac64/generators/go.sha1 b/mojo/public/tools/bindings/mojom_tool/bin/mac64/generators/go.sha1
index a2be745..37ce6b2 100644
--- a/mojo/public/tools/bindings/mojom_tool/bin/mac64/generators/go.sha1
+++ b/mojo/public/tools/bindings/mojom_tool/bin/mac64/generators/go.sha1
@@ -1 +1 @@
-937cdb3a4c02e21eb994180eaf9fd0cd12adb126
\ No newline at end of file
+4938a2f7b348bebebab8a14cf2450ad879c5fe42
\ No newline at end of file
diff --git a/mojo/public/tools/bindings/run_code_generators.py b/mojo/public/tools/bindings/run_code_generators.py
index 7f67b02..7d8e5f1 100755
--- a/mojo/public/tools/bindings/run_code_generators.py
+++ b/mojo/public/tools/bindings/run_code_generators.py
@@ -32,7 +32,7 @@
                       help="output directory for generated files")
   parser.add_argument("-g", "--generators", dest="generators_string",
                       metavar="GENERATORS",
-                      default="c++,dart,go,javascript,java,python",
+                      default="c++,dart,javascript,java,python",
                       help="comma-separated list of generators")
   parser.add_argument("-s", "--src-root-path", dest="src_root_path",
                       default=".",
diff --git a/mojom/generators/common/cli.go b/mojom/generators/common/cli.go
index 1599f74..3e518ee 100644
--- a/mojom/generators/common/cli.go
+++ b/mojom/generators/common/cli.go
@@ -19,12 +19,16 @@
 	"mojom/generated/mojom_files"
 )
 
-// GetConfig provides the primary interface for generators.
-// By calling GetConfig, a generator implements the command line interface
+// GetCliConfig provides the primary interface for generators.
+// By calling GetCliConfig, a generator implements the command line interface
 // that is used by all generators.
 func GetCliConfig(args []string) GeneratorConfig {
-	config := new(generatorCliConfig)
 	flagSet := flag.NewFlagSet("Generator Common Flag Set", flag.ExitOnError)
+	return GetCliConfigWithFlagSet(args, flagSet)
+}
+
+func GetCliConfigWithFlagSet(args []string, flagSet *flag.FlagSet) GeneratorConfig {
+	config := new(generatorCliConfig)
 
 	var fileGraphFile string
 	flagSet.StringVar(&fileGraphFile, "file-graph", "-",
diff --git a/mojom/generators/go/go_generator.go b/mojom/generators/go/go_generator.go
index 90fc229..aa81757 100644
--- a/mojom/generators/go/go_generator.go
+++ b/mojom/generators/go/go_generator.go
@@ -5,6 +5,7 @@
 package main
 
 import (
+	"flag"
 	"log"
 	"os"
 	"path/filepath"
@@ -16,19 +17,29 @@
 
 func main() {
 	log.SetFlags(0)
-	config := common.GetCliConfig(os.Args)
+	flagSet := flag.NewFlagSet("Generator Go Flag Set", flag.ExitOnError)
+	var noGoSrc bool
+	flagSet.BoolVar(&noGoSrc, "no-go-src", false, "Do not prepend the output path with go/src.")
+
+	config := common.GetCliConfigWithFlagSet(os.Args, flagSet)
 	t := translator.NewTranslator(config.FileGraph())
-	goConfig := goConfig{config, t}
+	goConfig := goConfig{config, t, noGoSrc}
+	t.Config = goConfig
 	common.GenerateOutput(WriteGoFile, goConfig)
 }
 
 type goConfig struct {
 	common.GeneratorConfig
 	translator translator.Translator
+	noGoSrc    bool
 }
 
 func (c goConfig) OutputDir() string {
-	return filepath.Join(c.GeneratorConfig.OutputDir(), "go", "src")
+	if c.noGoSrc {
+		return c.GeneratorConfig.OutputDir()
+	} else {
+		return filepath.Join(c.GeneratorConfig.OutputDir(), "go", "src")
+	}
 }
 
 func WriteGoFile(fileName string, config common.GeneratorConfig) {
diff --git a/mojom/generators/go/templates/templates.go b/mojom/generators/go/templates/templates.go
index 4eba4ea..f0a7997 100644
--- a/mojom/generators/go/templates/templates.go
+++ b/mojom/generators/go/templates/templates.go
@@ -68,7 +68,7 @@
 {{- end}}
 
 {{- range $enum := $fileTmpl.Enums}}
-	{{ template "Enum" $enum }}
+	{{ template "EnumDecl" $enum }}
 {{- end}}
 
 {{- range $interface := $fileTmpl.Interfaces}}
diff --git a/mojom/generators/go/templates/unions.go b/mojom/generators/go/templates/unions.go
index 176b215..88c4b33 100644
--- a/mojom/generators/go/templates/unions.go
+++ b/mojom/generators/go/templates/unions.go
@@ -16,7 +16,7 @@
 {{ template "UnknownUnionFieldDecl" $union }}
 {{ template "UnknownUnionFieldEncode" $union }}
 
-{{- range $field := $union.Field}}
+{{- range $field := $union.Fields}}
 {{ template "UnionFieldDecl" $field }}
 
 {{ template "UnionFieldEncode" $field }}
diff --git a/mojom/generators/go/translator/translator.go b/mojom/generators/go/translator/translator.go
index 25e05b0..1e23103 100644
--- a/mojom/generators/go/translator/translator.go
+++ b/mojom/generators/go/translator/translator.go
@@ -11,6 +11,7 @@
 
 	"mojom/generated/mojom_files"
 	"mojom/generated/mojom_types"
+	"mojom/generators/common"
 )
 
 type Translator interface {
@@ -20,7 +21,10 @@
 type translator struct {
 	fileGraph *mojom_files.MojomFileGraph
 	// goTypeCache maps type keys to go type strings.
-	goTypeCache map[string]string
+	goTypeCache     map[string]string
+	imports         map[string]string
+	currentFileName string
+	Config          common.GeneratorConfig
 }
 
 func NewTranslator(fileGraph *mojom_files.MojomFileGraph) (t *translator) {
@@ -31,6 +35,9 @@
 }
 
 func (t *translator) TranslateMojomFile(fileName string) (tmplFile *TmplFile) {
+	t.currentFileName = fileName
+	t.imports = map[string]string{}
+
 	tmplFile = new(TmplFile)
 	file := t.fileGraph.Files[fileName]
 
@@ -82,6 +89,13 @@
 		Import{PackagePath: "fmt", PackageName: "fmt"},
 		Import{PackagePath: "sort", PackageName: "sort"},
 	}
+
+	for pkgName, pkgPath := range t.imports {
+		tmplFile.Imports = append(
+			tmplFile.Imports,
+			Import{PackagePath: pkgPath, PackageName: pkgName},
+		)
+	}
 	return tmplFile
 }
 
diff --git a/mojom/generators/go/translator/types.go b/mojom/generators/go/translator/types.go
index 2b8390d..72bdce8 100644
--- a/mojom/generators/go/translator/types.go
+++ b/mojom/generators/go/translator/types.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"path/filepath"
 
 	"mojom/generated/mojom_types"
 )
@@ -121,9 +122,9 @@
 }
 
 func (t *translator) translateTypeReference(typeRef mojom_types.TypeReference) (goType string) {
-	// TOOD(azani): Handle imported types.
 	typeKey := *typeRef.TypeKey
 	userDefinedType := t.fileGraph.ResolvedTypes[typeKey]
+
 	typeName := t.goTypeName(*typeRef.TypeKey)
 
 	if _, ok := userDefinedType.(*mojom_types.UserDefinedTypeInterfaceType); ok {
@@ -134,5 +135,17 @@
 		}
 	}
 
+	srcFileInfo := userDefinedTypeDeclData(userDefinedType).SourceFileInfo
+	if srcFileInfo != nil && srcFileInfo.FileName == t.currentFileName {
+		pkgName := fileNameToPackageName(srcFileInfo.FileName)
+		pkgPath, err := filepath.Rel(t.Config.SrcRootPath(), srcFileInfo.FileName)
+		if err != nil {
+			panic(err.Error())
+		}
+		pkgPath = pkgPath[:len(pkgPath)-len(filepath.Ext(pkgPath))-1]
+		t.imports[pkgName] = pkgPath
+		typeName = fmt.Sprintf("%s.%s", pkgName, typeName)
+	}
+
 	return typeName
 }