[ffigen] Refactor `sameFfiDartAndCType` to not require a `Writer` (#629)
diff --git a/pkgs/ffigen/lib/src/code_generator/compound.dart b/pkgs/ffigen/lib/src/code_generator/compound.dart index c3eb55e..ddc33c6 100644 --- a/pkgs/ffigen/lib/src/code_generator/compound.dart +++ b/pkgs/ffigen/lib/src/code_generator/compound.dart
@@ -145,7 +145,7 @@ s.write('${depth}external ${_getInlineArrayTypeString(m.type, w)} '); s.write('${m.name};\n\n'); } else { - if (!sameDartAndCType(m.type, w)) { + if (!m.type.sameFfiDartAndCType) { s.write('$depth@${m.type.getCType(w)}()\n'); } s.write('${depth}external ${m.type.getFfiDartType(w)} ${m.name};\n\n'); @@ -173,6 +173,9 @@ @override String getCType(Writer w) => name; + + @override + bool get sameFfiDartAndCType => true; } class Member {
diff --git a/pkgs/ffigen/lib/src/code_generator/enum_class.dart b/pkgs/ffigen/lib/src/code_generator/enum_class.dart index 70d142b..089d7ed 100644 --- a/pkgs/ffigen/lib/src/code_generator/enum_class.dart +++ b/pkgs/ffigen/lib/src/code_generator/enum_class.dart
@@ -87,6 +87,12 @@ String getFfiDartType(Writer w) => nativeType.getFfiDartType(w); @override + bool get sameFfiDartAndCType => nativeType.sameFfiDartAndCType; + + @override + bool get sameDartAndCType => nativeType.sameDartAndCType; + + @override String? getDefaultValue(Writer w, String nativeLib) => '0'; }
diff --git a/pkgs/ffigen/lib/src/code_generator/func_type.dart b/pkgs/ffigen/lib/src/code_generator/func_type.dart index 3ee17d5..e1d0793 100644 --- a/pkgs/ffigen/lib/src/code_generator/func_type.dart +++ b/pkgs/ffigen/lib/src/code_generator/func_type.dart
@@ -82,6 +82,18 @@ } @override + bool get sameFfiDartAndCType => + returnType.sameFfiDartAndCType && + parameters.every((p) => p.type.sameFfiDartAndCType) && + varArgParameters.every((p) => p.type.sameFfiDartAndCType); + + @override + bool get sameDartAndCType => + returnType.sameDartAndCType && + parameters.every((p) => p.type.sameDartAndCType) && + varArgParameters.every((p) => p.type.sameDartAndCType); + + @override String toString() => _getCacheKeyString(false, (Type t) => t.toString()); @override @@ -140,6 +152,9 @@ String getFfiDartType(Writer w) => getCType(w); @override + bool get sameFfiDartAndCType => true; + + @override String toString() => 'NativeFunction<${_type.toString()}>'; @override
diff --git a/pkgs/ffigen/lib/src/code_generator/handle.dart b/pkgs/ffigen/lib/src/code_generator/handle.dart index c3817f2..aaa0649 100644 --- a/pkgs/ffigen/lib/src/code_generator/handle.dart +++ b/pkgs/ffigen/lib/src/code_generator/handle.dart
@@ -19,5 +19,8 @@ String getFfiDartType(Writer w) => 'Object'; @override + bool get sameFfiDartAndCType => false; + + @override String toString() => 'Handle'; }
diff --git a/pkgs/ffigen/lib/src/code_generator/imports.dart b/pkgs/ffigen/lib/src/code_generator/imports.dart index f75a267..e9dda1c 100644 --- a/pkgs/ffigen/lib/src/code_generator/imports.dart +++ b/pkgs/ffigen/lib/src/code_generator/imports.dart
@@ -43,6 +43,9 @@ String getFfiDartType(Writer w) => cType == dartType ? getCType(w) : dartType; @override + bool get sameFfiDartAndCType => cType == dartType; + + @override String toString() => '${libraryImport.name}.$cType'; @override @@ -65,6 +68,9 @@ String getFfiDartType(Writer w) => dartType; @override + bool get sameFfiDartAndCType => cType == dartType; + + @override String toString() => cType; }
diff --git a/pkgs/ffigen/lib/src/code_generator/native_type.dart b/pkgs/ffigen/lib/src/code_generator/native_type.dart index 19425ba..93ed356 100644 --- a/pkgs/ffigen/lib/src/code_generator/native_type.dart +++ b/pkgs/ffigen/lib/src/code_generator/native_type.dart
@@ -57,6 +57,9 @@ String getFfiDartType(Writer w) => _dartType; @override + bool get sameFfiDartAndCType => _cType == _dartType; + + @override String toString() => _cType; @override
diff --git a/pkgs/ffigen/lib/src/code_generator/objc_block.dart b/pkgs/ffigen/lib/src/code_generator/objc_block.dart index 4c82a91..e908abb 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_block.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_block.dart
@@ -226,5 +226,11 @@ String getDartType(Writer w) => name; @override + bool get sameFfiDartAndCType => true; + + @override + bool get sameDartAndCType => false; + + @override String toString() => '($returnType (^)(${argTypes.join(', ')}))'; }
diff --git a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart index 325692a..421a508 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart
@@ -389,6 +389,12 @@ @override String getDartType(Writer w) => name; + @override + bool get sameFfiDartAndCType => true; + + @override + bool get sameDartAndCType => false; + // Utils for converting between the internal types passed to native code, and // the external types visible to the user. For example, ObjCInterfaces are // passed to native as Pointer<ObjCObject>, but the user sees the Dart wrapper
diff --git a/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart b/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart index 2b08082..db57e5f 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart
@@ -39,6 +39,12 @@ String getDartType(Writer w) => '${child.getDartType(w)}?'; @override + bool get sameFfiDartAndCType => child.sameFfiDartAndCType; + + @override + bool get sameDartAndCType => false; + + @override String toString() => '$child?'; @override
diff --git a/pkgs/ffigen/lib/src/code_generator/pointer.dart b/pkgs/ffigen/lib/src/code_generator/pointer.dart index f99ee53..7dfc7d6 100644 --- a/pkgs/ffigen/lib/src/code_generator/pointer.dart +++ b/pkgs/ffigen/lib/src/code_generator/pointer.dart
@@ -31,6 +31,10 @@ String getCType(Writer w) => '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>'; + // Both the C type and the FFI Dart type are 'Pointer<$cType>'. + @override + bool get sameFfiDartAndCType => true; + @override String toString() => '$child*'; @@ -79,4 +83,7 @@ @override String getDartType(Writer w) => 'NSObject'; + + @override + bool get sameDartAndCType => false; }
diff --git a/pkgs/ffigen/lib/src/code_generator/type.dart b/pkgs/ffigen/lib/src/code_generator/type.dart index 1a69b60..6537a85 100644 --- a/pkgs/ffigen/lib/src/code_generator/type.dart +++ b/pkgs/ffigen/lib/src/code_generator/type.dart
@@ -48,6 +48,12 @@ /// as getFfiDartType. For ObjC bindings this refers to the wrapper object. String getDartType(Writer w) => getFfiDartType(w); + /// Returns whether the FFI dart type and C type string are same. + bool get sameFfiDartAndCType; + + /// Returns whether the dart type and C type string are same. + bool get sameDartAndCType => sameFfiDartAndCType; + /// Returns the string representation of the Type, for debugging purposes /// only. This string should not be printed as generated code. @override @@ -66,9 +72,6 @@ String? getDefaultValue(Writer w, String nativeLib) => null; } -/// Function to check if the dart and C type string are same. -bool sameDartAndCType(Type t, Writer w) => t.getCType(w) == t.getFfiDartType(w); - /// Base class for all Type bindings. /// /// Since Dart doesn't have multiple inheritance, this type exists so that we @@ -108,6 +111,9 @@ String getDartType(Writer w) => getFfiDartType(w); @override + bool get sameDartAndCType => sameFfiDartAndCType; + + @override String toString() => originalName; @override @@ -125,4 +131,7 @@ @override String toString() => '(Unimplemented: $reason)'; + + @override + bool get sameFfiDartAndCType => true; }
diff --git a/pkgs/ffigen/lib/src/code_generator/typealias.dart b/pkgs/ffigen/lib/src/code_generator/typealias.dart index 469a40b..5c5cc44 100644 --- a/pkgs/ffigen/lib/src/code_generator/typealias.dart +++ b/pkgs/ffigen/lib/src/code_generator/typealias.dart
@@ -121,7 +121,7 @@ String getFfiDartType(Writer w) { // Typealias cannot be used by name in Dart types unless both the C and Dart // type of the underlying types are same. - if (sameDartAndCType(type, w)) { + if (type.sameFfiDartAndCType) { return name; } else { return type.getFfiDartType(w); @@ -129,6 +129,12 @@ } @override + bool get sameFfiDartAndCType => type.sameFfiDartAndCType; + + @override + bool get sameDartAndCType => type.sameDartAndCType; + + @override String cacheKey() => type.cacheKey(); @override