Skip to content

Commit

Permalink
Sort interface methods
Browse files Browse the repository at this point in the history
  • Loading branch information
liamappelbe committed Sep 25, 2024
1 parent d295afc commit 4be8b66
Show file tree
Hide file tree
Showing 10 changed files with 16,860 additions and 15,381 deletions.
4 changes: 4 additions & 0 deletions pkgs/ffigen/lib/src/code_generator/binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ abstract class Binding {

/// Returns the Objective C bindings, if any.
BindingString? toObjCBindingString(Writer w) => null;

/// Sort members of this binding, if possible. For example, sort the methods
/// of a ObjCInterface.
void sort() {}
}

/// Base class for bindings which look up symbols in dynamic library.
Expand Down
3 changes: 3 additions & 0 deletions pkgs/ffigen/lib/src/code_generator/library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ class Library {
bindings = dependencies.toList();
if (sort) {
bindings.sortBy((b) => b.name);
for (final b in bindings) {
b.sort();
}
}
}

Expand Down
3 changes: 3 additions & 0 deletions pkgs/ffigen/lib/src/code_generator/objc_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ class ObjCInterface extends BindingType with ObjCMethods {
void addProtocol(ObjCProtocol proto) => _protocols.add(proto);
bool get _isBuiltIn => builtInFunctions.isBuiltInInterface(originalName);

@override
void sort() => sortMethods();

@override
BindingString toBindingString(Writer w) {
if (_isBuiltIn) {
Expand Down
6 changes: 5 additions & 1 deletion pkgs/ffigen/lib/src/code_generator/objc_methods.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ final _logger = Logger('ffigen.code_generator.objc_methods');

mixin ObjCMethods {
final _methods = <String, ObjCMethod>{};
final _order = <String>[];

Iterable<ObjCMethod> get methods => _methods.values;
Iterable<ObjCMethod> get methods => _order.map((name) => _methods[name]!);
ObjCMethod? getMethod(String name) => _methods[name];

String get originalName;
Expand All @@ -24,6 +25,7 @@ mixin ObjCMethods {
if (_shouldIncludeMethod(method)) {
_methods[method.originalName] =
_maybeReplaceMethod(getMethod(method.originalName), method);
_order.add(method.originalName);
}
}

Expand Down Expand Up @@ -93,6 +95,8 @@ mixin ObjCMethods {
UniqueNamer createMethodRenamer(Writer w) => UniqueNamer(
{name, 'pointer', 'toString', 'hashCode', 'runtimeType', 'noSuchMethod'},
parent: w.topLevelUniqueNamer);

void sortMethods() => _order.sort();
}

enum ObjCMethodKind {
Expand Down
3 changes: 3 additions & 0 deletions pkgs/ffigen/lib/src/code_generator/objc_protocol.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ class ObjCProtocol extends NoLookUpBinding with ObjCMethods {
}) : lookupName = lookupName ?? originalName,
super(name: name ?? originalName);

@override
void sort() => sortMethods();

@override
BindingString toBindingString(Writer w) {
if (!generateBindings) {
Expand Down
1 change: 1 addition & 0 deletions pkgs/objective_c/ffigen_c.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ ffi-native:
assetId: 'objective_c.framework/objective_c'
exclude-all-by-default: true
generate-for-package-objective-c: true
sort: true
functions:
include:
- 'objc_.*'
Expand Down
1 change: 1 addition & 0 deletions pkgs/objective_c/ffigen_objc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ headers:
ffi-native:
exclude-all-by-default: true
generate-for-package-objective-c: true
sort: true
external-versions:
# See https://docs.flutter.dev/reference/supported-platforms.
ios:
Expand Down
208 changes: 101 additions & 107 deletions pkgs/objective_c/lib/src/c_bindings_generated.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,45 +37,30 @@ external int Dart_InitializeApiDL(
ffi.Pointer<ffi.Void> data,
);

@ffi.Native<ffi.Pointer<ObjCSelector> Function(ffi.Pointer<ffi.Char>)>(
symbol: "sel_registerName", isLeaf: true)
external ffi.Pointer<ObjCSelector> registerName(
ffi.Pointer<ffi.Char> name,
);

@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Char>)>(
symbol: "objc_getClass", isLeaf: true)
external ffi.Pointer<ObjCObject> getClass(
ffi.Pointer<ffi.Char> name,
);
@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteAutoBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteAutoBlock;

@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>(
symbol: "objc_retain", isLeaf: true)
external ffi.Pointer<ObjCObject> objectRetain(
ffi.Pointer<ObjCObject> object,
);
@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(
symbol: "_NSConcreteFinalizingBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteFinalizingBlock;

@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>(
symbol: "objc_retainBlock", isLeaf: true)
external ffi.Pointer<ObjCObject> blockRetain(
ffi.Pointer<ObjCObject> object,
);
@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteGlobalBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteGlobalBlock;

@ffi.Native<ffi.Void Function(ffi.Pointer<ObjCObject>)>(
symbol: "objc_release", isLeaf: true)
external void objectRelease(
ffi.Pointer<ObjCObject> object,
);
@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteMallocBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteMallocBlock;

@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>(
symbol: "objc_autorelease", isLeaf: true)
external ffi.Pointer<ObjCObject> objectAutorelease(
ffi.Pointer<ObjCObject> object,
);
@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteStackBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteStackBlock;

@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>(
symbol: "object_getClass", isLeaf: true)
external ffi.Pointer<ObjCObject> getObjectClass(
symbol: "objc_retainBlock", isLeaf: true)
external ffi.Pointer<ObjCObject> blockRetain(
ffi.Pointer<ObjCObject> object,
);

Expand All @@ -87,39 +72,20 @@ external ffi.Pointer<ffi.Pointer<ObjCObject>> copyClassList(
ffi.Pointer<ffi.UnsignedInt> count,
);

@ffi.Native<ffi.Void Function()>(symbol: "objc_msgSend")
external void msgSend();

@ffi.Native<ffi.Void Function()>(symbol: "objc_msgSend_fpret")
external void msgSendFpret();

@ffi.Native<ffi.Void Function()>(symbol: "objc_msgSend_stret")
external void msgSendStret();

@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteStackBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteStackBlock;

@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteMallocBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteMallocBlock;

@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteAutoBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteAutoBlock;

@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(
symbol: "_NSConcreteFinalizingBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteFinalizingBlock;
@ffi.Native<ffi.Void Function(Dart_FinalizableHandle, ffi.Handle)>()
external void deleteFinalizableHandle(
Dart_FinalizableHandle handle,
Object owner,
);

@ffi.Array.multi([32])
@ffi.Native<ffi.Array<ffi.Pointer<ffi.Void>>>(symbol: "_NSConcreteGlobalBlock")
external ffi.Array<ffi.Pointer<ffi.Void>> NSConcreteGlobalBlock;
@ffi.Native<ffi.Void Function(ffi.Pointer<ObjCBlockImpl>)>()
external void disposeObjCBlockWithClosure(
ffi.Pointer<ObjCBlockImpl> block,
);

@ffi.Native<ffi.Pointer<ObjCProtocol> Function(ffi.Pointer<ffi.Char>)>(
symbol: "objc_getProtocol", isLeaf: true)
external ffi.Pointer<ObjCProtocol> getProtocol(
@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ffi.Char>)>(
symbol: "objc_getClass", isLeaf: true)
external ffi.Pointer<ObjCObject> getClass(
ffi.Pointer<ffi.Char> name,
);

Expand All @@ -136,55 +102,99 @@ external ObjCMethodDesc getMethodDescription(
bool isInstanceMethod,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ObjCBlockImpl>)>()
external void disposeObjCBlockWithClosure(
ffi.Pointer<ObjCBlockImpl> block,
@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>(
symbol: "object_getClass", isLeaf: true)
external ffi.Pointer<ObjCObject> getObjectClass(
ffi.Pointer<ObjCObject> object,
);

@ffi.Native<ffi.Pointer<ObjCProtocol> Function(ffi.Pointer<ffi.Char>)>(
symbol: "objc_getProtocol", isLeaf: true)
external ffi.Pointer<ObjCProtocol> getProtocol(
ffi.Pointer<ffi.Char> name,
);

@ffi.Native<ffi.Bool Function(ffi.Pointer<ObjCBlockImpl>)>(isLeaf: true)
external bool isValidBlock(
ffi.Pointer<ObjCBlockImpl> block,
);

@ffi.Native<ffi.Void Function()>(symbol: "objc_msgSend")
external void msgSend();

@ffi.Native<ffi.Void Function()>(symbol: "objc_msgSend_fpret")
external void msgSendFpret();

@ffi.Native<ffi.Void Function()>(symbol: "objc_msgSend_stret")
external void msgSendStret();

@ffi.Native<ffi.Pointer<ffi.Bool> Function(ffi.Handle)>()
external ffi.Pointer<ffi.Bool> newFinalizableBool(
Object owner,
);

@ffi.Native<
Dart_FinalizableHandle Function(ffi.Handle, ffi.Pointer<ObjCObject>)>()
external Dart_FinalizableHandle newFinalizableHandle(
Object owner,
ffi.Pointer<ObjCObject> object,
);

@ffi.Native<ffi.Void Function(Dart_FinalizableHandle, ffi.Handle)>()
external void deleteFinalizableHandle(
Dart_FinalizableHandle handle,
Object owner,
@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>(
symbol: "objc_autorelease", isLeaf: true)
external ffi.Pointer<ObjCObject> objectAutorelease(
ffi.Pointer<ObjCObject> object,
);

@ffi.Native<ffi.Pointer<ffi.Bool> Function(ffi.Handle)>()
external ffi.Pointer<ffi.Bool> newFinalizableBool(
Object owner,
@ffi.Native<ffi.Void Function(ffi.Pointer<ObjCObject>)>(
symbol: "objc_release", isLeaf: true)
external void objectRelease(
ffi.Pointer<ObjCObject> object,
);

typedef ObjCSelector = _ObjCSelector;
@ffi.Native<ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>)>(
symbol: "objc_retain", isLeaf: true)
external ffi.Pointer<ObjCObject> objectRetain(
ffi.Pointer<ObjCObject> object,
);

final class _ObjCSelector extends ffi.Opaque {}
@ffi.Native<ffi.Pointer<ObjCSelector> Function(ffi.Pointer<ffi.Char>)>(
symbol: "sel_registerName", isLeaf: true)
external ffi.Pointer<ObjCSelector> registerName(
ffi.Pointer<ffi.Char> name,
);

typedef Dart_FinalizableHandle = ffi.Pointer<_Dart_FinalizableHandle>;
typedef ObjCBlockDesc = _ObjCBlockDesc;
typedef ObjCBlockImpl = _ObjCBlockImpl;
typedef ObjCMethodDesc = _ObjCMethodDesc;
typedef ObjCObject = _ObjCObject;
typedef ObjCProtocol = _ObjCProtocol;
typedef ObjCSelector = _ObjCSelector;

final class _ObjCObject extends ffi.Opaque {}
final class _Dart_FinalizableHandle extends ffi.Opaque {}

typedef ObjCProtocol = _ObjCProtocol;
final class _Dart_Handle extends ffi.Opaque {}

final class _ObjCProtocol extends ffi.Opaque {}
final class _ObjCBlockDesc extends ffi.Struct {
@ffi.UnsignedLong()
external int reserved;

typedef ObjCMethodDesc = _ObjCMethodDesc;
@ffi.UnsignedLong()
external int size;

final class _ObjCMethodDesc extends ffi.Struct {
external ffi.Pointer<ObjCSelector> name;
external ffi.Pointer<
ffi.NativeFunction<
ffi.Void Function(
ffi.Pointer<ffi.Void> dst, ffi.Pointer<ffi.Void> src)>>
copy_helper;

external ffi.Pointer<ffi.Char> types;
}
external ffi
.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void> src)>>
dispose_helper;

typedef ObjCBlockImpl = _ObjCBlockImpl;
external ffi.Pointer<ffi.Char> signature;
}

final class _ObjCBlockImpl extends ffi.Struct {
external ffi.Pointer<ffi.Void> isa;
Expand All @@ -205,30 +215,14 @@ final class _ObjCBlockImpl extends ffi.Struct {
external int dispose_port;
}

typedef ObjCBlockDesc = _ObjCBlockDesc;

final class _ObjCBlockDesc extends ffi.Struct {
@ffi.UnsignedLong()
external int reserved;

@ffi.UnsignedLong()
external int size;

external ffi.Pointer<
ffi.NativeFunction<
ffi.Void Function(
ffi.Pointer<ffi.Void> dst, ffi.Pointer<ffi.Void> src)>>
copy_helper;

external ffi
.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void> src)>>
dispose_helper;
final class _ObjCMethodDesc extends ffi.Struct {
external ffi.Pointer<ObjCSelector> name;

external ffi.Pointer<ffi.Char> signature;
external ffi.Pointer<ffi.Char> types;
}

typedef Dart_FinalizableHandle = ffi.Pointer<_Dart_FinalizableHandle>;
final class _ObjCObject extends ffi.Opaque {}

final class _Dart_FinalizableHandle extends ffi.Opaque {}
final class _ObjCProtocol extends ffi.Opaque {}

final class _Dart_Handle extends ffi.Opaque {}
final class _ObjCSelector extends ffi.Opaque {}
Loading

0 comments on commit 4be8b66

Please sign in to comment.