Switch from toml to yaml for configuration files. Begin scaffolding
for Protocols and Delegates.
This commit is contained in:
		
							parent
							
								
									cccbfbbc00
								
							
						
					
					
						commit
						b00ecd4ac0
					
				| 
						 | 
					@ -210,6 +210,8 @@ func Parse(fullline string) Node {
 | 
				
			||||||
		return parseObjCObjectPointerType(line)
 | 
							return parseObjCObjectPointerType(line)
 | 
				
			||||||
	case "ObjCProtocol":
 | 
						case "ObjCProtocol":
 | 
				
			||||||
		return parseObjCProtocol(line)
 | 
							return parseObjCProtocol(line)
 | 
				
			||||||
 | 
						case "ObjCProtocolDecl":
 | 
				
			||||||
 | 
							return parseObjCProtocolDecl(line)
 | 
				
			||||||
	case "ObjCPropertyDecl":
 | 
						case "ObjCPropertyDecl":
 | 
				
			||||||
		return parseObjCPropertyDecl(line)
 | 
							return parseObjCPropertyDecl(line)
 | 
				
			||||||
	case "ObjCTypeParamDecl":
 | 
						case "ObjCTypeParamDecl":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										55
									
								
								ast/objc_protocol_decl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								ast/objc_protocol_decl.go
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					package ast
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ObjCProtocolDecl is node represents an Objective-C property declaration
 | 
				
			||||||
 | 
					type ObjCProtocolDecl struct {
 | 
				
			||||||
 | 
						Addr         Address
 | 
				
			||||||
 | 
						Pos          Position
 | 
				
			||||||
 | 
						Position2    string
 | 
				
			||||||
 | 
						Name         string
 | 
				
			||||||
 | 
						ChildNodes   []Node
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func parseObjCProtocolDecl(line string) *ObjCProtocolDecl {
 | 
				
			||||||
 | 
						groups := groupsFromRegex(
 | 
				
			||||||
 | 
					                `(?:prev (?P<prev>0x[0-9a-f]+) )?
 | 
				
			||||||
 | 
							<(?P<position>.*<scratch space>.*?|.*<built-in>.*?|.*<invalid sloc>|.*?)>
 | 
				
			||||||
 | 
							(?P<position2> <invalid sloc>| col:\d+| line:\d+:\d+)?
 | 
				
			||||||
 | 
							(?P<name>.*?)`,
 | 
				
			||||||
 | 
							line,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &ObjCProtocolDecl{
 | 
				
			||||||
 | 
							Addr:         ParseAddress(groups["address"]),
 | 
				
			||||||
 | 
							Pos:          NewPositionFromString(groups["position"]),
 | 
				
			||||||
 | 
							Position2:    strings.TrimSpace(groups["position2"]),
 | 
				
			||||||
 | 
							Name:         strings.TrimSpace(groups["name"]),
 | 
				
			||||||
 | 
							ChildNodes:   []Node{},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AddChild adds a new child node. Child nodes can then be accessed with the
 | 
				
			||||||
 | 
					// Children attribute.
 | 
				
			||||||
 | 
					func (n *ObjCProtocolDecl) AddChild(node Node) {
 | 
				
			||||||
 | 
						n.ChildNodes = append(n.ChildNodes, node)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Address returns the numeric address of the node. See the documentation for
 | 
				
			||||||
 | 
					// the Address type for more information.
 | 
				
			||||||
 | 
					func (n *ObjCProtocolDecl) Address() Address {
 | 
				
			||||||
 | 
						return n.Addr
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Children returns the child nodes. If this node does not have any children or
 | 
				
			||||||
 | 
					// this node does not support children it will always return an empty slice.
 | 
				
			||||||
 | 
					func (n *ObjCProtocolDecl) Children() []Node {
 | 
				
			||||||
 | 
						return n.ChildNodes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Position returns the position in the original source code.
 | 
				
			||||||
 | 
					func (n *ObjCProtocolDecl) Position() Position {
 | 
				
			||||||
 | 
						return n.Pos
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -2,13 +2,14 @@ package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/BurntSushi/toml"
 | 
						"gopkg.in/yaml.v2"
 | 
				
			||||||
	"gitlab.wow.st/gmp/nswrap/ast"
 | 
						"gitlab.wow.st/gmp/nswrap/ast"
 | 
				
			||||||
	"gitlab.wow.st/gmp/nswrap/types"
 | 
						"gitlab.wow.st/gmp/nswrap/types"
 | 
				
			||||||
	"gitlab.wow.st/gmp/nswrap/wrap"
 | 
						"gitlab.wow.st/gmp/nswrap/wrap"
 | 
				
			||||||
| 
						 | 
					@ -18,15 +19,16 @@ var Debug = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type conf struct {
 | 
					type conf struct {
 | 
				
			||||||
	Package string
 | 
						Package string
 | 
				
			||||||
	InputFiles []string
 | 
						Inputfiles []string
 | 
				
			||||||
	Classes []string
 | 
						Classes []string
 | 
				
			||||||
	Functions []string
 | 
						Functions []string
 | 
				
			||||||
	Enums []string
 | 
						Enums []string
 | 
				
			||||||
 | 
						Delegates map[string][]string
 | 
				
			||||||
	Frameworks []string
 | 
						Frameworks []string
 | 
				
			||||||
	Imports []string
 | 
						Imports []string
 | 
				
			||||||
	SysImports []string
 | 
						Sysimports []string
 | 
				
			||||||
	Pragma []string
 | 
						Pragma []string
 | 
				
			||||||
	VaArgs int
 | 
						Vaargs int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Config conf
 | 
					var Config conf
 | 
				
			||||||
| 
						 | 
					@ -149,7 +151,7 @@ func matches(x string, rs []string) bool {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Start begins transpiling an input file.
 | 
					// Start begins transpiling an input file.
 | 
				
			||||||
func Start() (err error) {
 | 
					func Start() (err error) {
 | 
				
			||||||
	for _, in := range Config.InputFiles {
 | 
						for _, in := range Config.Inputfiles {
 | 
				
			||||||
		_, err := os.Stat(in)
 | 
							_, err := os.Stat(in)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return fmt.Errorf("Input file %s is not found", in)
 | 
								return fmt.Errorf("Input file %s is not found", in)
 | 
				
			||||||
| 
						 | 
					@ -161,7 +163,7 @@ func Start() (err error) {
 | 
				
			||||||
	// 3. Generate AST
 | 
						// 3. Generate AST
 | 
				
			||||||
	cargs := []string{"-xobjective-c", "-Xclang", "-ast-dump",
 | 
						cargs := []string{"-xobjective-c", "-Xclang", "-ast-dump",
 | 
				
			||||||
			"-fsyntax-only","-fno-color-diagnostics"}
 | 
								"-fsyntax-only","-fno-color-diagnostics"}
 | 
				
			||||||
	cargs = append(cargs,Config.InputFiles...)
 | 
						cargs = append(cargs,Config.Inputfiles...)
 | 
				
			||||||
	fmt.Printf("Generating AST\n")
 | 
						fmt.Printf("Generating AST\n")
 | 
				
			||||||
	astPP, err := exec.Command("clang",cargs...).Output()
 | 
						astPP, err := exec.Command("clang",cargs...).Output()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -192,12 +194,12 @@ func Start() (err error) {
 | 
				
			||||||
	w.Package = Config.Package
 | 
						w.Package = Config.Package
 | 
				
			||||||
	w.Frameworks(Config.Frameworks)
 | 
						w.Frameworks(Config.Frameworks)
 | 
				
			||||||
	w.Import(Config.Imports)
 | 
						w.Import(Config.Imports)
 | 
				
			||||||
	w.SysImport(Config.SysImports)
 | 
						w.SysImport(Config.Sysimports)
 | 
				
			||||||
	w.Pragma(Config.Pragma)
 | 
						w.Pragma(Config.Pragma)
 | 
				
			||||||
	if Config.VaArgs == 0 {
 | 
						if Config.Vaargs == 0 {
 | 
				
			||||||
		Config.VaArgs = 16
 | 
							Config.Vaargs = 16
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	w.VaArgs = Config.VaArgs
 | 
						w.Vaargs = Config.Vaargs
 | 
				
			||||||
	for _, u := range tree {
 | 
						for _, u := range tree {
 | 
				
			||||||
		fmt.Printf("--processing translation unit\n")
 | 
							fmt.Printf("--processing translation unit\n")
 | 
				
			||||||
		for _, n := range(u.Children()) {
 | 
							for _, n := range(u.Children()) {
 | 
				
			||||||
| 
						 | 
					@ -212,6 +214,15 @@ func Start() (err error) {
 | 
				
			||||||
				if matches(x.Name,Config.Functions) {
 | 
									if matches(x.Name,Config.Functions) {
 | 
				
			||||||
					w.AddFunction(x)
 | 
										w.AddFunction(x)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								case *ast.ObjCProtocolDecl:
 | 
				
			||||||
 | 
									DELEGATES:
 | 
				
			||||||
 | 
									for _,ps := range Config.Delegates {
 | 
				
			||||||
 | 
										_ = ps
 | 
				
			||||||
 | 
										//if matches(x.Name,ps) {
 | 
				
			||||||
 | 
										//	w.AddProtocol(x)
 | 
				
			||||||
 | 
											break DELEGATES
 | 
				
			||||||
 | 
										//}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			case *ast.EnumDecl:
 | 
								case *ast.EnumDecl:
 | 
				
			||||||
				w.AddEnum(x,Config.Enums)
 | 
									w.AddEnum(x,Config.Enums)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -222,8 +233,13 @@ func Start() (err error) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	if _, err := toml.DecodeFile("nswrap.toml",&Config); err != nil {
 | 
						confbytes, err := ioutil.ReadFile("nswrap.yaml")
 | 
				
			||||||
		fmt.Printf("Cannot open config file nswrap.toml.\n")
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Printf("Cannot open config file nswrap.yaml. %s\n",err)
 | 
				
			||||||
 | 
							os.Exit(-1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err = yaml.Unmarshal(confbytes,&Config); err != nil {
 | 
				
			||||||
 | 
							fmt.Printf("Cannot decode config file nswrap.yaml. %s\n",err)
 | 
				
			||||||
		os.Exit(-1)
 | 
							os.Exit(-1)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := Start(); err != nil {
 | 
						if err := Start(); err != nil {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,45 +0,0 @@
 | 
				
			||||||
InputFiles = [
 | 
					 | 
				
			||||||
    "/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h",
 | 
					 | 
				
			||||||
    "/System/Library/Frameworks/AppKit.framework/Headers/AppKit.h",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Classes = [
 | 
					 | 
				
			||||||
	"NSArray",
 | 
					 | 
				
			||||||
	"NSMutableArray",
 | 
					 | 
				
			||||||
	"NSDictionary",
 | 
					 | 
				
			||||||
	"NSEnumerator",
 | 
					 | 
				
			||||||
	"NSSet",
 | 
					 | 
				
			||||||
	"NSDate",
 | 
					 | 
				
			||||||
	"NSTimeZone",
 | 
					 | 
				
			||||||
	"NSCalendar",
 | 
					 | 
				
			||||||
	"NSLocale",
 | 
					 | 
				
			||||||
	"NSCharacterSet",
 | 
					 | 
				
			||||||
	"NSString",
 | 
					 | 
				
			||||||
	"NSScanner",
 | 
					 | 
				
			||||||
	"NSFileManager",
 | 
					 | 
				
			||||||
	"NSApplication",
 | 
					 | 
				
			||||||
	"NSBundle",
 | 
					 | 
				
			||||||
	"NSApp",
 | 
					 | 
				
			||||||
	"NSMenu",
 | 
					 | 
				
			||||||
	"NSMenuItem",
 | 
					 | 
				
			||||||
	"NSWindow",
 | 
					 | 
				
			||||||
	"NSView",
 | 
					 | 
				
			||||||
	"NSScreen",
 | 
					 | 
				
			||||||
	"NSButton",
 | 
					 | 
				
			||||||
	"NSEvent",
 | 
					 | 
				
			||||||
	"NSResponder",
 | 
					 | 
				
			||||||
	"NSRunLoop",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Functions = [
 | 
					 | 
				
			||||||
	"NSMake.*",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Enums = [
 | 
					 | 
				
			||||||
	"CF.*",
 | 
					 | 
				
			||||||
	"NSApplication.*",
 | 
					 | 
				
			||||||
	"NSBackingStore.*",
 | 
					 | 
				
			||||||
	"NSWindowStyleMask.*",
 | 
					 | 
				
			||||||
	"NSWindowButton",
 | 
					 | 
				
			||||||
	"NSWindowOrderingMode",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Frameworks = [ "Foundation", "AppKit", "CoreGraphics" ]
 | 
					 | 
				
			||||||
Pragma = [ 'clang diagnostic ignored "-Wformat-security"' ]
 | 
					 | 
				
			||||||
VaArgs = 32
 | 
					 | 
				
			||||||
							
								
								
									
										49
									
								
								examples/app/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								examples/app/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,49 @@
 | 
				
			||||||
 | 
					inputfiles:
 | 
				
			||||||
 | 
					    - /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
 | 
				
			||||||
 | 
					    - /System/Library/Frameworks/AppKit.framework/Headers/AppKit.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					classes:
 | 
				
			||||||
 | 
					    - NSArray"
 | 
				
			||||||
 | 
					    - NSMutableArray
 | 
				
			||||||
 | 
					    - NSDictionary
 | 
				
			||||||
 | 
					    - NSEnumerator
 | 
				
			||||||
 | 
					    - NSSet
 | 
				
			||||||
 | 
					    - NSDate
 | 
				
			||||||
 | 
					    - NSTimeZone
 | 
				
			||||||
 | 
					    - NSCalendar
 | 
				
			||||||
 | 
					    - NSLocale
 | 
				
			||||||
 | 
					    - NSCharacterSet
 | 
				
			||||||
 | 
					    - NSString
 | 
				
			||||||
 | 
					    - NSScanner
 | 
				
			||||||
 | 
					    - NSFileManager
 | 
				
			||||||
 | 
					    - NSApplication
 | 
				
			||||||
 | 
					    - NSBundle
 | 
				
			||||||
 | 
					    - NSApp
 | 
				
			||||||
 | 
					    - NSMenu
 | 
				
			||||||
 | 
					    - NSMenuItem
 | 
				
			||||||
 | 
					    - NSWindow
 | 
				
			||||||
 | 
					    - NSView
 | 
				
			||||||
 | 
					    - NSScreen
 | 
				
			||||||
 | 
					    - NSButton
 | 
				
			||||||
 | 
					    - NSEvent
 | 
				
			||||||
 | 
					    - NSResponder
 | 
				
			||||||
 | 
					    - NSRunLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					functions: [NSMake.*]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enums:
 | 
				
			||||||
 | 
					    - CF.*
 | 
				
			||||||
 | 
					    - NSApplication.*
 | 
				
			||||||
 | 
					    - NSBackingStore.*
 | 
				
			||||||
 | 
					    - NSWindowStyleMask.*
 | 
				
			||||||
 | 
					    - NSWindowButton
 | 
				
			||||||
 | 
					    - NSWindowOrderingMode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					delegates:
 | 
				
			||||||
 | 
					    AppDelegate: [NSApplicationDelegate]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					frameworks: [ Foundation, AppKit, CoreGraphics ]
 | 
				
			||||||
 | 
					pragma: [ clang diagnostic ignored "-Wformat-security" ]
 | 
				
			||||||
 | 
					vaargs: 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,44 +0,0 @@
 | 
				
			||||||
Package = "ble"
 | 
					 | 
				
			||||||
InputFiles = [
 | 
					 | 
				
			||||||
    "/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h",
 | 
					 | 
				
			||||||
    "/System/Library/Frameworks/CoreBluetooth.framework/Headers/CoreBluetooth.h",
 | 
					 | 
				
			||||||
    "ble/ble_delegate.h",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Classes = [
 | 
					 | 
				
			||||||
	"ble_delegate",
 | 
					 | 
				
			||||||
	"CBCentralManager",
 | 
					 | 
				
			||||||
	"CBPeripheralManager",
 | 
					 | 
				
			||||||
	"CBPeripheral",
 | 
					 | 
				
			||||||
	"CBCentral",
 | 
					 | 
				
			||||||
	"CBService",
 | 
					 | 
				
			||||||
	"CBCharacteristic",
 | 
					 | 
				
			||||||
	"CBDescriptor",
 | 
					 | 
				
			||||||
	"CBError",
 | 
					 | 
				
			||||||
	"CBUUID",
 | 
					 | 
				
			||||||
	"CBAdvertisementData",
 | 
					 | 
				
			||||||
	"CBATTRequest",
 | 
					 | 
				
			||||||
	"NSArray",
 | 
					 | 
				
			||||||
	"NSMutableArray",
 | 
					 | 
				
			||||||
	"NSDictionary",
 | 
					 | 
				
			||||||
	"NSEnumerator",
 | 
					 | 
				
			||||||
	"NSSet",
 | 
					 | 
				
			||||||
	"NSDate",
 | 
					 | 
				
			||||||
	"NSTimeZone",
 | 
					 | 
				
			||||||
	"NSString",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Functions = [
 | 
					 | 
				
			||||||
	"NSMakeRange",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Enums = [
 | 
					 | 
				
			||||||
	"CB.*",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Frameworks = [
 | 
					 | 
				
			||||||
	"Foundation",
 | 
					 | 
				
			||||||
	"CoreBluetooth",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Imports = [
 | 
					 | 
				
			||||||
	"ble_delegate.h",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Pragma = [ 'clang diagnostic ignored "-Wformat-security"' ]
 | 
					 | 
				
			||||||
VaArgs = 32
 | 
					 | 
				
			||||||
							
								
								
									
										35
									
								
								examples/bluetooth/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								examples/bluetooth/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					package: ble
 | 
				
			||||||
 | 
					inputfiles:
 | 
				
			||||||
 | 
					    - /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
 | 
				
			||||||
 | 
					    - /System/Library/Frameworks/CoreBluetooth.framework/Headers/CoreBluetooth.h
 | 
				
			||||||
 | 
					    - ble/ble_delegate.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					classes:
 | 
				
			||||||
 | 
					    - ble_delegate
 | 
				
			||||||
 | 
					    - CBCentralManager
 | 
				
			||||||
 | 
					    - CBPeripheralManager
 | 
				
			||||||
 | 
					    - CBPeripheral
 | 
				
			||||||
 | 
					    - CBCentral
 | 
				
			||||||
 | 
					    - CBService
 | 
				
			||||||
 | 
					    - CBCharacteristic
 | 
				
			||||||
 | 
					    - CBDescriptor
 | 
				
			||||||
 | 
					    - CBError
 | 
				
			||||||
 | 
					    - CBUUID
 | 
				
			||||||
 | 
					    - CBAdvertisementData
 | 
				
			||||||
 | 
					    - CBATTRequest
 | 
				
			||||||
 | 
					    - NSArray
 | 
				
			||||||
 | 
					    - NSMutableArray
 | 
				
			||||||
 | 
					    - NSDictionary
 | 
				
			||||||
 | 
					    - NSEnumerator
 | 
				
			||||||
 | 
					    - NSSet
 | 
				
			||||||
 | 
					    - NSDate
 | 
				
			||||||
 | 
					    - NSTimeZone
 | 
				
			||||||
 | 
					    - NSString
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					functions: [ NSMakeRange ]
 | 
				
			||||||
 | 
					enums: [ CB.* ]
 | 
				
			||||||
 | 
					frameworks: [ Foundation, CoreBluetooth ]
 | 
				
			||||||
 | 
					imports: [ ble_delegate.h ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pragma: [ clang diagnostic ignored "-Wformat-security" ]
 | 
				
			||||||
 | 
					vaargs: 32
 | 
				
			||||||
| 
						 | 
					@ -1,28 +0,0 @@
 | 
				
			||||||
InputFiles = [
 | 
					 | 
				
			||||||
    "/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Classes = [
 | 
					 | 
				
			||||||
	"NSArray",
 | 
					 | 
				
			||||||
	"NSMutableArray",
 | 
					 | 
				
			||||||
	"NSDictionary",
 | 
					 | 
				
			||||||
	"NSEnumerator",
 | 
					 | 
				
			||||||
	"NSSet",
 | 
					 | 
				
			||||||
	"NSDate",
 | 
					 | 
				
			||||||
	"NSTimeZone",
 | 
					 | 
				
			||||||
	"NSCalendar",
 | 
					 | 
				
			||||||
	"NSLocale",
 | 
					 | 
				
			||||||
	"NSCharacterSet",
 | 
					 | 
				
			||||||
	"NSString",
 | 
					 | 
				
			||||||
	"NSScanner",
 | 
					 | 
				
			||||||
	"NSFileManager",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Functions = [
 | 
					 | 
				
			||||||
	"NSMakeRange",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Enums = [
 | 
					 | 
				
			||||||
	"P_ALL",
 | 
					 | 
				
			||||||
	"CF.*",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
Frameworks = [ "Foundation" ]
 | 
					 | 
				
			||||||
Pragma = [ 'clang diagnostic ignored "-Wformat-security"' ]
 | 
					 | 
				
			||||||
VaArgs = 32
 | 
					 | 
				
			||||||
							
								
								
									
										21
									
								
								examples/foundation/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								examples/foundation/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					inputfiles:
 | 
				
			||||||
 | 
					    - /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
 | 
				
			||||||
 | 
					classes:
 | 
				
			||||||
 | 
					    - NSArray
 | 
				
			||||||
 | 
					    - NSMutableArray
 | 
				
			||||||
 | 
					    - NSDictionary
 | 
				
			||||||
 | 
					    - NSEnumerator
 | 
				
			||||||
 | 
					    - NSSet
 | 
				
			||||||
 | 
					    - NSDate
 | 
				
			||||||
 | 
					    - NSTimeZone
 | 
				
			||||||
 | 
					    - NSCalendar
 | 
				
			||||||
 | 
					    - NSLocale
 | 
				
			||||||
 | 
					    - NSCharacterSet
 | 
				
			||||||
 | 
					    - NSString
 | 
				
			||||||
 | 
					    - NSScanner
 | 
				
			||||||
 | 
					    - NSFileManager
 | 
				
			||||||
 | 
					functions: [ NSMakeRange ]
 | 
				
			||||||
 | 
					enums: [ P_ALL, CF.* ]
 | 
				
			||||||
 | 
					frameworks: [ Foundation ]
 | 
				
			||||||
 | 
					pragma: [ clang diagnostic ignored "-Wformat-security" ]
 | 
				
			||||||
 | 
					vaargs: 32
 | 
				
			||||||
| 
						 | 
					@ -1,5 +0,0 @@
 | 
				
			||||||
Package = "ClassOne"
 | 
					 | 
				
			||||||
InputFiles = [ "ClassOne/simple.h" ]
 | 
					 | 
				
			||||||
Classes = [ "ClassOne","ClassTwo" ]
 | 
					 | 
				
			||||||
Imports = [ "simple.h" ]
 | 
					 | 
				
			||||||
Frameworks = [ "Foundation" ]
 | 
					 | 
				
			||||||
							
								
								
									
										7
									
								
								examples/simple/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								examples/simple/nswrap.yaml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					package: ClassOne
 | 
				
			||||||
 | 
					inputfiles: [ ClassOne/simple.h ]
 | 
				
			||||||
 | 
					classes:
 | 
				
			||||||
 | 
					    - ClassOne
 | 
				
			||||||
 | 
					    - ClassTwo
 | 
				
			||||||
 | 
					imports: [ simple.h ]
 | 
				
			||||||
 | 
					frameworks: [ Foundation ]
 | 
				
			||||||
							
								
								
									
										105
									
								
								wrap/main.go
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								wrap/main.go
									
									
									
									
									
								
							| 
						 | 
					@ -22,15 +22,17 @@ type Wrapper struct {
 | 
				
			||||||
	Functions map[string]*Method
 | 
						Functions map[string]*Method
 | 
				
			||||||
	NamedEnums map[string]*Enum
 | 
						NamedEnums map[string]*Enum
 | 
				
			||||||
	AnonEnums []*Enum
 | 
						AnonEnums []*Enum
 | 
				
			||||||
 | 
						Protocols []*Protocol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cgoFlags strings.Builder  // put cGo directives here
 | 
						cgoFlags strings.Builder  // put cGo directives here
 | 
				
			||||||
	cCode strings.Builder	  // put cGo code here
 | 
						cCode strings.Builder	  // put cGo code here
 | 
				
			||||||
	goTypes strings.Builder   // put Go type declarations here
 | 
						goTypes strings.Builder   // put Go type declarations here
 | 
				
			||||||
	goConst strings.Builder   // put Go constants (from C enums) here
 | 
						goConst strings.Builder   // put Go constants (from C enums) here
 | 
				
			||||||
	goCode strings.Builder    // put Go code here
 | 
						goCode strings.Builder    // put Go code here
 | 
				
			||||||
 | 
						goExports strings.Builder // put exported Go functions here
 | 
				
			||||||
	goHelpers strings.Builder // put Go helper functions here
 | 
						goHelpers strings.Builder // put Go helper functions here
 | 
				
			||||||
	Processed map[string]bool
 | 
						Processed map[string]bool
 | 
				
			||||||
	VaArgs int
 | 
						Vaargs int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewWrapper(debug bool) *Wrapper {
 | 
					func NewWrapper(debug bool) *Wrapper {
 | 
				
			||||||
| 
						 | 
					@ -41,8 +43,9 @@ func NewWrapper(debug bool) *Wrapper {
 | 
				
			||||||
		Functions: map[string]*Method{},
 | 
							Functions: map[string]*Method{},
 | 
				
			||||||
		NamedEnums: map[string]*Enum{},
 | 
							NamedEnums: map[string]*Enum{},
 | 
				
			||||||
		AnonEnums: []*Enum{},
 | 
							AnonEnums: []*Enum{},
 | 
				
			||||||
 | 
							Protocols: []*Protocol{},
 | 
				
			||||||
		Processed: map[string]bool{},
 | 
							Processed: map[string]bool{},
 | 
				
			||||||
		VaArgs: 16,
 | 
							Vaargs: 16,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ret.cgoFlags.WriteString(fmt.Sprintf(`/*
 | 
						ret.cgoFlags.WriteString(fmt.Sprintf(`/*
 | 
				
			||||||
#cgo CFLAGS: -x objective-c
 | 
					#cgo CFLAGS: -x objective-c
 | 
				
			||||||
| 
						 | 
					@ -105,6 +108,12 @@ type Enum struct {
 | 
				
			||||||
	Constants []string
 | 
						Constants []string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Protocol struct {
 | 
				
			||||||
 | 
						Name, GoName string
 | 
				
			||||||
 | 
						Methods []*Method
 | 
				
			||||||
 | 
						Polymorphic map[string]bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//isVoid() returns true if the method has no return value.
 | 
					//isVoid() returns true if the method has no return value.
 | 
				
			||||||
func (m Method) isVoid() bool {
 | 
					func (m Method) isVoid() bool {
 | 
				
			||||||
	return m.Type.CType() == "void"
 | 
						return m.Type.CType() == "void"
 | 
				
			||||||
| 
						 | 
					@ -152,7 +161,7 @@ func (w Wrapper) objcparamlist(m *Method) string {
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			if p.Type.Variadic {
 | 
								if p.Type.Variadic {
 | 
				
			||||||
				str := []string{m.Name + ":arr[0]"}
 | 
									str := []string{m.Name + ":arr[0]"}
 | 
				
			||||||
				for i := 1; i < w.VaArgs; i++ {
 | 
									for i := 1; i < w.Vaargs; i++ {
 | 
				
			||||||
					str = append(str,"arr["+strconv.Itoa(i)+"]")
 | 
										str = append(str,"arr["+strconv.Itoa(i)+"]")
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				str = append(str,"nil")
 | 
									str = append(str,"nil")
 | 
				
			||||||
| 
						 | 
					@ -268,6 +277,40 @@ func (w *Wrapper) AddFunction(n *ast.FunctionDecl) {
 | 
				
			||||||
	w.Functions[n.Name] = m
 | 
						w.Functions[n.Name] = m
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w *Wrapper) AddProtocol(n *ast.ObjCProtocolDecl) {
 | 
				
			||||||
 | 
						p := &Protocol{
 | 
				
			||||||
 | 
							Name: n.Name,
 | 
				
			||||||
 | 
							GoName: types.NewTypeFromString(n.Name,n.Name).GoType(),
 | 
				
			||||||
 | 
							Methods: []*Method{},
 | 
				
			||||||
 | 
							Polymorphic: map[string]bool{},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						seen := make(map[string]bool)
 | 
				
			||||||
 | 
						fmt.Printf("Adding protocol %s\n",n.Name)
 | 
				
			||||||
 | 
						for _,c := range n.Children() {
 | 
				
			||||||
 | 
							switch x := c.(type) {
 | 
				
			||||||
 | 
							case *ast.ObjCMethodDecl:
 | 
				
			||||||
 | 
								m := &Method{
 | 
				
			||||||
 | 
									Name: x.Name,
 | 
				
			||||||
 | 
									Type: types.NewTypeFromString(x.Type,p.Name),
 | 
				
			||||||
 | 
									Class: p.Name,
 | 
				
			||||||
 | 
									GoClass: p.GoName,
 | 
				
			||||||
 | 
									ClassMethod: x.ClassMethod,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var avail bool
 | 
				
			||||||
 | 
								m.Parameters, avail = w.GetParms(x,p.Name)
 | 
				
			||||||
 | 
								if avail {
 | 
				
			||||||
 | 
									fmt.Printf("  method %s\n",m.Name)
 | 
				
			||||||
 | 
									p.Methods = append(p.Methods,m)
 | 
				
			||||||
 | 
									if seen[m.Name] {
 | 
				
			||||||
 | 
										p.Polymorphic[m.Name] = true
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									seen[m.Name] = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						w.Protocols = append(w.Protocols,p)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//FIXME: copied from nswrap/main.go, should put this in a utils package
 | 
					//FIXME: copied from nswrap/main.go, should put this in a utils package
 | 
				
			||||||
func matches(x string, rs []string) bool {
 | 
					func matches(x string, rs []string) bool {
 | 
				
			||||||
	for _,r := range rs {
 | 
						for _,r := range rs {
 | 
				
			||||||
| 
						 | 
					@ -680,7 +723,7 @@ func %s%s(%s) %s {
 | 
				
			||||||
	for i,o := range %ss {
 | 
						for i,o := range %ss {
 | 
				
			||||||
		%s[i] = o.Ptr()
 | 
							%s[i] = o.Ptr()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
`,vn,w.VaArgs,vn,vn))
 | 
					`,vn,w.Vaargs,vn,vn))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	w.goCode.WriteString(`	` +
 | 
						w.goCode.WriteString(`	` +
 | 
				
			||||||
		types.GoToC(cname,ns,m.Type,tps) + "\n}\n")
 | 
							types.GoToC(cname,ns,m.Type,tps) + "\n}\n")
 | 
				
			||||||
| 
						 | 
					@ -781,6 +824,57 @@ const %s %s= C.%s
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//FIXME: need to disambiguate polymorphic method names. Something like:
 | 
				
			||||||
 | 
					//func Disambiguate([]*Method) []*Method {} ...
 | 
				
			||||||
 | 
					//Can allow user to decide on a disambiguation strategy
 | 
				
			||||||
 | 
					func (w *Wrapper) ProcessProtocol(p *Protocol) {
 | 
				
			||||||
 | 
						fmt.Printf("Processing protocol (%s)\n",p.Name)
 | 
				
			||||||
 | 
						//To create (per protocol):
 | 
				
			||||||
 | 
						//1. ObjC protocol interface
 | 
				
			||||||
 | 
						//2. ObjC protocol implementation
 | 
				
			||||||
 | 
						//3. Go type
 | 
				
			||||||
 | 
						//4. Go constructor
 | 
				
			||||||
 | 
						//5. Go dispatch database for callbacks
 | 
				
			||||||
 | 
						//To create (per method):
 | 
				
			||||||
 | 
						//1. ObjC function prototypes for go exports
 | 
				
			||||||
 | 
						//2. ObjC constructor function
 | 
				
			||||||
 | 
						//3. Go exported callback function wrappers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var ccode, gocode, goexports strings.Builder
 | 
				
			||||||
 | 
						//1. ObjC protocol interface
 | 
				
			||||||
 | 
						ccode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					@interface %s : %s
 | 
				
			||||||
 | 
					`,p.Name,p.Name))
 | 
				
			||||||
 | 
						//2. ObjC protocol implementation
 | 
				
			||||||
 | 
						ccode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
						//3. Go type
 | 
				
			||||||
 | 
						gocode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
						//4. Go constructor
 | 
				
			||||||
 | 
						gocode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
						//5. Go dispatch database for callbacks
 | 
				
			||||||
 | 
						gocode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
						//6. Go callback registration function
 | 
				
			||||||
 | 
						gocode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
						//To create (per method):
 | 
				
			||||||
 | 
						for _,m := range p.Methods {
 | 
				
			||||||
 | 
							_ = m
 | 
				
			||||||
 | 
							//1. ObjC function prototypes for go exports
 | 
				
			||||||
 | 
							ccode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
							//2. ObjC constructor function
 | 
				
			||||||
 | 
							ccode.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
							//3. Go exported callback function wrappers
 | 
				
			||||||
 | 
							goexports.WriteString(fmt.Sprintf(`
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (w *Wrapper) Wrap(toproc []string) {
 | 
					func (w *Wrapper) Wrap(toproc []string) {
 | 
				
			||||||
	if w.Package == "" { w.Package = "ns" }
 | 
						if w.Package == "" { w.Package = "ns" }
 | 
				
			||||||
	err := os.MkdirAll(w.Package,0755)
 | 
						err := os.MkdirAll(w.Package,0755)
 | 
				
			||||||
| 
						 | 
					@ -851,6 +945,9 @@ void*
 | 
				
			||||||
	for _,e := range w.AnonEnums {
 | 
						for _,e := range w.AnonEnums {
 | 
				
			||||||
		w.ProcessEnum(e)
 | 
							w.ProcessEnum(e)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						for _,p := range w.Protocols {
 | 
				
			||||||
 | 
							w.ProcessProtocol(p)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	fmt.Printf("%d functions\n", len(w.Functions))
 | 
						fmt.Printf("%d functions\n", len(w.Functions))
 | 
				
			||||||
	fmt.Printf("%d enums\n", len(w.NamedEnums) + len(w.AnonEnums))
 | 
						fmt.Printf("%d enums\n", len(w.NamedEnums) + len(w.AnonEnums))
 | 
				
			||||||
	of.WriteString("package " + w.Package + "\n\n")
 | 
						of.WriteString("package " + w.Package + "\n\n")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user