in lib/src/code_generator/func.dart [82:160]
BindingString toBindingString(Writer w) {
final s = StringBuffer();
final enclosingFuncName = name;
final funcVarName = w.wrapperLevelUniqueNamer.makeUnique('_$name');
final funcPointerName = w.wrapperLevelUniqueNamer.makeUnique('_${name}Ptr');
if (dartDoc != null) {
s.write(makeDartDoc(dartDoc!));
}
// Resolve name conflicts in function parameter names.
final paramNamer = UniqueNamer({});
for (final p in functionType.parameters) {
p.name = paramNamer.makeUnique(p.name);
}
// Write enclosing function.
if (w.dartBool &&
functionType.returnType.getBaseTypealiasType().broadType ==
BroadType.Boolean) {
// Use bool return type in enclosing function.
s.write('bool $enclosingFuncName(\n');
} else {
s.write(
'${functionType.returnType.getDartType(w)} $enclosingFuncName(\n');
}
for (final p in functionType.parameters) {
if (w.dartBool &&
p.type.getBaseTypealiasType().broadType == BroadType.Boolean) {
// Use bool parameter type in enclosing function.
s.write(' bool ${p.name},\n');
} else {
s.write(' ${p.type.getDartType(w)} ${p.name},\n');
}
}
s.write(') {\n');
s.write('return $funcVarName');
s.write('(\n');
for (final p in functionType.parameters) {
if (w.dartBool &&
p.type.getBaseTypealiasType().broadType == BroadType.Boolean) {
// Convert bool parameter to int before calling.
s.write(' ${p.name}?1:0,\n');
} else {
s.write(' ${p.name},\n');
}
}
if (w.dartBool && functionType.returnType.broadType == BroadType.Boolean) {
// Convert int return type to bool.
s.write(' )!=0;\n');
} else {
s.write(' );\n');
}
s.write('}\n');
final cType = exposeFunctionTypedefs
? _exposedCFunctionTypealias!.name
: functionType.getCType(w, writeArgumentNames: false);
final dartType = exposeFunctionTypedefs
? _exposedDartFunctionTypealias!.name
: functionType.getDartType(w, writeArgumentNames: false);
if (exposeSymbolAddress) {
// Add to SymbolAddress in writer.
w.symbolAddressWriter.addSymbol(
type:
'${w.ffiLibraryPrefix}.Pointer<${w.ffiLibraryPrefix}.NativeFunction<$cType>>',
name: name,
ptrName: funcPointerName,
);
}
// Write function pointer.
s.write(
"late final $funcPointerName = ${w.lookupFuncIdentifier}<${w.ffiLibraryPrefix}.NativeFunction<$cType>>('$originalName');\n");
final isLeafString = isLeaf ? 'isLeaf:true' : '';
s.write(
'late final $funcVarName = $funcPointerName.asFunction<$dartType>($isLeafString);\n\n');
return BindingString(type: BindingStringType.func, string: s.toString());
}