Skip to content

Commit aa82b97

Browse files
authored
[ffigen][swift2objc] Some small fixes (#1777)
1 parent 3210a79 commit aa82b97

File tree

11 files changed

+70
-25
lines changed

11 files changed

+70
-25
lines changed

pkgs/ffigen/lib/ffigen.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,12 @@
88
/// https://pub.dev/packages/ffigen for details.
99
library ffigen;
1010

11-
export 'src/config_provider.dart' show Config, YamlConfig;
11+
export 'src/config_provider.dart'
12+
show
13+
Config,
14+
DeclarationFilters,
15+
ExternalVersions,
16+
Language,
17+
Versions,
18+
YamlConfig;
1219
export 'src/ffigen.dart' show FfiGen;

pkgs/ffigen/lib/src/code_generator/pointer.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,15 @@ class ObjCObjectPointer extends PointerType {
154154

155155
@override
156156
String? generateRetain(String value) => 'objc_retain($value)';
157+
158+
@override
159+
bool isSupertypeOf(Type other) {
160+
other = other.typealiasType;
161+
// id/Object* is a supertype of all ObjC objects and blocks.
162+
return other is ObjCObjectPointer ||
163+
other is ObjCInterface ||
164+
other is ObjCBlock;
165+
}
157166
}
158167

159168
/// A pointer to an Objective C block.
@@ -168,4 +177,10 @@ class ObjCBlockPointer extends ObjCObjectPointer {
168177

169178
@override
170179
String? generateRetain(String value) => 'objc_retainBlock($value)';
180+
181+
@override
182+
bool isSupertypeOf(Type other) {
183+
other = other.typealiasType;
184+
return other is ObjCBlockPointer || other is ObjCBlock;
185+
}
171186
}

pkgs/ffigen/lib/src/config_provider.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
library config_provider;
77

88
export 'config_provider/config.dart';
9+
export 'config_provider/config_types.dart';
910
export 'config_provider/yaml_config.dart';

pkgs/ffigen/lib/src/header_parser/parser.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import 'package:logging/logging.dart';
1212
import '../code_generator.dart';
1313
import '../code_generator/utils.dart';
1414
import '../config_provider.dart';
15-
import '../config_provider/config_types.dart';
1615
import '../strings.dart' as strings;
1716
import '../visitor/apply_config_filters.dart';
1817
import '../visitor/ast.dart';

pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void _parseSuperType(clang_types.CXCursor cursor, ObjCInterface itf) {
174174
kind: ObjCMethodKind.propertySetter,
175175
isClassMethod: isClassMethod,
176176
isOptional: isOptionalMethod,
177-
returnType: NativeType(SupportedNativeType.voidType),
177+
returnType: voidType,
178178
family: null,
179179
);
180180
setter.params

pkgs/ffigen/lib/src/visitor/fix_overridden_methods.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ class FixOverriddenMethodsVisitation extends Visitation {
130130
final (root, rootMethod) = _findRootWithMethod(node, method);
131131
// If method and rootMethod are the same kind, then there's nothing to do.
132132
if ((method.kind == ObjCMethodKind.propertyGetter) ==
133-
(rootMethod.kind == ObjCMethodKind.propertyGetter)) continue;
133+
(rootMethod.kind == ObjCMethodKind.propertyGetter)) {
134+
continue;
135+
}
134136
_convertAllSubtreeMethodsToProperties(root, rootMethod);
135137
}
136138
}

pkgs/ffigen/test/large_integration_tests/large_objc_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import 'dart:io';
1414

1515
import 'package:ffigen/ffigen.dart';
1616
import 'package:ffigen/src/code_generator/utils.dart';
17-
import 'package:ffigen/src/config_provider/config.dart';
1817
import 'package:ffigen/src/config_provider/config_types.dart';
1918
import 'package:logging/logging.dart';
2019
import 'package:pub_semver/pub_semver.dart';

