make resource ids their own individual types. last commit before overhaul to sub-packages
This commit is contained in:
		@@ -4,10 +4,6 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// xgbResourceIdName is the name of the type used for all resource identifiers.
 | 
			
		||||
// As of right now, it needs to be declared somewhere manually.
 | 
			
		||||
var xgbGenResourceIdName = "Id"
 | 
			
		||||
 | 
			
		||||
// BaseTypeMap is a map from X base types to Go types.
 | 
			
		||||
// X base types should correspond to the smallest set of X types
 | 
			
		||||
// that can be used to rewrite ALL X types in terms of Go types.
 | 
			
		||||
@@ -27,7 +23,6 @@ var BaseTypeMap = map[string]string{
 | 
			
		||||
	"double": "float64",
 | 
			
		||||
	"char":   "byte",
 | 
			
		||||
	"void":   "byte",
 | 
			
		||||
	"Id":     "Id",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BaseTypeSizes should have precisely the same keys as in BaseTypeMap,
 | 
			
		||||
@@ -45,7 +40,10 @@ var BaseTypeSizes = map[string]uint{
 | 
			
		||||
	"double": 8,
 | 
			
		||||
	"char":   1,
 | 
			
		||||
	"void":   1,
 | 
			
		||||
	"Id":     4,
 | 
			
		||||
 | 
			
		||||
	// Id is a special type used to determine the size of all Xid types.
 | 
			
		||||
	// "Id" is not actually written in the source.
 | 
			
		||||
	"Id": 4,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TypeMap is a map from types in the XML to type names that is used
 | 
			
		||||
@@ -82,8 +80,16 @@ func (enum *Enum) Define(c *Context) {
 | 
			
		||||
 | 
			
		||||
// Resource types
 | 
			
		||||
func (res *Resource) Define(c *Context) {
 | 
			
		||||
	c.Putln("// Skipping resource definition of '%s'",
 | 
			
		||||
		SrcName(c.protocol, res.XmlName()))
 | 
			
		||||
	c.Putln("type %s uint32", res.SrcName())
 | 
			
		||||
	c.Putln("")
 | 
			
		||||
	c.Putln("func (c *Conn) New%sId() (%s, error) {",
 | 
			
		||||
		res.SrcName(), res.SrcName())
 | 
			
		||||
	c.Putln("id, err := c.NewId()")
 | 
			
		||||
	c.Putln("if err != nil {")
 | 
			
		||||
	c.Putln("return 0, err")
 | 
			
		||||
	c.Putln("}")
 | 
			
		||||
	c.Putln("return %s(id), nil", res.SrcName())
 | 
			
		||||
	c.Putln("}")
 | 
			
		||||
	c.Putln("")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -68,9 +68,9 @@ func (e *Error) ImplementsError(c *Context) {
 | 
			
		||||
	c.Putln("return err.Sequence")
 | 
			
		||||
	c.Putln("}")
 | 
			
		||||
	c.Putln("")
 | 
			
		||||
	c.Putln("func (err %s) BadId() Id {", e.ErrType())
 | 
			
		||||
	c.Putln("func (err %s) BadId() uint32 {", e.ErrType())
 | 
			
		||||
	if !c.protocol.isExt() {
 | 
			
		||||
		c.Putln("return Id(err.BadValue)")
 | 
			
		||||
		c.Putln("return err.BadValue")
 | 
			
		||||
	} else {
 | 
			
		||||
		c.Putln("return 0")
 | 
			
		||||
	}
 | 
			
		||||
@@ -128,8 +128,12 @@ func (e *ErrorCopy) ImplementsError(c *Context) {
 | 
			
		||||
	c.Putln("return err.Sequence")
 | 
			
		||||
	c.Putln("}")
 | 
			
		||||
	c.Putln("")
 | 
			
		||||
	c.Putln("func (err %s) BadId() Id {", e.ErrType())
 | 
			
		||||
	c.Putln("return Id(err.BadValue)")
 | 
			
		||||
	c.Putln("func (err %s) BadId() uint32 {", e.ErrType())
 | 
			
		||||
	if !c.protocol.isExt() {
 | 
			
		||||
		c.Putln("return err.BadValue")
 | 
			
		||||
	} else {
 | 
			
		||||
		c.Putln("return 0")
 | 
			
		||||
	}
 | 
			
		||||
	c.Putln("}")
 | 
			
		||||
	c.Putln("")
 | 
			
		||||
	c.Putln("func (err %s) Error() string {", e.ErrType())
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,8 @@ func (f *ListField) Read(c *Context, prefix string) {
 | 
			
		||||
	switch t := f.Type.(type) {
 | 
			
		||||
	case *Resource:
 | 
			
		||||
		length := f.LengthExpr.Reduce(prefix)
 | 
			
		||||
		c.Putln("%s%s = make([]Id, %s)", prefix, f.SrcName(), length)
 | 
			
		||||
		c.Putln("%s%s = make([]%s, %s)",
 | 
			
		||||
			prefix, f.SrcName(), t.SrcName(), length)
 | 
			
		||||
		c.Putln("for i := 0; i < int(%s); i++ {", length)
 | 
			
		||||
		ReadSimpleSingleField(c, fmt.Sprintf("%s%s[i]", prefix, f.SrcName()), t)
 | 
			
		||||
		c.Putln("}")
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ func (f *SingleField) Define(c *Context) {
 | 
			
		||||
func ReadSimpleSingleField(c *Context, name string, typ Type) {
 | 
			
		||||
	switch t := typ.(type) {
 | 
			
		||||
	case *Resource:
 | 
			
		||||
		c.Putln("%s = Id(Get32(buf[b:]))", name)
 | 
			
		||||
		c.Putln("%s = %s(Get32(buf[b:]))", name, t.SrcName())
 | 
			
		||||
	case *TypeDef:
 | 
			
		||||
		switch t.Size().Eval() {
 | 
			
		||||
		case 1:
 | 
			
		||||
 
 | 
			
		||||
@@ -395,11 +395,6 @@ func TypeSrcName(p *Protocol, typ Type) string {
 | 
			
		||||
		return newt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If it's a resource type, just use 'Id'.
 | 
			
		||||
	if _, ok := typ.(*Resource); ok {
 | 
			
		||||
		return xgbGenResourceIdName
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If there's a namespace to this type, just use it and be done.
 | 
			
		||||
	if colon := strings.Index(t, ":"); colon > -1 {
 | 
			
		||||
		namespace := t[:colon]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user