Bug fix and start improvements to subclassing.
This commit is contained in:
parent
a616761475
commit
38c7856b89
|
@ -216,8 +216,8 @@ func Start() (err error) {
|
|||
case *ast.ObjCInterfaceDecl:
|
||||
w.AddInterface(x)
|
||||
for _,ss := range Config.Subclasses {
|
||||
for ps,_ := range ss {
|
||||
if matches(x.Name,[]string{ps}) {
|
||||
if sc,ok := ss["superclass"]; ok {
|
||||
if matches(x.Name,sc) {
|
||||
Config.Classes = append(Config.Classes,x.Name)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,11 @@ import (
|
|||
ns "gitlab.wow.st/gmp/nswrap/examples/simple/ClassOne"
|
||||
)
|
||||
|
||||
func cb(super ns.ClassThreeSupermethods) ns.Int {
|
||||
fmt.Printf("In Go callback\n")
|
||||
return 0
|
||||
}
|
||||
|
||||
func main() {
|
||||
o := ns.ClassOneAlloc().Init()
|
||||
fmt.Println("i1 = ",o.Geti1())
|
||||
|
@ -20,7 +25,10 @@ func main() {
|
|||
fmt.Println(o.Hi2(np))
|
||||
o2 := ns.ClassTwoAlloc().Init()
|
||||
fmt.Println(o2.Hi1(ns1))
|
||||
o3 := ns.ClassThreeAlloc().Init()
|
||||
o3 := ns.ClassThreeAlloc()
|
||||
o3.Init()
|
||||
o3.Geti1Callback(cb)
|
||||
fmt.Println(o3.Hi2(np))
|
||||
fmt.Println(o3.Geti1())
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@ classes:
|
|||
subclasses:
|
||||
ClassThree:
|
||||
ClassTwo:
|
||||
- .*
|
||||
- geti1
|
||||
- (void)myMethod:int
|
||||
|
||||
imports: [ simple.h ]
|
||||
frameworks: [ Foundation ]
|
||||
|
|
|
@ -24,6 +24,7 @@ func IsGoInterface(gt string) bool {
|
|||
return goInterfaces[gt]
|
||||
}
|
||||
|
||||
|
||||
//TypeParameters maps, for each class, a TypedefName to a type, representing
|
||||
//the Objective-C type parameters for that class
|
||||
var TypeParameters map[string]map[string]string
|
||||
|
@ -194,6 +195,9 @@ func _goType(ct string) string {
|
|||
if ct == "Id" {
|
||||
ct = "Id"
|
||||
}
|
||||
if len(ct) > 1 && ShouldWrap(ct[1:]) {
|
||||
return ct[1:]
|
||||
}
|
||||
if len(ct) > 4 && ct[len(ct)-4:len(ct)] == "Void" {
|
||||
ct = ct[:len(ct)-5] + "unsafe.Pointer"
|
||||
}
|
||||
|
|
25
wrap/main.go
25
wrap/main.go
|
@ -981,14 +981,30 @@ func (w *Wrapper) _ProcessDelSub(dname string, ps map[string][]string,sub bool)
|
|||
i++
|
||||
var ms map[string]*Method
|
||||
if sub {
|
||||
if i > 1 {
|
||||
fmt.Printf("Multiple inheritance is not permitted:\n subclass %s already inherits from %s\n",dname,supr)
|
||||
os.Exit(-1)
|
||||
}
|
||||
interf := w.Interfaces[pname]
|
||||
if interf == nil {
|
||||
fmt.Printf("Failed to find interface %s for subclass %s\n",pname,dname)
|
||||
os.Exit(-1)
|
||||
}
|
||||
//fmt.Printf(" subclass for %s\n",pname)
|
||||
ms = interf.InstanceMethods
|
||||
supr = interf.GoName
|
||||
//fmt.Printf(" subclass for %s\n",pname)
|
||||
ms = map[string]*Method{}
|
||||
var addmeths func(s string)
|
||||
addmeths = func(s string) {
|
||||
if sup := types.Super(s); w.Interfaces[sup] != nil {
|
||||
addmeths(sup)
|
||||
}
|
||||
fmt.Printf("Adding methods for %s\n",s)
|
||||
for k,v := range w.Interfaces[s].InstanceMethods {
|
||||
ms[k] = v
|
||||
}
|
||||
}
|
||||
//for subclasses, add all superclass methods, depth first
|
||||
addmeths(interf.Name)
|
||||
} else {
|
||||
proto := w.Protocols[pname]
|
||||
if proto == nil {
|
||||
|
@ -1003,6 +1019,9 @@ func (w *Wrapper) _ProcessDelSub(dname string, ps map[string][]string,sub bool)
|
|||
//note:we may have capitalized the first character to make a goname,
|
||||
//but m.Name is not disambiguated for polymorphics...
|
||||
if !matches(string(m.Name[0])+gname[1:],pats) {
|
||||
if sub {
|
||||
//Add newly defined methods that don't match anything...
|
||||
}
|
||||
continue
|
||||
}
|
||||
if m.Type.IsFunction() || m.Type.IsFunctionPtr() || m.hasFunctionParam() {
|
||||
|
@ -1486,7 +1505,7 @@ import (
|
|||
of.WriteString(w.goCode.String())
|
||||
of.Close()
|
||||
|
||||
if len(w.Delegates) > 0 {
|
||||
if len(w.Delegates) > 0 || len(w.Subclasses) > 0 {
|
||||
ef.WriteString("package " + w.Package + "\n\n")
|
||||
ef.WriteString(w.cgoFlags.String() + "\n")
|
||||
ef.WriteString(w.cImports.String() + "\n")
|
||||
|
|
Loading…
Reference in New Issue
Block a user