Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions pkgs/ffigen/lib/src/code_generator/compound.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ abstract class Compound extends BindingType {
return '${context.libs.prefix(ffiImport)}.Array<'
'${_getInlineArrayTypeString(type.child, w)}>';
}
return type.getCType(w);
return type.getCType(context);
}

@override
Expand All @@ -129,7 +129,7 @@ abstract class Compound extends BindingType {
/// Marking type names because dart doesn't allow class member to have the
/// same name as a type name used internally.
for (final m in members) {
localUniqueNamer.markUsed(m.type.getFfiDartType(w));
localUniqueNamer.markUsed(m.type.getFfiDartType(context));
}

/// Write @Packed(X) annotation if struct is packed.
Expand All @@ -155,19 +155,19 @@ abstract class Compound extends BindingType {
s.write('${m.name};\n\n');
} else {
if (!m.type.sameFfiDartAndCType) {
s.write('$depth@${m.type.getCType(w)}()\n');
s.write('$depth@${m.type.getCType(context)}()\n');
}
final memberName = m.type.sameDartAndFfiDartType
? m.name
: '${m.name}AsInt';
s.write(
'${depth}external ${m.type.getFfiDartType(w)} $memberName;\n\n',
'${depth}external ${m.type.getFfiDartType(context)} $memberName;\n\n',
);
}
if (m.type case EnumClass(
:final style,
) when style == EnumStyle.dartEnum) {
final enumName = m.type.getDartType(w);
final enumName = m.type.getDartType(context);
final memberName = m.name;
s.write(
'$enumName get $memberName => '
Expand All @@ -184,7 +184,7 @@ abstract class Compound extends BindingType {
bool get isIncompleteCompound => isIncomplete;

@override
String getCType(Writer w) {
String getCType(Context context) {
final builtInName = context.objCBuiltInFunctions.getBuiltInCompoundName(
originalName,
);
Expand Down
18 changes: 10 additions & 8 deletions pkgs/ffigen/lib/src/code_generator/enum_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -265,17 +265,17 @@ class EnumClass extends BindingType {
}

@override
String getCType(Writer w) => nativeType.getCType(w);
String getCType(Context context) => nativeType.getCType(context);

@override
String getFfiDartType(Writer w) => nativeType.getFfiDartType(w);
String getFfiDartType(Context context) => nativeType.getFfiDartType(context);

@override
String getDartType(Writer w) {
String getDartType(Context context) {
if (isObjCImport) {
return '${context.libs.prefix(objcPkgImport)}.$name';
} else if (style == EnumStyle.intConstants) {
return nativeType.getDartType(w);
return nativeType.getDartType(context);
} else {
return name;
}
Expand All @@ -291,23 +291,25 @@ class EnumClass extends BindingType {
bool get sameDartAndFfiDartType => style == EnumStyle.intConstants;

@override
String? getDefaultValue(Writer w) => '0';
String? getDefaultValue(Context context) => '0';

@override
String convertDartTypeToFfiDartType(
Writer w,
Context context,
String value, {
required bool objCRetain,
required bool objCAutorelease,
}) => sameDartAndFfiDartType ? value : '$value.value';

@override
String convertFfiDartTypeToDartType(
Writer w,
Context context,
String value, {
required bool objCRetain,
String? objCEnclosingClass,
}) => sameDartAndFfiDartType ? value : '${getDartType(w)}.fromValue($value)';
}) => sameDartAndFfiDartType
? value
: '${getDartType(context)}.fromValue($value)';

@override
void visitChildren(Visitor visitor) {
Expand Down
21 changes: 11 additions & 10 deletions pkgs/ffigen/lib/src/code_generator/func.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,33 +109,34 @@ class Func extends LookUpBinding {
p.name = paramNamer.makeUnique(p.name);
}

final context = w.context;
final cType =
_exposedFunctionTypealias?.getCType(w) ??
functionType.getCType(w, writeArgumentNames: false);
_exposedFunctionTypealias?.getCType(context) ??
functionType.getCType(context, writeArgumentNames: false);
final dartType =
_exposedFunctionTypealias?.getFfiDartType(w) ??
functionType.getFfiDartType(w, writeArgumentNames: false);
_exposedFunctionTypealias?.getFfiDartType(context) ??
functionType.getFfiDartType(context, writeArgumentNames: false);
final needsWrapper = !functionType.sameDartAndFfiDartType && !isInternal;

final funcVarName = w.wrapperLevelUniqueNamer.makeUnique('_$name');
final ffiReturnType = functionType.returnType.getFfiDartType(w);
final ffiReturnType = functionType.returnType.getFfiDartType(context);
final ffiArgDeclString = functionType.dartTypeParameters
.map((p) => '${p.type.getFfiDartType(w)} ${p.name},\n')
.map((p) => '${p.type.getFfiDartType(context)} ${p.name},\n')
.join('');

late final String dartReturnType;
late final String dartArgDeclString;
late final String funcImplCall;
if (needsWrapper) {
dartReturnType = functionType.returnType.getDartType(w);
dartReturnType = functionType.returnType.getDartType(context);
dartArgDeclString = functionType.dartTypeParameters
.map((p) => '${p.type.getDartType(w)} ${p.name},\n')
.map((p) => '${p.type.getDartType(context)} ${p.name},\n')
.join('');

final argString = functionType.dartTypeParameters
.map((p) {
final type = p.type.convertDartTypeToFfiDartType(
w,
context,
p.name,
objCRetain: p.objCConsumed,
objCAutorelease: false,
Expand All @@ -144,7 +145,7 @@ class Func extends LookUpBinding {
})
.join('');
funcImplCall = functionType.returnType.convertFfiDartTypeToDartType(
w,
context,
'$funcVarName($argString)',
objCRetain: !objCReturnsRetained,
);
Expand Down
33 changes: 17 additions & 16 deletions pkgs/ffigen/lib/src/code_generator/func_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// BSD-style license that can be found in the LICENSE file.

import '../code_generator.dart';
import '../context.dart';
import '../visitor/ast.dart';

import 'unique_namer.dart';
import 'writer.dart';

/// Represents a function type.
class FunctionType extends Type {
Expand Down Expand Up @@ -66,19 +66,20 @@ class FunctionType extends Type {
}

@override
String getCType(Writer w, {bool writeArgumentNames = true}) => _getTypeImpl(
writeArgumentNames,
(Type t) => t.getCType(w),
varArgWrapper: '${w.context.libs.prefix(ffiImport)}.VarArgs',
);
String getCType(Context context, {bool writeArgumentNames = true}) =>
_getTypeImpl(
writeArgumentNames,
(Type t) => t.getCType(context),
varArgWrapper: '${context.libs.prefix(ffiImport)}.VarArgs',
);

@override
String getFfiDartType(Writer w, {bool writeArgumentNames = true}) =>
_getTypeImpl(writeArgumentNames, (Type t) => t.getFfiDartType(w));
String getFfiDartType(Context context, {bool writeArgumentNames = true}) =>
_getTypeImpl(writeArgumentNames, (Type t) => t.getFfiDartType(context));

@override
String getDartType(Writer w, {bool writeArgumentNames = true}) =>
_getTypeImpl(writeArgumentNames, (Type t) => t.getDartType(w));
String getDartType(Context context, {bool writeArgumentNames = true}) =>
_getTypeImpl(writeArgumentNames, (Type t) => t.getDartType(context));

@override
String getNativeType({String varName = ''}) {
Expand Down Expand Up @@ -164,16 +165,16 @@ class NativeFunc extends Type {
}

@override
String getCType(Writer w, {bool writeArgumentNames = true}) {
String getCType(Context context, {bool writeArgumentNames = true}) {
final funcType = _type is FunctionType
? _type.getCType(w, writeArgumentNames: writeArgumentNames)
: _type.getCType(w);
return '${w.context.libs.prefix(ffiImport)}.NativeFunction<$funcType>';
? _type.getCType(context, writeArgumentNames: writeArgumentNames)
: _type.getCType(context);
return '${context.libs.prefix(ffiImport)}.NativeFunction<$funcType>';
}

@override
String getFfiDartType(Writer w, {bool writeArgumentNames = true}) =>
getCType(w, writeArgumentNames: writeArgumentNames);
String getFfiDartType(Context context, {bool writeArgumentNames = true}) =>
getCType(context, writeArgumentNames: writeArgumentNames);

@override
String getNativeType({String varName = ''}) =>
Expand Down
17 changes: 9 additions & 8 deletions pkgs/ffigen/lib/src/code_generator/global.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,32 +46,33 @@ class Global extends LookUpBinding {
final s = StringBuffer();
final globalVarName = name;
s.write(makeDartDoc(dartDoc));
final dartType = type.getDartType(w);
final ffiDartType = type.getFfiDartType(w);
final context = w.context;
final dartType = type.getDartType(context);
final ffiDartType = type.getFfiDartType(context);

// Removing pointer reference for ConstantArray cType since we always wrap
// globals with pointer below.
final cType = (type is ConstantArray && !nativeConfig.enabled)
? (type as ConstantArray).child.getCType(w)
: type.getCType(w);
? (type as ConstantArray).child.getCType(context)
: type.getCType(context);

final ptrType = '${w.context.libs.prefix(ffiImport)}.Pointer<$cType>';
final ptrType = '${context.libs.prefix(ffiImport)}.Pointer<$cType>';

void generateConvertingGetterAndSetter(String pointerValue) {
final getValue = type.convertFfiDartTypeToDartType(
w,
context,
pointerValue,
objCRetain: true,
);
s.write('$dartType get $globalVarName => $getValue;\n\n');
if (!constant) {
final releaseOldValue = type.convertFfiDartTypeToDartType(
w,
context,
pointerValue,
objCRetain: false,
);
final newValue = type.convertDartTypeToFfiDartType(
w,
context,
'value',
objCRetain: true,
objCAutorelease: false,
Expand Down
8 changes: 4 additions & 4 deletions pkgs/ffigen/lib/src/code_generator/handle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@
// BSD-style license that can be found in the LICENSE file.

import '../code_generator.dart';
import '../context.dart';
import '../visitor/ast.dart';

import 'writer.dart';

/// Represents a Dart_Handle.
class HandleType extends Type {
const HandleType._();
static const _handle = HandleType._();
factory HandleType() => _handle;

@override
String getCType(Writer w) => '${w.context.libs.prefix(ffiImport)}.Handle';
String getCType(Context context) =>
'${context.libs.prefix(ffiImport)}.Handle';

@override
String getFfiDartType(Writer w) => 'Object';
String getFfiDartType(Context context) => 'Object';

// The real native type is Dart_Handle, but that would mean importing
// dart_api.h into the generated native code.
Expand Down
17 changes: 9 additions & 8 deletions pkgs/ffigen/lib/src/code_generator/imports.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import '../context.dart';
import '../visitor/ast.dart';

import 'type.dart';
import 'writer.dart';

/// A library import which will be written as an import in the generated file.
class LibraryImport extends AstNode {
Expand Down Expand Up @@ -63,14 +63,15 @@ class ImportedType extends Type {
});

@override
String getCType(Writer w) => '${w.context.libs.prefix(libraryImport)}.$cType';
String getCType(Context context) =>
'${context.libs.prefix(libraryImport)}.$cType';

@override
String getFfiDartType(Writer w) {
String getFfiDartType(Context context) {
if (importedDartType) {
return '${w.context.libs.prefix(libraryImport)}.$dartType';
return '${context.libs.prefix(libraryImport)}.$dartType';
} else {
return cType == dartType ? getCType(w) : dartType;
return cType == dartType ? getCType(context) : dartType;
}
}

Expand All @@ -84,7 +85,7 @@ class ImportedType extends Type {
String toString() => '${libraryImport.name}.$cType';

@override
String? getDefaultValue(Writer w) => defaultValue;
String? getDefaultValue(Context context) => defaultValue;

@override
void visit(Visitation visitation) => visitation.visitImportedType(this);
Expand All @@ -106,10 +107,10 @@ class SelfImportedType extends Type {
SelfImportedType(this.cType, this.dartType, [this.defaultValue]);

@override
String getCType(Writer w) => cType;
String getCType(Context context) => cType;

@override
String getFfiDartType(Writer w) => dartType;
String getFfiDartType(Context context) => dartType;

@override
bool get sameFfiDartAndCType => cType == dartType;
Expand Down
10 changes: 5 additions & 5 deletions pkgs/ffigen/lib/src/code_generator/native_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
// BSD-style license that can be found in the LICENSE file.

import '../code_generator.dart';
import '../context.dart';
import '../visitor/ast.dart';

import 'writer.dart';

enum SupportedNativeType {
voidType,
char,
Expand Down Expand Up @@ -68,10 +67,11 @@ class NativeType extends Type {
factory NativeType(SupportedNativeType type) => _primitives[type]!;

@override
String getCType(Writer w) => '${w.context.libs.prefix(ffiImport)}.$_cType';
String getCType(Context context) =>
'${context.libs.prefix(ffiImport)}.$_cType';

@override
String getFfiDartType(Writer w) => _dartType;
String getFfiDartType(Context context) => _dartType;

@override
String getNativeType({String varName = ''}) => '$_nativeType $varName';
Expand All @@ -86,7 +86,7 @@ class NativeType extends Type {
String cacheKey() => _cType;

@override
String? getDefaultValue(Writer w) => _defaultValue;
String? getDefaultValue(Context context) => _defaultValue;

@override
void visitChildren(Visitor visitor) {
Expand Down
Loading
Loading