[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