Skip to content

Commit

Permalink
New symbols, plus fixes (#213)
Browse files Browse the repository at this point in the history
* generate: update symbol and symbol declaration parsing for new symbolsdb

* generate: use "Apple Documentation" for modules instead of "Full Documentation"

* * update symbolsdb
* use conventional generated file banner
* protocols live in files with _protocol in the filename
* dropped convenience alloc functions
* renamed type for protocol wrapper to end with Object instead of Wrapper
* ensure protocol wrappers implement the protocol interface
* constants with same name as their enum name get K prefix
* globbergen finds files by filename now

* macos: regenerated

* Makefile: update symbolsdb
  • Loading branch information
progrium authored Sep 8, 2023
1 parent 03834f4 commit 53ff09c
Show file tree
Hide file tree
Showing 2,911 changed files with 161,829 additions and 136,244 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ example:
.PHONY: example

generate/symbols.zip:
cd generate && wget https://github.com/mactypes/symbolsdb/releases/download/1.0/symbols.zip
cd generate && wget https://github.com/mactypes/symbolsdb/releases/download/1.1/symbols.zip
2 changes: 1 addition & 1 deletion generate/class.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (db *Generator) ToClassGen(sym Symbol) *codegen.Class {
DocURL: sym.DocURL(),
}

st, err := sym.Parse()
st, err := sym.Parse(db.Platform)
if err != nil {
panic(err)
}
Expand Down
2 changes: 1 addition & 1 deletion generate/codegen/codegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package codegen

import "github.com/progrium/macdriver/internal/set"

var AutoGeneratedMark = "// AUTO-GENERATED CODE, DO NOT MODIFY\n"
var AutoGeneratedMark = "// Code generated by DarwinKit. DO NOT EDIT.\n"

// CodeGen is interface for Class/Protocol code Gen
type CodeGen interface {
Expand Down
4 changes: 4 additions & 0 deletions generate/codegen/filewriter.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package codegen
import (
"os"
"path/filepath"
"strings"

"github.com/progrium/macdriver/generate/modules"
"github.com/progrium/macdriver/internal/set"
Expand Down Expand Up @@ -57,6 +58,9 @@ func (w *FileWriter) WriteCode() {
}

func (w *FileWriter) goFilePath() string {
if strings.Contains(w.Name, "Delegate") {
w.Name = strings.Replace(w.Name, "Protocol", "", -1)
}
name := stringx.CamelToSnake(modules.TrimPrefix(w.Name))
return w.PlatformDir + "/" + w.Module.Package + "/" + name + ".gen.go"
}
Expand Down
2 changes: 1 addition & 1 deletion generate/codegen/gen_class.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ func (c *Class) writeGoStruct(w *CodeWriter) {
w.UnIndent()
w.WriteLine("}")
}
if (im.InitMethod || im.ClassMethod) && im.Name != "new" && im.Name != "init" {
if (im.InitMethod || im.ClassMethod) && im.Name != "new" && im.Name != "init" && im.Name != "alloc" {
//add a convenient custom init method function
w.WriteLine("")
if m.DocURL != "" {
Expand Down
7 changes: 5 additions & 2 deletions generate/codegen/gen_method.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ type Method struct {
Variadic bool
Description string
DocURL string
Protocol bool

goFuncName string
identifier string
Expand Down Expand Up @@ -72,6 +73,7 @@ func (m *Method) NormalizeInstanceTypeMethod(returnType *typing.ClassType) *Meth
goFuncName: m.goFuncName,
Suffix: m.Suffix,
Variadic: m.Variadic,
Protocol: m.Protocol,
}
return nm
}
Expand Down Expand Up @@ -172,7 +174,7 @@ func (m *Method) WriteGoInterfaceCode(currentModule *modules.Module, classType *
func (m *Method) GoFuncDeclare(currentModule *modules.Module, goTypeName string) string {
var paramStrs []string
for _, p := range m.Params {
paramStrs = append(paramStrs, p.GoDeclare(currentModule, false))
paramStrs = append(paramStrs, p.GoDeclare(currentModule, m.Protocol))
}
if m.Variadic {
paramStrs = append(paramStrs, "args ...any")
Expand Down Expand Up @@ -216,7 +218,7 @@ func (m *Method) ProtocolGoFuncFieldType(currentModule *modules.Module) string {
paramStrs = append(paramStrs, "args ...any")
}

return "(" + strings.Join(paramStrs, ", ") + ")" + " " + m.ReturnType.GoName(currentModule, false)
return "(" + strings.Join(paramStrs, ", ") + ")" + " " + m.ReturnType.GoName(currentModule, true)
}

// ProtocolGoFuncName return go protocol func name
Expand Down Expand Up @@ -292,5 +294,6 @@ func (m *Method) ToProtocolParamAsObjectMethod() *Method {
Description: m.Description,
DocURL: m.DocURL,
Variadic: m.Variadic,
Protocol: m.Protocol,
}
}
8 changes: 7 additions & 1 deletion generate/codegen/gen_protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,10 @@ func (p *Protocol) writeDelegateStruct(w *CodeWriter) {

func (p *Protocol) writeProtocolWrapperStruct(w *CodeWriter) {
typeName := p.Type.GoWrapperName()
w.WriteLine(fmt.Sprintf("// A concrete type wrapper for the [%s] protocol.", p.Type.GoInterfaceName()))
w.WriteLine("// ensure impl type implements protocol interface")
w.WriteLine(fmt.Sprintf("var _ %s = (*%s)(nil)", p.Type.GoInterfaceName(), typeName))
w.WriteLine("")
w.WriteLine(fmt.Sprintf("// A concrete type for the [%s] protocol.", p.Type.GoInterfaceName()))
w.WriteLine("type " + typeName + " struct {")
w.Indent()
if len(p.Supers) == 0 {
Expand Down Expand Up @@ -276,5 +279,8 @@ func (p *Protocol) allMethods() []*Method {

allMethods = append(allMethods, (*Method)(pp.getter()))
}
for idx := range allMethods {
allMethods[idx].Protocol = true
}
return allMethods
}
19 changes: 17 additions & 2 deletions generate/codegen/modulewriter.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,9 @@ func (m *ModuleWriter) WriteEnumAliases() {
return
}
armVals := false
imports := set.New[string]()
for _, e := range enums {
imports.AddSet(e.Type.GoImports())
for _, v := range e.Values {
if v.Arm64Value != "" {
armVals = true
Expand Down Expand Up @@ -145,6 +147,16 @@ func (m *ModuleWriter) WriteEnumAliases() {
amd64cw.WriteLine(AutoGeneratedMark)
amd64cw.WriteLine("package " + m.Module.Package)

cw.WriteLine("import (")
cw.Indent()
imports.ForEach(func(value string) {
if value != "github.com/progrium/macdriver/macos/objc" {
cw.WriteLine("\"" + value + "\"")
}
})
cw.UnIndent()
cw.WriteLine(")")

for _, ei := range enums {
primitiveType := ei.Type.GoName(&m.Module, false)
if ei.Module.Name == m.Module.Name {
Expand Down Expand Up @@ -206,6 +218,9 @@ func (m *ModuleWriter) WriteEnumAliases() {
log.Println("enum ", v.Name, " requires a value")
continue
}
if v.GoName == ei.GoName(&m.Module, false) {
v.GoName = "K" + v.GoName
}
if v.Arm64Value != "" {
if !ei.IsString() {
amd64cw.WriteLine(fmt.Sprintf("\t%s %s = %s", v.GoName, ei.GoName(&m.Module, false), v.Value))
Expand Down Expand Up @@ -245,8 +260,8 @@ func (m *ModuleWriter) WriteDocFile() {
cw.WriteLine(AutoGeneratedMark)
cw.WriteLineF("// %s", m.Description)
cw.WriteLine("//")
cw.WriteLine("// [Full Documentation]")
cw.WriteLineF("//\n// [Full Documentation]: %s", m.DocURL)
cw.WriteLine("// [Apple Documentation]")
cw.WriteLineF("//\n// [Apple Documentation]: %s", m.DocURL)
cw.WriteLineF("package %s", m.Module.Package)
}
}
Expand Down
4 changes: 2 additions & 2 deletions generate/enums.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func (db *Generator) ToEnumInfo(fw string, sym Symbol) *codegen.AliasInfo {
}
var enumValues []*codegen.EnumValue
for _, ev := range db.EnumValues(fw) {
st, _ := ev.Parse()
st, _ := ev.Parse(db.Platform)
if st.Variable.Type.Name != sym.Name && ev.Parent != sym.Name {
continue
}
Expand Down Expand Up @@ -129,7 +129,7 @@ func (db *Generator) AllowedEnumAlias(s Symbol) bool {
"UInt32",
"UInt64",
}
st, err := s.Parse()
st, err := s.Parse(db.Platform)
if err != nil {
return false
}
Expand Down
6 changes: 3 additions & 3 deletions generate/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func (db *Generator) Generate(platform string, version int, rootDir string, fram
}
protocolGen.Init()
fw := &codegen.FileWriter{
Name: s.Name,
Name: s.Name + "Protocol",
Module: *protocolGen.Type.Module,
PlatformDir: rootDir,
}
Expand All @@ -114,7 +114,7 @@ func (db *Generator) Generate(platform string, version int, rootDir string, fram
mw.EnumAliases = append(mw.EnumAliases, db.ToEnumInfo(framework, s))
continue
}
st, err := s.Parse()
st, err := s.Parse(db.Platform)
if err != nil || st.TypeAlias == nil {
log.Printf("skipping '%s', bad decl: %s", s.Name, s.Declaration)
continue
Expand Down Expand Up @@ -147,7 +147,7 @@ func (db *Generator) ResolveTypeAlias(typeName string) (declparse.TypeInfo, bool
if s == nil {
return declparse.TypeInfo{}, false
}
st, err := s.Parse()
st, err := s.Parse(db.Platform)
if err != nil || st.TypeAlias == nil {
return declparse.TypeInfo{}, false
}
Expand Down
10 changes: 9 additions & 1 deletion generate/members.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/progrium/macdriver/generate/codegen"
"github.com/progrium/macdriver/generate/declparse"
"github.com/progrium/macdriver/generate/modules"
"github.com/progrium/macdriver/generate/typing"
)

func (db *Generator) shouldSkipType(ti declparse.TypeInfo) bool {
Expand Down Expand Up @@ -64,6 +65,7 @@ func (db *Generator) shouldSkipType(ti declparse.TypeInfo) bool {
"CLBeaconIdentityConstraint",
"mach_port_t",
"cpu_type_t",
"ptrdiff_t",
} {
if ti.Name == n {
return true
Expand Down Expand Up @@ -93,7 +95,7 @@ func (db *Generator) Members(fw string, sym Symbol, covariantTypes []string) (pr
s.Declaration = strings.ReplaceAll(s.Declaration, fmt.Sprintf("<%s>", ct), "<NSObject>")
}

st, err := s.Parse()
st, err := s.Parse(db.Platform)
if err != nil {
log.Println("Members:", sym.Name, "::", s.Declaration)
panic(err)
Expand Down Expand Up @@ -181,6 +183,12 @@ func (db *Generator) Members(fw string, sym Symbol, covariantTypes []string) (pr
if ptyp == nil {
log.Fatalf("Method param type failure: owner=%s arg=%s type=%s methoddecl=%s", sym.Name, arg.Name, arg.Type.Name, s.Declaration)
}
if ptrtyp, ok := ptyp.(*typing.PointerType); ok {
if ptrtyp.Type == nil {
log.Println("using NSObject in place of missing type:", arg.Type.Name)
ptyp = typing.Object
}
}
param := &codegen.Param{
Name: arg.Name,
Type: ptyp,
Expand Down
2 changes: 1 addition & 1 deletion generate/modules/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ var All = []Module{
{"UIKit", "UIKit", "uikit", "UIKit/UIKit.h", []string{"NS"}},
{"UniformTypeIdentifiers", "Uniform Type Identifiers", "uti", "UniformTypeIdentifiers/UniformTypeIdentifiers.h", []string{"UT"}},
{"WebKit", "WebKit", "webkit", "WebKit/WebKit.h", []string{"WK"}},
{"MediaPlayer", "Media Player", "mediaplayer", "MediaPlayer/MediaPlayer.h", []string{"MP"}},
{"FileProvider", "File Provider", "fileprovider", "FileProvider/FileProvider.h", []string{"NS"}},
{"Quartz", "Quartz", "quartz", "Quartz/Quartz.h", []string{"IK", "kQC", "kQuartz", "QC", "IK_"}},
{"SecurityInterface", "Security Interface", "securityinterface", "SecurityInterface/SecurityInterface.h", []string{"SF"}},
Expand Down Expand Up @@ -158,4 +157,5 @@ var All = []Module{
{"MetalPerformanceShadersGraph", "Metal Performance Shaders Graph", "mpsgraph", "MetalPerformanceShadersGraph/MetalPerformanceShadersGraph.h", []string{"MPSGraph"}},
{"MetalPerformanceShaders", "Metal Performance Shaders", "mps", "MetalPerformanceShaders/MetalPerformanceShaders.h", []string{"MPS"}},
{"SystemConfiguration", "System Configuration", "sysconfig", "SystemConfiguration/SystemConfiguration.h", []string{"SC", "kSC"}},
{"MediaPlayer", "Media Player", "mediaplayer", "MediaPlayer/MediaPlayer.h", []string{"MP"}},
}
6 changes: 3 additions & 3 deletions generate/protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ func (db *Generator) ToProtocolGen(fw string, sym Symbol) *codegen.Protocol {
if db.genCache == nil {
db.genCache = make(map[string]codegen.CodeGen)
}
key := fmt.Sprintf("%s.%s", fw, sym.Name)
key := fmt.Sprintf("%s.P%s", fw, sym.Name)
cg, ok := db.genCache[key]
if ok {
if pcg, ok := cg.Copy().(*codegen.Protocol); ok {
Expand All @@ -34,8 +34,8 @@ func (db *Generator) ToProtocolGen(fw string, sym Symbol) *codegen.Protocol {
Type: type_,
}

// symbolsdb doesnt have protocol superclasses yet,
// so these are known ones for appkit for now
// symbolsdb should have protocol superclasses now via inheritsFrom,
// but these are known ones for appkit for now
knownSupers := map[string]string{
"NSComboBoxDelegate": "NSTextFieldDelegate",
"NSMatrixDelegate": "NSControlTextEditingDelegate",
Expand Down
36 changes: 25 additions & 11 deletions generate/symbols.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,27 @@ var blacklist = []string{
"WebView", // gets picked up instead of WKWebView
}

var pathBlacklist = []string{
"foundation/nshashtable/legacy_hash_table_implementation/nshashtable", // found instead of NSHashTable class
"foundation/nsmaptable/legacy_map_table_implementation/nsmaptable", // same
}

type Symbol struct {
Name string
Path string
Kind string

Description string
Type string
Parent string
Modules []string
Platforms []Platform
Declaration string
Parameters []Parameter
Return string
Deprecated bool
Description string
Type string
Parent string
Modules []string
Platforms []Platform
Declaration string
Declarations map[string]string
Parameters []Parameter
Return string
Deprecated bool
InheritedFrom string
}

type Platform struct {
Expand Down Expand Up @@ -125,8 +132,12 @@ func (s Symbol) HasPlatform(name string, version int, deprecated bool) bool {
return false
}

func (s Symbol) Parse() (*declparse.Statement, error) {
p := declparse.NewStringParser(s.Declaration)
func (s Symbol) Parse(platform string) (*declparse.Statement, error) {
decl := s.Declaration
if decl == "" && len(s.Declarations) > 0 {
decl = s.Declarations[platform]
}
p := declparse.NewStringParser(decl)
switch s.Kind {
case "Constant", "Property":
p.Hint = declparse.HintVariable
Expand Down Expand Up @@ -177,6 +188,9 @@ func (db *SymbolCache) loadFrom(file *zip.File) (v Symbol, err error) {
if strIn(blacklist, v.Name) {
return v, fmt.Errorf("blacklisted symbol: %s", v.Name)
}
if strIn(pathBlacklist, v.Path) {
return v, fmt.Errorf("blacklisted path: %s", v.Path)
}
if v.Kind != "Property" && v.Kind != "Method" && v.Kind != "Framework" {
db.cache[v.Name] = v
}
Expand Down
Loading

0 comments on commit 53ff09c

Please sign in to comment.