aboutsummaryrefslogtreecommitdiff
path: root/binary
diff options
context:
space:
mode:
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}}