aboutsummaryrefslogtreecommitdiff
path: root/binary
diff options
context:
space:
mode:
authorIan Cottrell <iancottrell@google.com>2015-07-10 18:26:17 +0100
committerIan Cottrell <iancottrell@google.com>2015-07-13 12:28:10 +0000
commita1d50b6e33d446503947f8ef619b2205a28dd943 (patch)
treef396fc6e0f46179737d9c90026296f0b797576e9 /binary
parent08dbcfa588ec9a322948d80f2278144cb653659a (diff)
downloadgpu-a1d50b6e33d446503947f8ef619b2205a28dd943.tar.gz
Java encoder fixes
Fully explicit about java package. Expose tags to the higher level code. Allow java class name override using tags. Add exceptions to unimplemented paths. Add full package names for included types. Add id and create to java BinaryClass implementations. Change-Id: I2db935c66b340fb2fb952374ccd5d61a46bf0b2f
Diffstat (limited to 'binary')
-rw-r--r--binary/codergen/main.go8
-rw-r--r--binary/generate/embed.go32
-rw-r--r--binary/generate/generate.go33
-rw-r--r--binary/generate/java.go26
-rw-r--r--binary/generate/java.tmpl32
5 files changed, 82 insertions, 49 deletions
diff --git a/binary/codergen/main.go b/binary/codergen/main.go
index 249c0e17a..1b56d5e96 100644
--- a/binary/codergen/main.go
+++ b/binary/codergen/main.go
@@ -160,12 +160,10 @@ func output(t *generate.Templates, file *generate.File) error {
javaPackage, doJava := file.Directives["java.package"]
if *java != "" && !file.IsTest && doJava {
gen := generate.NewJava(file)
- gen.BasePackage = javaPackage
- gen.RelativePackage = file.Name
+ gen.JavaPackage = javaPackage
source, _ := file.Directives["java.source"]
indent, _ := file.Directives["java.indent"]
gen.MemberPrefix, _ = file.Directives["java.member_prefix"]
- gen.ClassPrefix, _ = file.Directives["java.class_prefix"]
gen.Copyright = strings.TrimSpace(copyright.Build(
"generated_aosp_java", copyright.Info{
Year: "2015",
@@ -176,8 +174,8 @@ func output(t *generate.Templates, file *generate.File) error {
}
pkgPath := strings.Replace(javaPackage, ".", "/", -1)
for _, s := range file.Structs {
- out := filepath.Join(*java, source, pkgPath, file.Name, s.Name+".java")
- gen.Struct = s
+ gen.Struct.Struct = s
+ out := filepath.Join(*java, source, pkgPath, gen.Struct.Name()+".java")
if err := Generate(gen, t, out); err != nil {
return err
}
diff --git a/binary/generate/embed.go b/binary/generate/embed.go
index b2a2f7a47..8ff36051b 100644
--- a/binary/generate/embed.go
+++ b/binary/generate/embed.go
@@ -422,6 +422,8 @@ const java_tmpl = `{{/*
* limitations under the License.
*/}}
+ {{define "Java.ClassName"}}{{if . | Contains "."}}{{File.JavaPackage}}.{{end}}{{.}}{{end}}
+
{{define "Java.Type#bool"}}boolean{{end}}
{{define "Java.Type#int8"}}byte{{end}}
{{define "Java.Type#uint8"}}byte{{end}}
@@ -436,7 +438,7 @@ const java_tmpl = `{{/*
{{define "Java.Type#string"}}String{{end}}
{{define "Java.Type#binary.ID"}}BinaryID{{end}}
{{define "Java.Type.Any"}}Object{{end}}
- {{define "Java.Type.Struct"}}{{.Name | CppName}}{{end}}
+ {{define "Java.Type.Struct"}}{{template "Java.ClassName" .Name}}{{end}}
{{define "Java.Type.Interface"}}BinaryObject{{end}}
{{define "Java.Type.Pointer"}}{{Call "Java.Type" .Type}}{{end}}
{{define "Java.Type.Array"}}{{Call "Java.Type" .ValueType}}[]{{end}}
@@ -445,7 +447,7 @@ const java_tmpl = `{{/*
{{define "Java.Encoder"}}
»»@Override
-»»public void encode(Encoder e, BinaryObject obj) throws IOException {
+»»public void encode(@NotNull Encoder e, BinaryObject obj) throws IOException {
»»»{{.Name}} o = ({{.Name}})obj;
{{range .Fields}}»»»{{Call "Java.Encode" (Var .Type "o." (JavaFieldName .Name))}}
{{end}}»»}{{end}}
@@ -454,7 +456,7 @@ const java_tmpl = `{{/*
{{define "Java.Encode.Struct"}}{{.Name}}.encode(e);{{end}}
{{define "Java.Encode.Pointer"}}e.object({{.Name}});{{end}}
{{define "Java.Encode.Interface"}}e.object({{.Name}});{{end}}
-{{define "Java.Encode.Any"}}// TODO: Java any handling{{end}}
+{{define "Java.Encode.Any"}}throw new RuntimeException("Java 'Any' not implemented");{{end}}
{{define "Java.Encode.Slice"}}e.int32({{.Name}}.length);
»»»for (int i = 0; i < {{.Name}}.length; i++) {
@@ -466,11 +468,11 @@ const java_tmpl = `{{/*
»»»»{{Call "Java.Encode" (Var .Type.ValueType .Name "[i]")}}
»»»}{{end}}
-{{define "Java.Encode.Map"}}TODO: Java map handling{{end}}
+{{define "Java.Encode.Map"}}throw new RuntimeException("Java map handling not implemented");{{end}}
{{define "Java.Decoder"}}
»»@Override
-»»public void decode(Decoder d, BinaryObject obj) throws IOException {
+»»public void decode(@NotNull Decoder d, BinaryObject obj) throws IOException {
»»»{{.Name}} o = ({{.Name}})obj;
{{range .Fields}}»»»{{Call "Java.Decode" (Var .Type "o." (JavaFieldName .Name))}}
{{end}}»»}{{end}}
@@ -479,7 +481,7 @@ const java_tmpl = `{{/*
{{define "Java.Decode.Struct"}}{{.Name}} = new {{.Type.Name}}(d);{{end}}
{{define "Java.Decode.Pointer"}}{{.Name}} = ({{Call "Java.Type" .Type}})d.object();{{end}}
{{define "Java.Decode.Interface"}}{{.Name}} = ({{Call "Java.Type" .Type}})d.object();{{end}}
-{{define "Java.Decode.Any"}}// TODO: Java any handling{{end}}
+{{define "Java.Decode.Any"}}throw new RuntimeException("Java 'Any' not implemented");{{end}}
{{define "Java.Decode.Slice"}}{{.Name}} = new {{Call "Java.Type" .Type.ValueType}}[d.int32()];
»»»for (int i = 0; i <{{.Name}}.length; i++) {
@@ -491,7 +493,7 @@ const java_tmpl = `{{/*
»»»»{{Call "Java.Decode" (Var .Type.ValueType .Name "[i]")}}
»»»}{{end}}
-{{define "Java.Decode.Map"}}TODO: Java map handling{{end}}
+{{define "Java.Decode.Map"}}throw new RuntimeException("Java map handling not implemented");{{end}}
{{define "Java.Field"}}»{{Call "Java.Type" .Type}} {{JavaFieldName .Name}};
{{end}}
@@ -507,7 +509,9 @@ const java_tmpl = `{{/*
{{end}}
{{define "Java.File"}}{{$.Copyright}}
-package {{.BasePackage}}.{{.RelativePackage}};
+package {{.JavaPackage}};
+
+import org.jetbrains.annotations.NotNull;
import com.android.tools.rpclib.binary.BinaryClass;
import com.android.tools.rpclib.binary.BinaryID;
@@ -525,21 +529,27 @@ public final class {{.Struct.Name}} implements BinaryObject {
»// Constructs and decodes a {@link {{.Struct.Name}}} from the {@link Decoder} d.
»public {{.Struct.Name}}(Decoder d) throws IOException {
-»»//TODO: decode(d);
+»»Class.INSTANCE.decode(d, this);
»}
{{range .Struct.Fields}}{{template "Java.Accessors" .}}{{end}}
-»@Override
+»@Override @NotNull
»public BinaryClass klass() { return Class.INSTANCE; }
»public static byte[] IDBytes = {{"{"}}{{range .Struct.ID}}{{ToS8 .}}, {{end}}{{"}"}};
»public static BinaryID ID = new BinaryID(IDBytes);
»public enum Class implements BinaryClass {
»»INSTANCE;
+
+»»@Override @NotNull
+»»public BinaryID id() { return ID; }
+
+»»@Override @NotNull
+»»public BinaryObject create() { return new {{.Struct.Name}}(); }
{{template "Java.Encoder" .Struct}}
{{template "Java.Decoder" .Struct}}
»}
»static {
- Namespace.register(ID, Class.INSTANCE);
+»»Namespace.register(ID, Class.INSTANCE);
»}
}
{{end}}
diff --git a/binary/generate/generate.go b/binary/generate/generate.go
index 157138077..91164118a 100644
--- a/binary/generate/generate.go
+++ b/binary/generate/generate.go
@@ -34,7 +34,6 @@ import (
const (
indent = "»"
- classPrefix = "⊹"
memberPrefix = "∍"
)
@@ -61,17 +60,17 @@ const (
// Any change to the Signature will cause the ID to change.
type Struct struct {
schema.Class
- IDName string // The name to give the ID of the type.
+ Tags Tags // The tags associated with the type.
Signature string // The full string type signature of the Struct.
}
-type tag string
+type Tags string
-func (t tag) Get(name string) string {
+func (t Tags) Get(name string) string {
return reflect.StructTag(t).Get(name)
}
-func (t tag) Flag(name string) bool {
+func (t Tags) Flag(name string) bool {
v := reflect.StructTag(t).Get(name)
if len(v) == 0 {
return false
@@ -96,19 +95,19 @@ func FromTypename(pkg *types.Package, n *types.TypeName, imports Imports) *Struc
tagged := false
for i := 0; i < t.NumFields(); i++ {
decl := t.Field(i)
- tag := tag(t.Tag(i))
+ tags := Tags(t.Tag(i))
if decl.Anonymous() &&
decl.Type().String() == binaryGenerate &&
- !tag.Flag("disable") {
+ !tags.Flag("disable") {
tagged = true
- s.IDName = tag.Get("id")
+ s.Tags = tags
continue
}
f := schema.Field{}
if !decl.Anonymous() {
f.Declared = decl.Name()
}
- f.Type = fromType(pkg, decl.Type(), tag, imports, b)
+ f.Type = fromType(pkg, decl.Type(), tags, imports, b)
delete(imports, pkg.Path())
s.Fields = append(s.Fields, f)
}
@@ -119,6 +118,15 @@ func FromTypename(pkg *types.Package, n *types.TypeName, imports Imports) *Struc
return s
}
+// IDName returns the name to give the ID of the type.
+func (s *Struct) IDName() string {
+ name := s.Tags.Get("id")
+ if name == "" {
+ name = "binaryID" + s.Name
+ }
+ return name
+}
+
// UpdateID recalculates the struct ID from the current signature.
func (s *Struct) UpdateID() {
b := &bytes.Buffer{}
@@ -132,9 +140,6 @@ func (s *Struct) UpdateID() {
fmt.Fprint(b, " }")
s.Signature = b.String()
s.TypeID = binary.NewID([]byte(s.Signature))
- if s.IDName == "" {
- s.IDName = "binaryID" + s.Name
- }
}
func spaceToUnderscore(r rune) rune {
@@ -158,7 +163,7 @@ func findBinaryObject(pkg *types.Package) *types.Interface {
}
// fromType creates a appropriate schema.Type object from a types.Type.
-func fromType(pkg *types.Package, from types.Type, tag tag, imports Imports, binObj *types.Interface) schema.Type {
+func fromType(pkg *types.Package, from types.Type, tags Tags, imports Imports, binObj *types.Interface) schema.Type {
alias := ""
fullname := types.TypeString(pkg, from) // fully-qualified name including full package path
name := strings.Map(spaceToUnderscore, path.Base(fullname))
@@ -188,7 +193,7 @@ func fromType(pkg *types.Package, from types.Type, tag tag, imports Imports, bin
return &schema.Primitive{Name: name, Method: m}
}
case *types.Pointer:
- return &schema.Pointer{Type: fromType(pkg, from.Elem(), tag, imports, binObj)}
+ return &schema.Pointer{Type: fromType(pkg, from.Elem(), tags, imports, binObj)}
case *types.Interface:
if binObj != nil && !types.Implements(from, binObj) {
return &any.Any{}
diff --git a/binary/generate/java.go b/binary/generate/java.go
index 6c46ceba3..7471a5ef1 100644
--- a/binary/generate/java.go
+++ b/binary/generate/java.go
@@ -25,15 +25,26 @@ func (*Templates) JavaFieldName(s string) string {
return memberPrefix + string(unicode.ToUpper(r)) + s[n:]
}
+type JavaStruct struct {
+ *Struct
+}
+
+// Name returns the Java name to give the type.
+func (s *JavaStruct) Name() string {
+ name := s.Tags.Get("java")
+ if name == "" {
+ name = s.Struct.Name
+ }
+ return name
+}
+
type Java struct {
*File
- Struct *Struct
- BasePackage string
- RelativePackage string
- Copyright string
- Indent string
- MemberPrefix string
- ClassPrefix string
+ Struct JavaStruct
+ JavaPackage string
+ Copyright string
+ Indent string
+ MemberPrefix string
}
func NewJava(file *File) *Java { return &Java{File: file} }
@@ -42,7 +53,6 @@ func (file *Java) Run(t *Templates, out string) (bool, error) {
s := string(b)
s = strings.Replace(s, indent, file.Indent, -1)
s = strings.Replace(s, memberPrefix, file.MemberPrefix, -1)
- s = strings.Replace(s, classPrefix, file.ClassPrefix, -1)
return []byte(s)
})
}
diff --git a/binary/generate/java.tmpl b/binary/generate/java.tmpl
index 1fbce07a9..f477160a5 100644
--- a/binary/generate/java.tmpl
+++ b/binary/generate/java.tmpl
@@ -14,6 +14,8 @@
* limitations under the License.
*/}}
+ {{define "Java.ClassName"}}{{if . | Contains "."}}{{File.JavaPackage}}.{{end}}{{.}}{{end}}
+
{{define "Java.Type#bool"}}boolean{{end}}
{{define "Java.Type#int8"}}byte{{end}}
{{define "Java.Type#uint8"}}byte{{end}}
@@ -28,7 +30,7 @@
{{define "Java.Type#string"}}String{{end}}
{{define "Java.Type#binary.ID"}}BinaryID{{end}}
{{define "Java.Type.Any"}}Object{{end}}
- {{define "Java.Type.Struct"}}{{.Name | CppName}}{{end}}
+ {{define "Java.Type.Struct"}}{{template "Java.ClassName" .Name}}{{end}}
{{define "Java.Type.Interface"}}BinaryObject{{end}}
{{define "Java.Type.Pointer"}}{{Call "Java.Type" .Type}}{{end}}
{{define "Java.Type.Array"}}{{Call "Java.Type" .ValueType}}[]{{end}}
@@ -37,7 +39,7 @@
{{define "Java.Encoder"}}
»»@Override
-»»public void encode(Encoder e, BinaryObject obj) throws IOException {
+»»public void encode(@NotNull Encoder e, BinaryObject obj) throws IOException {
»»»{{.Name}} o = ({{.Name}})obj;
{{range .Fields}}»»»{{Call "Java.Encode" (Var .Type "o." (JavaFieldName .Name))}}
{{end}}»»}{{end}}
@@ -46,7 +48,7 @@
{{define "Java.Encode.Struct"}}{{.Name}}.encode(e);{{end}}
{{define "Java.Encode.Pointer"}}e.object({{.Name}});{{end}}
{{define "Java.Encode.Interface"}}e.object({{.Name}});{{end}}
-{{define "Java.Encode.Any"}}// TODO: Java any handling{{end}}
+{{define "Java.Encode.Any"}}throw new RuntimeException("Java 'Any' not implemented");{{end}}
{{define "Java.Encode.Slice"}}e.int32({{.Name}}.length);
»»»for (int i = 0; i < {{.Name}}.length; i++) {
@@ -58,11 +60,11 @@
»»»»{{Call "Java.Encode" (Var .Type.ValueType .Name "[i]")}}
»»»}{{end}}
-{{define "Java.Encode.Map"}}TODO: Java map handling{{end}}
+{{define "Java.Encode.Map"}}throw new RuntimeException("Java map handling not implemented");{{end}}
{{define "Java.Decoder"}}
»»@Override
-»»public void decode(Decoder d, BinaryObject obj) throws IOException {
+»»public void decode(@NotNull Decoder d, BinaryObject obj) throws IOException {
»»»{{.Name}} o = ({{.Name}})obj;
{{range .Fields}}»»»{{Call "Java.Decode" (Var .Type "o." (JavaFieldName .Name))}}
{{end}}»»}{{end}}
@@ -71,7 +73,7 @@
{{define "Java.Decode.Struct"}}{{.Name}} = new {{.Type.Name}}(d);{{end}}
{{define "Java.Decode.Pointer"}}{{.Name}} = ({{Call "Java.Type" .Type}})d.object();{{end}}
{{define "Java.Decode.Interface"}}{{.Name}} = ({{Call "Java.Type" .Type}})d.object();{{end}}
-{{define "Java.Decode.Any"}}// TODO: Java any handling{{end}}
+{{define "Java.Decode.Any"}}throw new RuntimeException("Java 'Any' not implemented");{{end}}
{{define "Java.Decode.Slice"}}{{.Name}} = new {{Call "Java.Type" .Type.ValueType}}[d.int32()];
»»»for (int i = 0; i <{{.Name}}.length; i++) {
@@ -83,7 +85,7 @@
»»»»{{Call "Java.Decode" (Var .Type.ValueType .Name "[i]")}}
»»»}{{end}}
-{{define "Java.Decode.Map"}}TODO: Java map handling{{end}}
+{{define "Java.Decode.Map"}}throw new RuntimeException("Java map handling not implemented");{{end}}
{{define "Java.Field"}}»{{Call "Java.Type" .Type}} {{JavaFieldName .Name}};
{{end}}
@@ -99,7 +101,9 @@
{{end}}
{{define "Java.File"}}{{$.Copyright}}
-package {{.BasePackage}}.{{.RelativePackage}};
+package {{.JavaPackage}};
+
+import org.jetbrains.annotations.NotNull;
import com.android.tools.rpclib.binary.BinaryClass;
import com.android.tools.rpclib.binary.BinaryID;
@@ -117,21 +121,27 @@ public final class {{.Struct.Name}} implements BinaryObject {
»// Constructs and decodes a {@link {{.Struct.Name}}} from the {@link Decoder} d.
»public {{.Struct.Name}}(Decoder d) throws IOException {
-»»//TODO: decode(d);
+»»Class.INSTANCE.decode(d, this);
»}
{{range .Struct.Fields}}{{template "Java.Accessors" .}}{{end}}
-»@Override
+»@Override @NotNull
»public BinaryClass klass() { return Class.INSTANCE; }
»public static byte[] IDBytes = {{"{"}}{{range .Struct.ID}}{{ToS8 .}}, {{end}}{{"}"}};
»public static BinaryID ID = new BinaryID(IDBytes);
»public enum Class implements BinaryClass {
»»INSTANCE;
+
+»»@Override @NotNull
+»»public BinaryID id() { return ID; }
+
+»»@Override @NotNull
+»»public BinaryObject create() { return new {{.Struct.Name}}(); }
{{template "Java.Encoder" .Struct}}
{{template "Java.Decoder" .Struct}}
»}
»static {
- Namespace.register(ID, Class.INSTANCE);
+»»Namespace.register(ID, Class.INSTANCE);
»}
}
{{end}}