Commit d3f05e73 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 8dd95245
...@@ -30,16 +30,11 @@ import ( ...@@ -30,16 +30,11 @@ import (
"os" "os"
) )
// information about one packet type // parsed & typechecked input
type PacketType struct {
name string
msgCode uint16 // message code for this packet type - derived from type order number in source
}
var fset = token.NewFileSet() var fset = token.NewFileSet()
var info = &types.Info{ var info = &types.Info{
Types: make(map[ast.Expr]types.TypeAndValue), Types: make(map[ast.Expr]types.TypeAndValue),
Uses: make(map[*ast.Ident]types.Object), //Uses: make(map[*ast.Ident]types.Object), XXX seems not needed
Defs: make(map[*ast.Ident]types.Object), Defs: make(map[*ast.Ident]types.Object),
} }
...@@ -59,8 +54,6 @@ func main() { ...@@ -59,8 +54,6 @@ func main() {
log.SetFlags(0) log.SetFlags(0)
//typeMap := map[string]*PacketType{} // XXX needed ?
// go through proto.go and collect packets type definitions // go through proto.go and collect packets type definitions
var mode parser.Mode = 0 // parser.Trace var mode parser.Mode = 0 // parser.Trace
var fv []*ast.File var fv []*ast.File
...@@ -85,8 +78,9 @@ func main() { ...@@ -85,8 +78,9 @@ func main() {
//ast.Print(fset, f) //ast.Print(fset, f)
//return //return
// prologue
f := fv[0] // proto.go comes first f := fv[0] // proto.go comes first
buf := Buffer{} buf := bytes.Buffer{}
buf.WriteString(`// DO NOT EDIT - AUTOGENERATED (by protogen.go) buf.WriteString(`// DO NOT EDIT - AUTOGENERATED (by protogen.go)
package neo package neo
...@@ -95,6 +89,7 @@ import ( ...@@ -95,6 +89,7 @@ import (
) )
`) `)
// go over packet types declaration and generate marshal code for them
for _, decl := range f.Decls { for _, decl := range f.Decls {
// we look for types (which can be only under GenDecl) // we look for types (which can be only under GenDecl)
gendecl, ok := decl.(*ast.GenDecl) gendecl, ok := decl.(*ast.GenDecl)
...@@ -138,14 +133,6 @@ import ( ...@@ -138,14 +133,6 @@ import (
} }
} }
/*
// wiresize returns wire size of a type
// type must be of fixed size (e.g. not a slice or map)
// XXX ast.Expr -> ?
func wiresize(*ast.Expr) int {
// TODO
}
*/
// info about wire decode/encode of a basic type // info about wire decode/encode of a basic type
type basicXXX struct { type basicXXX struct {
...@@ -172,20 +159,11 @@ var basicDecode = map[types.BasicKind]basicXXX { ...@@ -172,20 +159,11 @@ var basicDecode = map[types.BasicKind]basicXXX {
// XXX string ? // XXX string ?
} }
// bytes.Buffer + bell&whistless
type Buffer struct {
bytes.Buffer
}
func (b *Buffer) Printfln(format string, a ...interface{}) (n int, err error) {
return fmt.Fprintf(b, format+"\n", a...)
}
// state of decode codegen // state of decode codegen
type decoder struct { type decoder struct {
buf Buffer // buffer for generated code buf bytes.Buffer // buffer for generated code
n int // current decode position in data n int // current decode position in data
} }
func (d *decoder) emit(format string, a ...interface{}) { func (d *decoder) emit(format string, a ...interface{}) {
...@@ -345,90 +323,4 @@ func gendecode(typespec *ast.TypeSpec) string { ...@@ -345,90 +323,4 @@ func gendecode(typespec *ast.TypeSpec) string {
d.emit("return int(nread) + %v, nil", d.n) d.emit("return int(nread) + %v, nil", d.n)
d.emit("}") d.emit("}")
return d.buf.String() return d.buf.String()
// for _, fieldv := range t.Fields.List {
// // type B struct { ... }
// //
// // type A struct {
// // x, y int <- fieldv
// // B <- fieldv
//
// // embedding: change `B` -> `B B` (field type must be Ident)
// fieldnamev := fieldv.Names
// if fieldnamev == nil {
// fieldnamev = []*ast.Ident{fieldv.Type.(*ast.Ident)}
// }
//
//
// for _, fieldname := range fieldnamev {
// fieldtype := info.Types[fieldv.Type].Type
//
// switch u := fieldtype.Underlying().(type) {
// // we are processing: <fieldname> <fieldtype>
//
// // bool, uint32, string, ...
// case *types.Basic:
// if u.Kind() == types.String {
// emitstrbytes(fieldname.Name)
// continue
// }
//
// emit("p.%s = %s", fieldname, decodeBasic(u))
//
// case *types.Slice:
// // TODO
//
// case *types.Map:
// // TODO
//
//
// //case *types.Struct:
// // TODO
//
//
//
// /*
//
// // simple types like uint16
// case *ast.Ident:
// // TODO
//
// // array or slice
// case *ast.ArrayType:
// if fieldtype.Len != nil {
// log.Fatalf("%s: TODO arrays not suported", pos(fieldtype))
// }
//
// eltsize := wiresize(fieldtype.Elt) // TODO
//
// // len u32
// // [len] items
// emit("length = Uint32(data[%s:])", n)
// n += 4
// emit("for ; length != 0; length-- {")
// emit("}")
//
//
//
// // map
// case *ast.MapType:
// // len u32
// // [len] key, value
// emit("length = Uint32(data[%s:])", n)
// n += 4
//
// keysize := wiresize(fieldtype.Key)
// valsize := wiresize(fieldtype.Value)
//
// // XXX *ast.StructType ?
// */
//
// default:
// log.Fatalf("%v: field %v has unsupported type %v (%v)", pos(fieldv),
// fieldname, fieldtype, u)
// }
// }
// }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment