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  }