2
0
mirror of synced 2025-02-23 06:48:15 +00:00

cmd/gobind: add experimental, objective-C code generation option.

Change-Id: Ia0e66ee0964bd40d868261994f7cb70260f3cbe9
Reviewed-on: https://go-review.googlesource.com/10841
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Hyang-Ah (Hana) Kim 2015-06-07 14:02:07 -04:00 committed by Hyang-Ah Hana Kim
parent 8f4eb9eb49
commit 26f6ffe0b5
2 changed files with 50 additions and 26 deletions

View File

@ -5,7 +5,6 @@
package main package main
import ( import (
"fmt"
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
@ -48,21 +47,35 @@ func genPkg(pkg *build.Package) {
} }
p := program.Created[0].Pkg p := program.Created[0].Pkg
w, closer, err := writer(*lang, p) fname := defaultFileName(*lang, p)
if err != nil {
errorf("%v", err)
return
}
switch *lang { switch *lang {
case "java": case "java":
err = bind.GenJava(w, fset, p) w, closer := writer(fname, p)
processErr(bind.GenJava(w, fset, p))
closer()
case "go": case "go":
err = bind.GenGo(w, fset, p) w, closer := writer(fname, p)
processErr(bind.GenGo(w, fset, p))
closer()
case "objc":
if fname == "" {
processErr(bind.GenObjc(os.Stdout, fset, p, true))
processErr(bind.GenObjc(os.Stdout, fset, p, false))
} else {
hname := fname[:len(fname)-2] + ".h"
w, closer := writer(hname, p)
processErr(bind.GenObjc(w, fset, p, true))
closer()
w, closer = writer(fname, p)
processErr(bind.GenObjc(w, fset, p, false))
closer()
}
default: default:
errorf("unknown target language: %q", *lang) errorf("unknown target language: %q", *lang)
} }
}
func processErr(err error) {
if err != nil { if err != nil {
if list, _ := err.(bind.ErrorList); len(list) > 0 { if list, _ := err.(bind.ErrorList); len(list) > 0 {
for _, err := range list { for _, err := range list {
@ -72,9 +85,6 @@ func genPkg(pkg *build.Package) {
errorf("%v", err) errorf("%v", err)
} }
} }
if err := closer(); err != nil {
errorf("error in closing output: %v", err)
}
} }
var fset = token.NewFileSet() var fset = token.NewFileSet()
@ -103,32 +113,46 @@ func parseFiles(dir string, filenames []string) []*ast.File {
return files return files
} }
func writer(lang string, pkg *types.Package) (w io.Writer, closer func() error, err error) { func writer(fname string, pkg *types.Package) (w io.Writer, closer func()) {
if *outdir == "" { if fname == "" {
return os.Stdout, func() error { return nil }, nil return os.Stdout, func() { return }
} }
// TODO(hakim): support output of multiple files e.g. .h/.m files for objc. dir := filepath.Dir(fname)
if err := os.MkdirAll(dir, 0755); err != nil {
if err := os.MkdirAll(*outdir, 0755); err != nil { errorf("invalid output dir: %v", err)
return nil, nil, fmt.Errorf("invalid output dir: %v\n", err) os.Exit(exitStatus)
} }
fname := defaultFileName(lang, pkg)
f, err := os.Create(filepath.Join(*outdir, fname)) f, err := os.Create(fname)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("invalid output dir: %v\n", err) errorf("invalid output dir: %v", err)
os.Exit(exitStatus)
} }
return f, f.Close, nil closer = func() {
if err := f.Close(); err != nil {
errorf("error in closing output file: %v", err)
}
}
return f, closer
} }
func defaultFileName(lang string, pkg *types.Package) string { func defaultFileName(lang string, pkg *types.Package) string {
if *outdir == "" {
return ""
}
switch lang { switch lang {
case "java": case "java":
firstRune, size := utf8.DecodeRuneInString(pkg.Name()) firstRune, size := utf8.DecodeRuneInString(pkg.Name())
className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:] className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:]
return className + ".java" return filepath.Join(*outdir, className+".java")
case "go": case "go":
return "go_" + pkg.Name() + ".go" return filepath.Join(*outdir, "go_"+pkg.Name()+".go")
case "objc":
firstRune, size := utf8.DecodeRuneInString(pkg.Name())
className := string(unicode.ToUpper(firstRune)) + pkg.Name()[size:]
return filepath.Join(*outdir, "Go"+className+".m")
} }
errorf("unknown target language: %q", lang) errorf("unknown target language: %q", lang)
os.Exit(exitStatus) os.Exit(exitStatus)

View File

@ -13,7 +13,7 @@ import (
) )
var ( var (
lang = flag.String("lang", "java", "target language for bindings, either java or go.") lang = flag.String("lang", "java", "target language for bindings, either java, go, or objc (experimental).")
outdir = flag.String("outdir", "", "result will be written to the directory instead of stdout.") outdir = flag.String("outdir", "", "result will be written to the directory instead of stdout.")
) )