From 840a055a1144f1640d9af10908e40f2c1f754501 Mon Sep 17 00:00:00 2001 From: Greg Date: Tue, 28 May 2019 20:04:39 -0400 Subject: [PATCH] Clean up variadic functions and methods. --- examples/foundation/main.go | 20 +++++++++++----- examples/foundation/nswrap.yaml | 2 ++ types/convert.go | 10 ++++++++ wrap/main.go | 41 +++++++++++++++++++++++++-------- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/examples/foundation/main.go b/examples/foundation/main.go index 1e085b6..1802152 100644 --- a/examples/foundation/main.go +++ b/examples/foundation/main.go @@ -78,18 +78,26 @@ func main() { }) nst := ns.NSStringWithGoString - fmt.Printf("\nGetObjectsAndKeysCount()\n") + fmt.Printf("\nNSDictionaryWithObjectsForKeys()\n") d := ns.NSDictionaryWithObjectsForKeys( ns.NSArrayWithObjects(nst("obj1"),nst("obj2")), ns.NSArrayWithObjects(nst("key1"),nst("key2")), ) os := make([]ns.Id,4) + fmt.Printf("Length of os is %d\n",len(os)) ks := make([]ns.Id,4) + fmt.Printf("\nGetObjects()\n") d.GetObjects(&os,&ks,4) - for _,o := range os { - fmt.Printf("--%s\n",o.NSString()) - } - for _,o := range ks { - fmt.Printf("--%s\n",o.NSString()) + fmt.Printf("Length of os is now %d\n",len(os)) + for i,k := range ks { + fmt.Printf("--%s -> %s\n",k.NSString(),os[i].NSString()) } + fmt.Printf("\nNSStringWithContentsOfURLEncoding()\n") + err := make([]ns.NSError,1) + n1 = ns.NSStringWithContentsOfURLEncoding(ns.NSURLWithGoString("htttypo://example.com"),0,&err) + fmt.Printf("err: %s\n",err[0].LocalizedDescription()) + + fmt.Printf("\nNSStringWithFormat()\n") + str := ns.NSStringWithFormat(nst("(%@) (%@)\n(%@)\n"),n2,n3,s1) + fmt.Printf("%s\n",str) } diff --git a/examples/foundation/nswrap.yaml b/examples/foundation/nswrap.yaml index 2657b71..ea8c56a 100644 --- a/examples/foundation/nswrap.yaml +++ b/examples/foundation/nswrap.yaml @@ -13,6 +13,8 @@ classes: - NSLocale - NSCharacterSet - NSString + - NSURL + - NSError - NSScanner - NSFileManager - NSObject diff --git a/types/convert.go b/types/convert.go index 21c2482..65313dc 100644 --- a/types/convert.go +++ b/types/convert.go @@ -305,6 +305,16 @@ func (t *Type) IsFunction() bool { return t.Node.IsFunction() } +func (t *Type) IsValist() bool { + if t == nil { + return false + } + if t.GoType() == "__va_list_tag" { // OS dependent + return true + } + return false +} + func (t *Type) ReturnType() *Type { if rt := t.Node.ReturnType(); rt != nil { return NewType(rt,t.Class) diff --git a/wrap/main.go b/wrap/main.go index 3b5d8db..af6a5e4 100644 --- a/wrap/main.go +++ b/wrap/main.go @@ -161,6 +161,12 @@ func (m *Method) LongName() string { return ret } +func (m *Method) HasUnsupportedType() bool { + return m.Type.IsFunction() || + m.Type.IsFunctionPtr() || + m.hasUnsupportedParam() +} + type Enum struct { Name string Type *types.Type @@ -190,7 +196,7 @@ func (a ByParams) Len() int { return len(a) } func (a ByParams) Swap(i,j int) { a[i], a[j] = a[j], a[i] } func (a ByParams) Less(i, j int) bool { return len(a[i].Parameters) < len(a[j].Parameters) } -//Disambiguate polyorphic method names +//Disambiguate overloaded method names func Disambiguate(mc *MethodCollection) { lst := map[string][]*Method{} for _,m := range mc.Methods { @@ -229,12 +235,15 @@ func (m Method) isVoid() bool { return m.Type.CType() == "void" } -//hasFunctionParam() returns true if a method has a function as a parameter. -func (m Method) hasFunctionParam() bool { +//hasUnsupportedParam() returns true if a method has a function as a parameter. +func (m Method) hasUnsupportedParam() bool { for _,p := range m.Parameters { if p.Type.IsFunction() || p.Type.IsFunctionPtr() { return true } + if pt := p.Type.PointsTo(); pt.IsValist() { + return true + } } return false } @@ -273,7 +282,7 @@ func (w Wrapper) objcparamlist(m *Method) string { first = false } else { if p.Type.Variadic { - str := []string{p.Pname + ":arr[0]"} + str := []string{p.Pname + ", arr[0]"} for i := 1; i < w.Vaargs; i++ { str = append(str,"arr["+strconv.Itoa(i)+"]") } @@ -391,12 +400,20 @@ func (w *Wrapper) AddFunction(n *ast.FunctionDecl) { m.Parameters = append(m.Parameters,p) i++ //fmt.Printf(" %s\n",p.Type.CType()) + case *ast.Variadic: + p := &Parameter{ + Vname: "object", + Type: types.NewTypeFromString("NSObject*",""), + } + p.Type.Variadic = true + m.Parameters = append(m.Parameters,p) + i++ } } if i > 0 && len(f.Children) > i { if e := f.Children[i]; len(e.Children) > 0 { //fmt.Println(" Next parameter: ",e.Children[0].String()) - m.Parameters[i-1].Type.Variadic = true + //m.Parameters[i-1].Type.Variadic = true } } w.Functions[n.Name] = m @@ -670,7 +687,14 @@ func (w *Wrapper) GetParms(n ast.Node,class string) ([]*Parameter,bool) { ret = append(ret,p) j++ case *ast.Variadic: - ret[j-1].Type.Variadic = true + //ret[j-1].Type.Variadic = true + p := &Parameter{ + Vname: "object", + Type: types.NewTypeFromString("NSObject*",""), + } + p.Type.Variadic = true + ret = append(ret,p) + j++ case *ast.AvailabilityAttr, *ast.UnavailableAttr, *ast.DeprecatedAttr: avail.Add(x) case *ast.Unknown: @@ -847,7 +871,7 @@ func (w *Wrapper) _processMethod(m *Method,fun bool) { if Debug { fmt.Printf(" method: %s (%s)\n", m.Name, m.Type) } - if m.Type.IsFunction() || m.Type.IsFunctionPtr() || m.hasFunctionParam() { + if m.HasUnsupportedType() { return } w.processType(m.Type) @@ -1098,7 +1122,6 @@ func (w *Wrapper) MethodFromSig(sig,class string) *Method { } func (w *Wrapper) ProcessSubclass(sname string, sc *Subclass) { - fmt.Printf("Wrapping %s\n",sname) gname := strings.Title(sname) types.Wrap(gname) types.SetSuper(gname,sc.Super) @@ -1187,7 +1210,7 @@ func (w *Wrapper) _ProcessDelSub(dname string, ps map[string][]string, nms []*Me if !matches(string(m.Name[0])+m.GoName[1:],pats) { continue } - if m.Type.IsFunction() || m.Type.IsFunctionPtr() || m.hasFunctionParam() { + if m.HasUnsupportedType() { continue } methods = append(methods,m)