cutego/internal/binding/parser/variable.go
2017-06-21 17:32:20 +02:00

188 lines
4.4 KiB
Go

package parser
import (
"fmt"
"strings"
)
type Variable struct {
Name string `xml:"name,attr"`
Fullname string `xml:"fullname,attr"`
Href string `xml:"href,attr"`
Status string `xml:"status,attr"`
Access string `xml:"access,attr"`
Filepath string `xml:"filepath,attr"`
Static bool `xml:"static,attr"`
Output string `xml:"type,attr"`
Brief string `xml:"brief,attr"`
Getter []struct{} `xml:"getter"`
Setter []struct{} `xml:"setter"`
IsMocSynthetic bool
PureGoType string
}
func (v *Variable) Class() (*Class, bool) {
var class, ok = State.ClassMap[v.ClassName()]
return class, ok
}
func (v *Variable) ClassName() string {
var s = strings.Split(v.Fullname, "::")
if len(s) == 3 {
return s[1]
}
return s[0]
}
func (v *Variable) varToFunc() []*Function {
var funcs = make([]*Function, 0)
var class, ok = v.Class()
if !ok || class.HasFunctionWithName(v.Name) {
return funcs
}
funcs = append(funcs, &Function{
Name: v.Name,
Fullname: v.Fullname,
Href: v.Href,
Status: v.Status,
Access: v.Access,
Filepath: v.Filepath,
Static: v.Static,
Output: v.Output,
Meta: GETTER,
Brief: v.Brief,
})
if strings.Contains(v.Output, "const") {
return funcs
}
funcs = append(funcs, &Function{
Name: fmt.Sprintf("set%v", strings.Title(v.Name)),
Fullname: fmt.Sprintf("%v::set%v", v.ClassName(), strings.Title(v.Name)),
Href: v.Href,
Status: v.Status,
Access: v.Access,
Filepath: v.Filepath,
Static: v.Static,
Output: "void",
Meta: SETTER,
Parameters: []*Parameter{{Value: v.Output}},
TmpName: v.Name,
Brief: v.Brief,
})
return funcs
}
func (v *Variable) propToFunc(c *Class) []*Function {
var funcs = make([]*Function, 0)
if len(v.Getter) != 0 {
return funcs
}
if !(c.HasFunctionWithName(v.Name) ||
c.HasFunctionWithName(fmt.Sprintf("is%v", strings.Title(v.Name))) ||
c.HasFunctionWithName(fmt.Sprintf("has%v", strings.Title(v.Name)))) {
tmpF := &Function{
Name: v.Name,
Fullname: v.Fullname,
Href: v.Href,
Status: v.Status,
Access: v.Access,
Filepath: v.Filepath,
Static: v.Static,
Output: v.Output,
Meta: PLAIN,
Virtual: func() string {
if c.Module == MOC && !v.IsMocSynthetic {
return IMPURE
}
return ""
}(),
Signature: "()",
IsMocFunction: c.Module == MOC,
IsMocProperty: c.Module == MOC,
}
if tmpF.Output == "bool" {
if !strings.HasPrefix(strings.ToLower(v.Name), "is") {
tmpF.Name = fmt.Sprintf("is%v", strings.Title(tmpF.Name))
}
tmpF.Fullname = fmt.Sprintf("%v::%v", tmpF.ClassName(), tmpF.Name)
}
funcs = append(funcs, tmpF)
}
if len(v.Setter) != 0 || c.HasFunctionWithName(fmt.Sprintf("set%v", strings.Title(v.Name))) {
return funcs
}
funcs = append(funcs, &Function{
Name: fmt.Sprintf("set%v", strings.Title(v.Name)),
Fullname: fmt.Sprintf("%v::set%v", v.ClassName(), strings.Title(v.Name)),
Href: v.Href,
Status: v.Status,
Access: v.Access,
Filepath: v.Filepath,
Static: v.Static,
Output: "void",
Meta: PLAIN,
Virtual: func() string {
if c.Module == MOC && !v.IsMocSynthetic {
return IMPURE
}
return ""
}(),
Parameters: []*Parameter{{Name: v.Name, Value: v.Output}},
Signature: "()",
IsMocFunction: c.Module == MOC,
IsMocProperty: c.Module == MOC,
})
if c.Module == MOC {
funcs = append(funcs, &Function{
Name: fmt.Sprintf("%vChanged", v.Name),
Fullname: fmt.Sprintf("%v::%vChanged", v.ClassName(), v.Name),
Status: v.Status,
Access: v.Access,
Output: "void",
Meta: SIGNAL,
Parameters: []*Parameter{{Name: v.Name, Value: v.Output}},
Signature: "()",
IsMocFunction: true,
})
}
//add all overloaded property functions from base classes
//TODO: move rest into seperate function, as this func is called multiple times
for _, bc := range c.GetAllBases() {
var bclass, ok = State.ClassMap[bc]
if !ok {
continue
}
for _, bcf := range bclass.Functions {
if bcf.Name != fmt.Sprintf("set%v", strings.Title(v.Name)) || !bcf.Overload {
continue
}
var tmpF = *bcf
tmpF.Name = fmt.Sprintf("set%v", strings.Title(v.Name))
tmpF.Fullname = fmt.Sprintf("%v::%v", v.ClassName(), tmpF.Name)
funcs = append(funcs, &tmpF)
}
}
return funcs
}