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
2 changes: 2 additions & 0 deletions pkgs/ffigen/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
## 19.1.0-wip

## 19.0.0

- Use package:objective_c 8.0.0.
Expand Down
141 changes: 7 additions & 134 deletions pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@
// 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 'package:meta/meta.dart';

import '../code_generator.dart';
import '../config_provider/config_types.dart';
import '../visitor/ast.dart';

import 'binding_string.dart';
import 'objc_built_in_types.dart';
import 'utils.dart';
import 'writer.dart';

Expand Down Expand Up @@ -49,144 +48,18 @@ class ObjCBuiltInFunctions {
ObjCImport('UnimplementedOptionalMethodException');
static const checkOsVersion = ObjCImport('checkOsVersionInternal');

// Keep in sync with pkgs/objective_c/ffigen_objc.yaml.

@visibleForTesting
static const builtInInterfaces = {
'DartInputStreamAdapter',
'DartProtocol',
'DartProtocolBuilder',
'NSArray',
'NSCharacterSet',
'NSCoder',
'NSData',
'NSDate',
'NSDictionary',
'NSEnumerator',
'NSError',
'NSIndexSet',
'NSInputStream',
'NSInvocation',
'NSItemProvider',
'NSLocale',
'NSMethodSignature',
'NSMutableArray',
'NSMutableData',
'NSMutableDictionary',
'NSMutableIndexSet',
'NSMutableOrderedSet',
'NSMutableSet',
'NSMutableString',
'NSNotification',
'NSNumber',
'NSObject',
'NSOrderedCollectionDifference',
'NSOrderedSet',
'NSOutputStream',
'NSPort',
'NSPortMessage',
'NSRunLoop',
'NSSet',
'NSStream',
'NSString',
'NSTimer',
'NSURL',
'NSURLHandle',
'NSValue',
'Protocol',
};
@visibleForTesting
static const builtInCompounds = {
'AEDesc': 'AEDesc',
'__CFRunLoop': 'CFRunLoop',
'__CFString': 'CFString',
'CGPoint': 'CGPoint',
'CGRect': 'CGRect',
'CGSize': 'CGSize',
'NSEdgeInsets': 'NSEdgeInsets',
'NSFastEnumerationState': 'NSFastEnumerationState',
'_NSRange': 'NSRange',
'_NSZone': 'NSZone',
'OpaqueAEDataStorageType': 'OpaqueAEDataStorageType',
};
@visibleForTesting
static const builtInEnums = {
'NSAppleEventSendOptions',
'NSBinarySearchingOptions',
'NSComparisonResult',
'NSDataBase64DecodingOptions',
'NSDataBase64EncodingOptions',
'NSDataCompressionAlgorithm',
'NSDataReadingOptions',
'NSDataSearchOptions',
'NSDataWritingOptions',
'NSDecodingFailurePolicy',
'NSEnumerationOptions',
'NSItemProviderFileOptions',
'NSItemProviderRepresentationVisibility',
'NSKeyValueChange',
'NSKeyValueObservingOptions',
'NSKeyValueSetMutationKind',
'NSLinguisticTaggerOptions',
'NSLocaleLanguageDirection',
'NSOrderedCollectionDifferenceCalculationOptions',
'NSPropertyListFormat',
'NSQualityOfService',
'NSSortOptions',
'NSStreamEvent',
'NSStreamStatus',
'NSStringCompareOptions',
'NSStringEncodingConversionOptions',
'NSStringEnumerationOptions',
'NSURLBookmarkCreationOptions',
'NSURLBookmarkResolutionOptions',
'NSURLHandleStatus',
};
@visibleForTesting
static const builtInProtocols = {
'NSCoding': 'NSCoding',
'NSCopying': 'NSCopying',
'NSFastEnumeration': 'NSFastEnumeration',
'NSItemProviderReading': 'NSItemProviderReading',
'NSItemProviderWriting': 'NSItemProviderWriting',
'NSMutableCopying': 'NSMutableCopying',
'NSObject': 'NSObjectProtocol',
'NSPortDelegate': 'NSPortDelegate',
'NSSecureCoding': 'NSSecureCoding',
'NSStreamDelegate': 'NSStreamDelegate',
};
@visibleForTesting
static const builtInCategories = {
'NSDataCreation',
'NSExtendedArray',
'NSExtendedData',
'NSExtendedDate',
'NSExtendedDictionary',
'NSExtendedEnumerator',
'NSExtendedMutableArray',
'NSExtendedMutableData',
'NSExtendedMutableDictionary',
'NSExtendedMutableOrderedSet',
'NSExtendedMutableSet',
'NSExtendedOrderedSet',
'NSExtendedSet',
'NSNumberCreation',
'NSNumberIsFloat',
'NSStringExtensionMethods',
};

// TODO(https://github.com/dart-lang/native/issues/1173): Ideally this check
// would be based on more than just the name.
bool isBuiltInInterface(String name) =>
!generateForPackageObjectiveC && builtInInterfaces.contains(name);
String? getBuiltInInterfaceName(String name) =>
generateForPackageObjectiveC ? null : objCBuiltInInterfaces[name];
String? getBuiltInCompoundName(String name) =>
generateForPackageObjectiveC ? null : builtInCompounds[name];
generateForPackageObjectiveC ? null : objCBuiltInCompounds[name];
bool isBuiltInEnum(String name) =>
!generateForPackageObjectiveC && builtInEnums.contains(name);
!generateForPackageObjectiveC && objCBuiltInEnums.contains(name);
String? getBuiltInProtocolName(String name) =>
generateForPackageObjectiveC ? null : builtInProtocols[name];
generateForPackageObjectiveC ? null : objCBuiltInProtocols[name];
bool isBuiltInCategory(String name) =>
!generateForPackageObjectiveC && builtInCategories.contains(name);
!generateForPackageObjectiveC && objCBuiltInCategories.contains(name);
static bool isNSObject(String name) => name == 'NSObject';

// We need to load a separate instance of objc_msgSend for each signature. If
Expand Down
128 changes: 128 additions & 0 deletions pkgs/ffigen/lib/src/code_generator/objc_built_in_types.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// 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.

// Generated by package:objective_c's tool/generate_code.dart.

const objCBuiltInInterfaces = {
'DOBJCDartInputStreamAdapter': 'DartInputStreamAdapter',
'DOBJCDartProtocolBuilder': 'DartProtocolBuilder',
'DOBJCDartProtocol': 'DartProtocol',
'NSArray': 'NSArray',
'NSCharacterSet': 'NSCharacterSet',
'NSCoder': 'NSCoder',
'NSData': 'NSData',
'NSDate': 'NSDate',
'NSDictionary': 'NSDictionary',
'NSEnumerator': 'NSEnumerator',
'NSError': 'NSError',
'NSIndexSet': 'NSIndexSet',
'NSInputStream': 'NSInputStream',
'NSInvocation': 'NSInvocation',
'NSItemProvider': 'NSItemProvider',
'NSLocale': 'NSLocale',
'NSMethodSignature': 'NSMethodSignature',
'NSMutableArray': 'NSMutableArray',
'NSMutableData': 'NSMutableData',
'NSMutableDictionary': 'NSMutableDictionary',
'NSMutableIndexSet': 'NSMutableIndexSet',
'NSMutableOrderedSet': 'NSMutableOrderedSet',
'NSMutableSet': 'NSMutableSet',
'NSMutableString': 'NSMutableString',
'NSNotification': 'NSNotification',
'NSNumber': 'NSNumber',
'NSObject': 'NSObject',
'NSOutputStream': 'NSOutputStream',
'NSOrderedCollectionDifference': 'NSOrderedCollectionDifference',
'NSOrderedSet': 'NSOrderedSet',
'NSPort': 'NSPort',
'NSPortMessage': 'NSPortMessage',
'NSRunLoop': 'NSRunLoop',
'NSSet': 'NSSet',
'NSStream': 'NSStream',
'NSString': 'NSString',
'NSTimer': 'NSTimer',
'NSURL': 'NSURL',
'NSURLHandle': 'NSURLHandle',
'NSValue': 'NSValue',
'Protocol': 'Protocol',
};

const objCBuiltInCompounds = {
'AEDesc': 'AEDesc',
'__CFRunLoop': 'CFRunLoop',
'__CFString': 'CFString',
'CGPoint': 'CGPoint',
'CGRect': 'CGRect',
'CGSize': 'CGSize',
'NSEdgeInsets': 'NSEdgeInsets',
'NSFastEnumerationState': 'NSFastEnumerationState',
'_NSRange': 'NSRange',
'_NSZone': 'NSZone',
'OpaqueAEDataStorageType': 'OpaqueAEDataStorageType',
};

const objCBuiltInEnums = {
'NSAppleEventSendOptions',
'NSBinarySearchingOptions',
'NSComparisonResult',
'NSDataBase64DecodingOptions',
'NSDataBase64EncodingOptions',
'NSDataCompressionAlgorithm',
'NSDataReadingOptions',
'NSDataSearchOptions',
'NSDataWritingOptions',
'NSDecodingFailurePolicy',
'NSEnumerationOptions',
'NSItemProviderFileOptions',
'NSItemProviderRepresentationVisibility',
'NSKeyValueChange',
'NSKeyValueObservingOptions',
'NSKeyValueSetMutationKind',
'NSLinguisticTaggerOptions',
'NSLocaleLanguageDirection',
'NSOrderedCollectionDifferenceCalculationOptions',
'NSPropertyListFormat',
'NSQualityOfService',
'NSSortOptions',
'NSStreamEvent',
'NSStreamStatus',
'NSStringCompareOptions',
'NSStringEncodingConversionOptions',
'NSStringEnumerationOptions',
'NSURLBookmarkCreationOptions',
'NSURLBookmarkResolutionOptions',
'NSURLHandleStatus',
};

const objCBuiltInProtocols = {
'NSCoding': 'NSCoding',
'NSCopying': 'NSCopying',
'NSFastEnumeration': 'NSFastEnumeration',
'NSItemProviderReading': 'NSItemProviderReading',
'NSItemProviderWriting': 'NSItemProviderWriting',
'NSMutableCopying': 'NSMutableCopying',
'NSObject': 'NSObjectProtocol',
'NSPortDelegate': 'NSPortDelegate',
'NSSecureCoding': 'NSSecureCoding',
'NSStreamDelegate': 'NSStreamDelegate',
};

const objCBuiltInCategories = {
'NSDataCreation',
'NSExtendedArray',
'NSExtendedData',
'NSExtendedDate',
'NSExtendedDictionary',
'NSExtendedEnumerator',
'NSExtendedMutableArray',
'NSExtendedMutableData',
'NSExtendedMutableDictionary',
'NSExtendedMutableOrderedSet',
'NSExtendedMutableSet',
'NSExtendedOrderedSet',
'NSExtendedSet',
'NSNumberCreation',
'NSNumberIsFloat',
'NSStringExtensionMethods',
};
8 changes: 6 additions & 2 deletions pkgs/ffigen/lib/src/code_generator/objc_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,10 @@ class ObjCInterface extends BindingType with ObjCMethods {
required this.builtInFunctions,
required this.apiAvailability,
}) : lookupName = lookupName ?? originalName,
super(name: name ?? originalName) {
super(
name: builtInFunctions.getBuiltInInterfaceName(originalName) ??
name ??
originalName) {
classObject = ObjCInternalGlobal('_class_$originalName',
(Writer w) => '${ObjCBuiltInFunctions.getClass.gen(w)}("$lookupName")');
_isKindOfClass = builtInFunctions.getSelObject('isKindOfClass:');
Expand All @@ -56,7 +59,8 @@ class ObjCInterface extends BindingType with ObjCMethods {
}

@override
bool get isObjCImport => builtInFunctions.isBuiltInInterface(originalName);
bool get isObjCImport =>
builtInFunctions.getBuiltInInterfaceName(originalName) != null;

@override
void sort() => sortMethods();
Expand Down
2 changes: 1 addition & 1 deletion pkgs/ffigen/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# BSD-style license that can be found in the LICENSE file.

name: ffigen
version: 19.0.0
version: 19.1.0-wip
description: >
Generator for FFI bindings, using LibClang to parse C, Objective-C, and Swift
files.
Expand Down
2 changes: 2 additions & 0 deletions pkgs/objective_c/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
## 8.1.0-wip

## 8.0.0

- Use ffigen 19.0.0
Expand Down
Loading
Loading