github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/mobile/cmd/gobind/gen.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "go/token" 9 "go/types" 10 "io" 11 "os" 12 "path/filepath" 13 "unicode" 14 "unicode/utf8" 15 16 "golang.org/x/mobile/bind" 17 ) 18 19 func genPkg(p *types.Package) { 20 fname := defaultFileName(*lang, p) 21 switch *lang { 22 case "java": 23 w, closer := writer(fname, p) 24 processErr(bind.GenJava(w, fset, p, *javaPkg)) 25 closer() 26 case "go": 27 w, closer := writer(fname, p) 28 processErr(bind.GenGo(w, fset, p)) 29 closer() 30 case "objc": 31 if fname == "" { 32 processErr(bind.GenObjc(os.Stdout, fset, p, *prefix, true)) 33 processErr(bind.GenObjc(os.Stdout, fset, p, *prefix, false)) 34 } else { 35 hname := fname[:len(fname)-2] + ".h" 36 w, closer := writer(hname, p) 37 processErr(bind.GenObjc(w, fset, p, *prefix, true)) 38 closer() 39 w, closer = writer(fname, p) 40 processErr(bind.GenObjc(w, fset, p, *prefix, false)) 41 closer() 42 } 43 default: 44 errorf("unknown target language: %q", *lang) 45 } 46 } 47 48 func processErr(err error) { 49 if err != nil { 50 if list, _ := err.(bind.ErrorList); len(list) > 0 { 51 for _, err := range list { 52 errorf("%v", err) 53 } 54 } else { 55 errorf("%v", err) 56 } 57 } 58 } 59 60 var fset = token.NewFileSet() 61 62 func writer(fname string, pkg *types.Package) (w io.Writer, closer func()) { 63 if fname == "" { 64 return os.Stdout, func() { return } 65 } 66 67 dir := filepath.Dir(fname) 68 if err := os.MkdirAll(dir, 0755); err != nil { 69 errorf("invalid output dir: %v", err) 70 os.Exit(exitStatus) 71 } 72 73 f, err := os.Create(fname) 74 if err != nil { 75 errorf("invalid output dir: %v", err) 76 os.Exit(exitStatus) 77 } 78 closer = func() { 79 if err := f.Close(); err != nil { 80 errorf("error in closing output file: %v", err) 81 } 82 } 83 return f, closer 84 } 85 86 func defaultFileName(lang string, pkg *types.Package) string { 87 if *outdir == "" { 88 return "" 89 } 90 91 switch lang { 92 case "java": 93 firstRune, size := utf8.DecodeRuneInString(pkg.Name()) 94 className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:] 95 return filepath.Join(*outdir, className+".java") 96 case "go": 97 return filepath.Join(*outdir, "go_"+pkg.Name()+".go") 98 case "objc": 99 firstRune, size := utf8.DecodeRuneInString(pkg.Name()) 100 className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:] 101 return filepath.Join(*outdir, "Go"+className+".m") 102 } 103 errorf("unknown target language: %q", lang) 104 os.Exit(exitStatus) 105 return "" 106 }