pkgs/ffigen/test/unit_tests/subtyping_test.dart

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ void main() {
3232
final uncle = makeInterface('Uncle', grandparent);
3333
final child = makeInterface('Child', parent);
3434

35+
ObjCBlock makeBlock(Type returnType, List<Type> argTypes) => ObjCBlock(
36+
returnType: returnType,
37+
params: [
38+
for (final t in argTypes) Parameter(type: t, objCConsumed: false),
39+
],
40+
returnsRetained: false,
41+
builtInFunctions: builtInFunctions);
42+
3543
group('ObjCInterface', () {
3644
test('subtype', () {
3745
expect(parent.isSubtypeOf(parent), isTrue);
@@ -140,14 +148,6 @@ void main() {
140148
});
141149

142150
group('ObjCBlock', () {
143-
ObjCBlock makeBlock(Type returnType, List<Type> argTypes) => ObjCBlock(
144-
returnType: returnType,
145-
params: [
146-
for (final t in argTypes) Parameter(type: t, objCConsumed: false),
147-
],
148-
returnsRetained: false,
149-
builtInFunctions: builtInFunctions);
150-
151151
test('covariant returns', () {
152152
// Return types are covariant. S Function() <: T Function() if S <: T.
153153
final returnsParent = makeBlock(parent, []);
@@ -237,5 +237,25 @@ void main() {
237237
expect(makeTypealias(parent).isSubtypeOf(child), isFalse);
238238
expect(parent.isSubtypeOf(makeTypealias(child)), isFalse);
239239
});
240+
241+
test('ObjCObjectPointer', () {
242+
expect(ObjCObjectPointer().isSubtypeOf(ObjCObjectPointer()), isTrue);
243+
expect(parent.isSubtypeOf(ObjCObjectPointer()), isTrue);
244+
expect(ObjCObjectPointer().isSubtypeOf(parent), isFalse);
245+
246+
final block = makeBlock(voidType, []);
247+
expect(block.isSubtypeOf(ObjCObjectPointer()), isTrue);
248+
expect(ObjCObjectPointer().isSubtypeOf(block), isFalse);
249+
});
250+
251+
test('ObjCBlockPointer', () {
252+
expect(ObjCBlockPointer().isSubtypeOf(ObjCBlockPointer()), isTrue);
253+
expect(parent.isSubtypeOf(ObjCBlockPointer()), isFalse);
254+
expect(ObjCBlockPointer().isSubtypeOf(parent), isFalse);
255+
256+
final block = makeBlock(voidType, []);
257+
expect(block.isSubtypeOf(ObjCBlockPointer()), isTrue);
258+
expect(ObjCBlockPointer().isSubtypeOf(block), isFalse);
259+
});
240260
});
241261
}

pkgs/objective_c/lib/src/objective_c_bindings_generated.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,7 +2362,7 @@ class NSItemProvider extends NSObject {
23622362

23632363
/// setSuggestedName:
23642364
set suggestedName(NSString? value) {
2365-
return _objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setSuggestedName_,
2365+
_objc_msgSend_1jdvcbf(this.ref.pointer, _sel_setSuggestedName_,
23662366
value?.ref.pointer ?? ffi.nullptr);
23672367
}
23682368

@@ -3074,7 +3074,7 @@ class NSMutableData extends NSData {
30743074

30753075
/// setLength:
30763076
set length(int value) {
3077-
return _objc_msgSend_1i9r4xy(this.ref.pointer, _sel_setLength_, value);
3077+
_objc_msgSend_1i9r4xy(this.ref.pointer, _sel_setLength_, value);
30783078
}
30793079
}
30803080

@@ -6228,7 +6228,7 @@ class NSStream extends NSObject {
62286228

62296229
/// setDelegate:
62306230
set delegate(objc.ObjCObjectBase? value) {
6231-
return _objc_msgSend_1jdvcbf(
6231+
_objc_msgSend_1jdvcbf(
62326232
this.ref.pointer, _sel_setDelegate_, value?.ref.pointer ?? ffi.nullptr);
62336233
}
62346234

pkgs/swift2objc/lib/src/ast/declarations/built_in/built_in_declaration.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ enum BuiltInDeclaration implements Declaration, ObjCAnnotatable {
1010
swiftNSObject(id: 'c:objc(cs)NSObject', name: 'NSObject'),
1111
swiftString(id: 's:SS', name: 'String'),
1212
swiftInt(id: 's:Si', name: 'Int'),
13+
swiftFloat(id: 's:Sf', name: 'Float'),
1314
swiftDouble(id: 's:Sd', name: 'Double'),
1415
swiftBool(id: 's:Sb', name: 'Bool'),
1516
swiftVoid(id: 's:s4Voida', name: 'Void');
@@ -32,6 +33,7 @@ enum BuiltInDeclaration implements Declaration, ObjCAnnotatable {
3233
final objectType = BuiltInDeclaration.swiftNSObject.asDeclaredType;
3334
final stringType = BuiltInDeclaration.swiftString.asDeclaredType;
3435
final intType = BuiltInDeclaration.swiftInt.asDeclaredType;
36+
final floatType = BuiltInDeclaration.swiftFloat.asDeclaredType;
3537
final doubleType = BuiltInDeclaration.swiftDouble.asDeclaredType;
3638
final boolType = BuiltInDeclaration.swiftBool.asDeclaredType;
3739
final voidType = BuiltInDeclaration.swiftVoid.asDeclaredType;

pkgs/swift2objc/lib/src/config.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ class Config {
2222
/// Specify where the wrapper swift file will be output.
2323
final Uri outputFile;
2424

25-
/// Specify where the wrapper swift file will be output.
25+
/// Text inserted into the [outputFile] before the generated output.
2626
final String? preamble;
2727

2828
/// Specify where to output the intermidiate files (i.g the symbolgraph json).
2929
/// If this is null, a teemp directory will be generated in the system temp
3030
/// directory (using `Directory.systemTemp`) and then deleted.
3131
/// Specifying a temp directory would prevent the tool from deleting the
32-
/// intermediate files after generating the wrapper
32+
/// intermediate files after generating the wrapper.
3333
final Uri? tempDir;
3434

3535
const Config({
@@ -46,12 +46,12 @@ sealed class InputConfig {
4646
Command? get symbolgraphCommand;
4747
}
4848

49-
/// Used to generate a objc wrapper for one or more swift files
49+
/// Used to generate a objc wrapper for one or more swift files.
5050
class FilesInputConfig implements InputConfig {
51-
/// The swift file(s) to generate a wrapper for
51+
/// The swift file(s) to generate a wrapper for.
5252
final List<Uri> files;
5353

54-
/// The name of the module files generated by `swiftc in `tempDir`
54+
/// The name of the module files generated by `swiftc in `tempDir`.
5555
final String generatedModuleName;
5656

5757
FilesInputConfig({
@@ -74,17 +74,17 @@ class FilesInputConfig implements InputConfig {
7474
);
7575
}
7676

77-
/// Used to generate a objc wrapper for a built-in swift module
77+
/// Used to generate a objc wrapper for a built-in swift module.
7878
/// (e.g, AVFoundation)
7979
class ModuleInputConfig implements InputConfig {
80-
/// The swift module to generate a wrapper for
80+
/// The swift module to generate a wrapper for.
8181
final String module;
8282

83-
/// The target to generate code for
83+
/// The target to generate code for.
8484
/// (e.g `x86_64-apple-ios17.0-simulator`)
8585
final String target;
8686

87-
/// The sdk to compile against
87+
/// The sdk to compile against.
8888
/// (e.g `/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sd`)
8989
final Uri sdk;
9090

0 commit comments

Comments
 (0)