diff options
Diffstat (limited to 'binary')
-rw-r--r-- | binary/codergen/main.go | 8 | ||||
-rw-r--r-- | binary/generate/embed.go | 32 | ||||
-rw-r--r-- | binary/generate/generate.go | 33 | ||||
-rw-r--r-- | binary/generate/java.go | 26 | ||||
-rw-r--r-- | binary/generate/java.tmpl | 32 |
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}} |