Skip to content

Commit

Permalink
Supoort default arguments for structs' inits and functions
Browse files Browse the repository at this point in the history
  • Loading branch information
PGZXB committed Aug 3, 2024
1 parent 84d1842 commit e321fa5
Show file tree
Hide file tree
Showing 5 changed files with 212 additions and 117 deletions.
68 changes: 58 additions & 10 deletions generator/src/gen_structs.cj
Original file line number Diff line number Diff line change
Expand Up @@ -419,8 +419,13 @@ func genStructAccessorFuncsCode(filename: String, pkgName: String, structDefs: A
throw IllegalStateException("illegal state")
}

func genStructWCAPIMethod<T>(os: StringWriter<T>, structName: String, md: FuncSignature,
typeAlias: HashMap<String, CjType>, apiInfo: APIInfo) where T <: OutputStream {
func genStructWCAPIMethod<T>(
os: StringWriter<T>,
structName: String,
md: FuncSignature,
typeAlias: HashMap<String, CjType>,
apiInfo: APIInfo
) where T <: OutputStream {
let params = ArrayList<FuncParameter>.fromIterator(
md.params |> filter {
item => !(item.name == "..." && item.ty == "...")
Expand Down Expand Up @@ -478,9 +483,25 @@ func genStructWCAPIMethod<T>(os: StringWriter<T>, structName: String, md: FuncSi
cimguiFunctionDecl: md.cimguiFuncDecl
))
)
if (!md.defaultaArgs.isEmpty()) {
let defaultArgs = ArrayList<String>()
for (p in params) {
if (let Some(arg) <- md.defaultaArgs.get(p.name)) {
defaultArgs.append(transLiteralFromCToWCAPI(arg, p.ty, typeAlias))
}
}
os.write(" @DefaultArgs[")
for ((i, arg) in withIndex(defaultArgs)) {
os.write(arg)
if (i != defaultArgs.size - 1) {
os.write(", ")
}
}
os.writeln("]")
}
os.writeln(" ${fnSb.toString()} {")
if (md.isConstructor) {
os.write(" super(")
os.write(" _init(")
} else {
os.write(" return ")
}
Expand All @@ -500,9 +521,17 @@ func genStructWCAPIMethod<T>(os: StringWriter<T>, structName: String, md: FuncSi
}
}

func genStructsWCAPICode<T>(os: StringWriter<T>, pkgName: String, capiPkgName: String, structDefs: ArrayList<StructDef>,
funcs: ArrayList<FuncSignature>, typeAlias: HashMap<String, CjType>, globalConstants: ?HashMap<String, String>,
apiInfo: APIInfo) where T <: OutputStream {
func genStructsWCAPICode<T>(
os: StringWriter<T>,
pkgName: String,
capiPkgName: String,
macrosPkgName: String,
structDefs: ArrayList<StructDef>,
funcs: ArrayList<FuncSignature>,
typeAlias: HashMap<String, CjType>,
globalConstants: ?HashMap<String, String>,
apiInfo: APIInfo
) where T <: OutputStream {
// SOME COMMENTS ....
//
// package xxx
Expand Down Expand Up @@ -573,6 +602,7 @@ func genStructsWCAPICode<T>(os: StringWriter<T>, pkgName: String, capiPkgName: S
os.writeln("package ${pkgName}")
os.writeln()
os.writeln("import ${capiPkgName}")
os.writeln("import ${macrosPkgName}.*")
for (def in structDefs) {
os.writeln()
os.writeln("public class ${def.name} <: StructWrapper<${getPkgName(capiPkgName)}.${def.name}> {")
Expand Down Expand Up @@ -666,12 +696,30 @@ func genStructsWCAPICode<T>(os: StringWriter<T>, pkgName: String, capiPkgName: S
}
}

func genStructsWCAPICode(filename: String, pkgName: String, capiPkgName: String, structDefs: ArrayList<StructDef>,
funcs: ArrayList<FuncSignature>, typeAlias: HashMap<String, CjType>, globalConstants: ?HashMap<String, String>,
apiInfo: APIInfo) {
func genStructsWCAPICode(
filename: String,
pkgName: String,
capiPkgName: String,
macrosPkgName: String,
structDefs: ArrayList<StructDef>,
funcs: ArrayList<FuncSignature>,
typeAlias: HashMap<String, CjType>,
globalConstants: ?HashMap<String, String>,
apiInfo: APIInfo
) {
try (fp = File(filename, OpenOption.CreateOrTruncate(false))) {
try (sw = StringWriter(fp)) {
genStructsWCAPICode(sw, pkgName, capiPkgName, structDefs, funcs, typeAlias, globalConstants, apiInfo)
genStructsWCAPICode(
sw,
pkgName,
capiPkgName,
macrosPkgName,
structDefs,
funcs,
typeAlias,
globalConstants,
apiInfo
)
}
}
}
4 changes: 2 additions & 2 deletions generator/src/main.cj
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,8 @@ main(args: Array<String>): Int64 {
// Generate cimgui structs wcapi (cj class) -> src/wcapi/structs.cj
let structsWCAPICodeFilename = "${wcapiOutputDir}/structs.cj"
println("Generating cimgui funcs wcapi -> ${structsWCAPICodeFilename} ...")
genStructsWCAPICode(structsWCAPICodeFilename, wcapiPkgName, capiPkgName, structDefs, funcsSigs, typeAlias,
globalConstants, apiInfo)
genStructsWCAPICode(structsWCAPICodeFilename, wcapiPkgName, capiPkgName, macrosPkgName, structDefs, funcsSigs,
typeAlias, globalConstants, apiInfo)
println("Generated cimgui funcs wcapi -> ${structsWCAPICodeFilename}")

// Generate re-exports wcapi -> src/wcapi/re_exports.cj
Expand Down
28 changes: 4 additions & 24 deletions src/macros/default_args.cj
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public macro DefaultArgs(attrTokens: Tokens, inputTokens: Tokens): Tokens {
return inputTokens
}

let funcCallExpr = { // Check inputTokens & Get func call
{ // Check inputTokens & Get func call
=>
let fnDeclNode = parseDecl(inputTokens) as FuncDecl
if (fnDeclNode.isNone()) {
Expand All @@ -41,22 +41,6 @@ public macro DefaultArgs(attrTokens: Tokens, inputTokens: Tokens): Tokens {
if (fnDecl.funcParams.size < defaultArgs.size) {
throw IllegalArgumentException("illegal default arguments: `${attrTokens}`")
}

let funcRef = RefExpr()
funcRef.identifier = fnDecl.identifier

let funcCall = CallExpr()
funcCall.callFunc = funcRef
funcCall.arguments = ArrayList<Argument>(fnDecl.funcParams.size) {
i =>
let argRef = RefExpr()
argRef.identifier = fnDecl.funcParams[i].identifier
let arg = Argument()
arg.expr = argRef
arg
}

return funcCall
}()

let newline = Token(NL)
Expand All @@ -77,20 +61,16 @@ public macro DefaultArgs(attrTokens: Tokens, inputTokens: Tokens): Tokens {
}

// Change body
let returnExpr = ReturnExpr()
returnExpr.keyword = Token(RETURN)
returnExpr.expr = funcCallExpr

node.block.nodes = ArrayList<Node>()
let letNodes = ArrayList<Node>()
for ((j, arg) in enumerate(fakeArgs)) {
let letExpr = VarDecl()
letExpr.keyword = Token(LET)
letExpr.identifier = arg
letExpr.assign = Token(ASSIGN)
letExpr.expr = defaultArgs[j + defaultArgs.size - i]
node.block.nodes.append(letExpr)
letNodes.append(letExpr)
}
node.block.nodes.append(returnExpr)
node.block.nodes.prependAll(letNodes)

result += node.toTokens()
result += newline
Expand Down
20 changes: 16 additions & 4 deletions src/wcapi/basic.cj
Original file line number Diff line number Diff line change
Expand Up @@ -187,11 +187,17 @@ public let f32 = vaule<Float32>
public let f64 = vaule<Float64>

public open class StructWrapper<T> <: ToString where T <: CType {
protected let pointer: CPointer<T>
protected let count: ?Int64
protected let owned: Bool
protected var pointer: CPointer<T>
protected var count: ?Int64
protected var owned: Bool

public init(value!: ?T = None, count!: ?Int64 = None) {
public init() {
this.pointer = CPointer<T>()
this.count = None
this.owned = false
}

public init(value!: ?T, count!: ?Int64 = None) {
this(unsafe { LibC.malloc<T>(count: count ?? 1) }, count: count, owned: true)
if (let Some(v) <- value) {
let n = count.getOrDefault {1}
Expand All @@ -207,6 +213,12 @@ public open class StructWrapper<T> <: ToString where T <: CType {
this.owned = owned
}

public func _init(pointer: CPointer<T>, count!: ?Int64, owned!: Bool) {
this.pointer = pointer
this.count = count
this.owned = owned
}

// public func uninit() {
// if (owned) {
// unsafe { LibC.free(this.pointer) }
Expand Down
Loading

0 comments on commit e321fa5

Please sign in to comment.