mirror of
https://github.com/bluszcz/cutego.git
synced 2024-09-29 05:35:16 +03:00
188 lines
4.4 KiB
Go
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
|
|
}
|