diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml
index c4f98d2..1026834 100644
--- a/.github/workflows/test-package.yml
+++ b/.github/workflows/test-package.yml
@@ -20,7 +20,7 @@
     strategy:
       fail-fast: false
       matrix:
-        sdk: [stable]
+        sdk: [beta] # TODO(127):Revert to stable when null safety reaches stable branch.
     steps:
       - uses: actions/checkout@v2
       - uses: dart-lang/setup-dart@v0.1
@@ -33,30 +33,30 @@
         run: dart format --output=none --set-exit-if-changed .
         if: always() && steps.install.outcome == 'success'
       - name: Analyze code
-        run: dart analyze --fatal-infos
+        run: dart analyze # --fatal-infos # Removed till we stop using legacy libraries.
         if: always() && steps.install.outcome == 'success'
 
   test:
     needs: analyze
     # This job requires clang-10 which is the default on 20.04
-    runs-on: ubuntu-20.04 
+    runs-on: ubuntu-20.04
     steps:
       - uses: actions/checkout@v2
       - uses: dart-lang/setup-dart@v0.1
         with:
-          channel: stable
+          channel: beta # TODO(127):Revert to stable when null safety reaches stable branch.
       - name: Install dependencies
-        run: dart pub get  
+        run: dart pub get
       - name: Install libclang-10-dev
         run: sudo apt-get install libclang-10-dev
       - name: Setup ffigen
-        run: dart pub run ffigen:setup
+        run: dart --no-sound-null-safety run ffigen:setup
       - name: Build test dylib
         run: cd test/native_test && dart build_test_dylib.dart && cd ../..
       - name: Run VM tests
-        run: dart test --platform vm
+        run: dart --no-sound-null-safety test --platform vm
       - name: Collect coverage
-        run: ./tool/travis.sh
+        run: ./tool/coverage.sh
       - name: Upload coverage
         uses: coverallsapp/github-action@v1.1.2
         with:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a919a1a..2697d97 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 2.0.0-nullsafety.0
+- Migrated to (unsound) null safety.
+
 # 1.2.0
 - Added support for `Dart_Handle` from `dart_api.h`.
 
diff --git a/README.md b/README.md
index 625acd2..3b56033 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,9 @@
 Experimental binding generator for [FFI](https://dart.dev/guides/libraries/c-interop)
 bindings.
 
+<!-- TODO: Remove this when package can run with sound null safety -->
+> Due to a few unmigrated dependencies, ffigen currently runs in unsound null safety, run using `dart --no-sound-null-safety run ffigen`.
+
 ## Example
 
 For some header file _example.h_:
@@ -27,19 +30,19 @@
   NativeLibrary(DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
 
   int sum(int a, int b) {
-    _sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum');
-    return _sum(a, b);
+    return (_sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum'))(a, b);
   }
-  _dart_sum _sum;;
+
+  _dart_sum? _sum;
 }
-typedef _c_sum = ffi.Int32 Function(Int32 a, Int32 b);
-typedef _dart_sum = int Function(int a,int b);
+typedef _c_sum = Int32 Function(Int32 a, Int32 b);
+typedef _dart_sum = int Function(int a, int b);
 ```
 ## Using this package
 - Add `ffigen` under `dev_dependencies` in your `pubspec.yaml`.
 - Setup for use (see [Setup](#Setup)).
 - Configurations must be provided in `pubspec.yaml` or in a custom YAML file (see [configurations](#configurations)).
-- Run the tool- `pub run ffigen`.
+- Run the tool- `dart run ffigen`.
 
 Jump to [FAQ](#faq).
 
@@ -312,11 +315,11 @@
 ```dart
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Uint64()
-  int _unique_data_item_0;
+  external int _unique_data_item_0;
   @ffi.Uint64()
-  int _unique_data_item_1;
+  external int _unique_data_item_1;
   @ffi.Uint64()
-  int _unique_data_item_2;
+  external int _unique_data_item_2;
 
   /// Helper for array `data`.
   ArrayHelper_CXFileUniqueID_data_level0 get data =>
diff --git a/bin/ffigen.dart b/bin/ffigen.dart
index a49040d..82abac5 100644
--- a/bin/ffigen.dart
+++ b/bin/ffigen.dart
@@ -56,8 +56,8 @@
   // Generate file for the parsed bindings.
   final gen = File(config.output);
   library.generateFile(gen);
-  _logger.info(
-      successPen('Finished, Bindings generated in ${gen?.absolute?.path}'));
+  _logger
+      .info(successPen('Finished, Bindings generated in ${gen.absolute.path}'));
 }
 
 Config getConfig(ArgResults result) {
@@ -87,7 +87,7 @@
 
   // Throws a [YamlException] if it's unable to parse the Yaml.
   final bindingsConfigMap =
-      yaml.loadYaml(pubspecFile.readAsStringSync())[configKey] as yaml.YamlMap;
+      yaml.loadYaml(pubspecFile.readAsStringSync())[configKey] as yaml.YamlMap?;
 
   if (bindingsConfigMap == null) {
     _logger.severe("Couldn't find an entry for '$configKey' in $pubspecName.");
@@ -161,7 +161,7 @@
 /// Sets up the logging level and printing.
 void setupLogger(ArgResults result) {
   if (result.wasParsed('verbose')) {
-    switch (result['verbose'] as String) {
+    switch (result['verbose'] as String?) {
       case 'all':
         // Logs everything, the entire AST touched by our parser.
         Logger.root.level = Level.ALL;
diff --git a/bin/setup.dart b/bin/setup.dart
index 4c7517d..edc79e2 100644
--- a/bin/setup.dart
+++ b/bin/setup.dart
@@ -26,53 +26,46 @@
 
 import 'dart:io';
 import 'package:args/args.dart';
-import 'package:meta/meta.dart';
 import 'package:ffigen/src/find_resource.dart';
 import 'package:ffigen/src/strings.dart' as strings;
 import 'package:path/path.dart' as path;
 
-const _macOS = 'macos';
-const _windows = 'windows';
-const _linux = 'linux';
-
 /// Default platform options.
-Map<String, _Options> _platformOptions = {
-  _linux: _Options(
-    sharedFlag: '-shared',
-    inputHeader: _getWrapperPath('wrapper.c'),
-    fPIC: '-fpic',
-    ldLibFlag: '-lclang',
-    headerIncludes: [
-      '-I/usr/lib/llvm-9/include/',
-      '-I/usr/lib/llvm-10/include/',
-    ],
-  ),
-  _windows: _Options(
-    sharedFlag: '-shared',
-    inputHeader: _getWrapperPath('wrapper.c'),
-    moduleDefPath: '-Wl,/DEF:${_getWrapperPath("wrapper.def")}',
-    ldLibFlag: '-llibclang',
-    headerIncludes: [
-      r'-IC:\Progra~1\LLVM\include',
-    ],
-    libIncludes: [
-      r'-LC:\Progra~1\LLVM\lib',
-    ],
-  ),
-  _macOS: _Options(
-    sharedFlag: '-shared',
-    inputHeader: _getWrapperPath('wrapper.c'),
-    fPIC: '-fpic',
-    ldLibFlag: '-lclang',
-    headerIncludes: [
-      '-I/usr/local/opt/llvm/include/',
-      '-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/',
-    ],
-    libIncludes: [
-      '-L/usr/local/opt/llvm/lib/',
-    ],
-  ),
-};
+final _linuxOpts = _Options(
+  sharedFlag: '-shared',
+  inputHeader: _getWrapperPath('wrapper.c'),
+  fPIC: '-fpic',
+  ldLibFlag: '-lclang',
+  headerIncludes: [
+    '-I/usr/lib/llvm-9/include/',
+    '-I/usr/lib/llvm-10/include/',
+  ],
+);
+final _windowsOpts = _Options(
+  sharedFlag: '-shared',
+  inputHeader: _getWrapperPath('wrapper.c'),
+  moduleDefPath: '-Wl,/DEF:${_getWrapperPath("wrapper.def")}',
+  ldLibFlag: '-llibclang',
+  headerIncludes: [
+    r'-IC:\Progra~1\LLVM\include',
+  ],
+  libIncludes: [
+    r'-LC:\Progra~1\LLVM\lib',
+  ],
+);
+final _macOSOpts = _Options(
+  sharedFlag: '-shared',
+  inputHeader: _getWrapperPath('wrapper.c'),
+  fPIC: '-fpic',
+  ldLibFlag: '-lclang',
+  headerIncludes: [
+    '-I/usr/local/opt/llvm/include/',
+    '-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/',
+  ],
+  libIncludes: [
+    '-L/usr/local/opt/llvm/lib/',
+  ],
+);
 
 /// If main is called directly we always re-create the dynamic library.
 void main(List<String> arguments) {
@@ -140,7 +133,7 @@
 ///
 /// Throws error if not found.
 String _getWrapperPath(String wrapperName) {
-  final file = File.fromUri(findWrapper(wrapperName));
+  final file = File.fromUri(findWrapper(wrapperName)!);
   if (file.existsSync()) {
     return file.absolute.path;
   } else {
@@ -237,11 +230,11 @@
 /// Get options based on current platform.
 _Options _getPlatformOptions() {
   if (Platform.isMacOS) {
-    return _platformOptions[_macOS];
+    return _macOSOpts;
   } else if (Platform.isWindows) {
-    return _platformOptions[_windows];
+    return _windowsOpts;
   } else if (Platform.isLinux) {
-    return _platformOptions[_linux];
+    return _linuxOpts;
   } else {
     throw Exception('Unknown Platform.');
   }
@@ -271,9 +264,9 @@
   final String ldLibFlag;
 
   _Options({
-    @required this.sharedFlag,
-    @required this.inputHeader,
-    @required this.ldLibFlag,
+    required this.sharedFlag,
+    required this.inputHeader,
+    required this.ldLibFlag,
     this.headerIncludes = const [],
     this.libIncludes = const [],
     this.fPIC = '',
diff --git a/example/c_json/cjson_generated_bindings.dart b/example/c_json/cjson_generated_bindings.dart
index ada20c0..f71f586 100644
--- a/example/c_json/cjson_generated_bindings.dart
+++ b/example/c_json/cjson_generated_bindings.dart
@@ -32,93 +32,90 @@
   CJson(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
 
   ffi.Pointer<ffi.Int8> cJSON_Version() {
-    _cJSON_Version ??= _dylib
-        .lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>('cJSON_Version');
-    return _cJSON_Version();
+    return (_cJSON_Version ??=
+        _dylib.lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>(
+            'cJSON_Version'))();
   }
 
-  _dart_cJSON_Version _cJSON_Version;
+  _dart_cJSON_Version? _cJSON_Version;
 
   void cJSON_InitHooks(
     ffi.Pointer<cJSON_Hooks> hooks,
   ) {
-    _cJSON_InitHooks ??=
+    return (_cJSON_InitHooks ??=
         _dylib.lookupFunction<_c_cJSON_InitHooks, _dart_cJSON_InitHooks>(
-            'cJSON_InitHooks');
-    return _cJSON_InitHooks(
+            'cJSON_InitHooks'))(
       hooks,
     );
   }
 
-  _dart_cJSON_InitHooks _cJSON_InitHooks;
+  _dart_cJSON_InitHooks? _cJSON_InitHooks;
 
   ffi.Pointer<cJSON> cJSON_Parse(
     ffi.Pointer<ffi.Int8> value,
   ) {
-    _cJSON_Parse ??=
-        _dylib.lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse');
-    return _cJSON_Parse(
+    return (_cJSON_Parse ??= _dylib
+        .lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse'))(
       value,
     );
   }
 
-  _dart_cJSON_Parse _cJSON_Parse;
+  _dart_cJSON_Parse? _cJSON_Parse;
 
   ffi.Pointer<cJSON> cJSON_ParseWithOpts(
     ffi.Pointer<ffi.Int8> value,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
     int require_null_terminated,
   ) {
-    _cJSON_ParseWithOpts ??= _dylib.lookupFunction<_c_cJSON_ParseWithOpts,
-        _dart_cJSON_ParseWithOpts>('cJSON_ParseWithOpts');
-    return _cJSON_ParseWithOpts(
+    return (_cJSON_ParseWithOpts ??= _dylib.lookupFunction<
+        _c_cJSON_ParseWithOpts,
+        _dart_cJSON_ParseWithOpts>('cJSON_ParseWithOpts'))(
       value,
       return_parse_end,
       require_null_terminated,
     );
   }
 
-  _dart_cJSON_ParseWithOpts _cJSON_ParseWithOpts;
+  _dart_cJSON_ParseWithOpts? _cJSON_ParseWithOpts;
 
   ffi.Pointer<ffi.Int8> cJSON_Print(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_Print ??=
-        _dylib.lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print');
-    return _cJSON_Print(
+    return (_cJSON_Print ??= _dylib
+        .lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print'))(
       item,
     );
   }
 
-  _dart_cJSON_Print _cJSON_Print;
+  _dart_cJSON_Print? _cJSON_Print;
 
   ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_PrintUnformatted ??= _dylib.lookupFunction<_c_cJSON_PrintUnformatted,
-        _dart_cJSON_PrintUnformatted>('cJSON_PrintUnformatted');
-    return _cJSON_PrintUnformatted(
+    return (_cJSON_PrintUnformatted ??= _dylib.lookupFunction<
+        _c_cJSON_PrintUnformatted,
+        _dart_cJSON_PrintUnformatted>('cJSON_PrintUnformatted'))(
       item,
     );
   }
 
-  _dart_cJSON_PrintUnformatted _cJSON_PrintUnformatted;
+  _dart_cJSON_PrintUnformatted? _cJSON_PrintUnformatted;
 
   ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
     ffi.Pointer<cJSON> item,
     int prebuffer,
     int fmt,
   ) {
-    _cJSON_PrintBuffered ??= _dylib.lookupFunction<_c_cJSON_PrintBuffered,
-        _dart_cJSON_PrintBuffered>('cJSON_PrintBuffered');
-    return _cJSON_PrintBuffered(
+    return (_cJSON_PrintBuffered ??= _dylib.lookupFunction<
+        _c_cJSON_PrintBuffered,
+        _dart_cJSON_PrintBuffered>('cJSON_PrintBuffered'))(
       item,
       prebuffer,
       fmt,
     );
   }
 
-  _dart_cJSON_PrintBuffered _cJSON_PrintBuffered;
+  _dart_cJSON_PrintBuffered? _cJSON_PrintBuffered;
 
   int cJSON_PrintPreallocated(
     ffi.Pointer<cJSON> item,
@@ -126,10 +123,9 @@
     int length,
     int format,
   ) {
-    _cJSON_PrintPreallocated ??= _dylib.lookupFunction<
+    return (_cJSON_PrintPreallocated ??= _dylib.lookupFunction<
         _c_cJSON_PrintPreallocated,
-        _dart_cJSON_PrintPreallocated>('cJSON_PrintPreallocated');
-    return _cJSON_PrintPreallocated(
+        _dart_cJSON_PrintPreallocated>('cJSON_PrintPreallocated'))(
       item,
       buffer,
       length,
@@ -137,617 +133,581 @@
     );
   }
 
-  _dart_cJSON_PrintPreallocated _cJSON_PrintPreallocated;
+  _dart_cJSON_PrintPreallocated? _cJSON_PrintPreallocated;
 
   void cJSON_Delete(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_Delete ??= _dylib
-        .lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete');
-    return _cJSON_Delete(
+    return (_cJSON_Delete ??= _dylib
+        .lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete'))(
       item,
     );
   }
 
-  _dart_cJSON_Delete _cJSON_Delete;
+  _dart_cJSON_Delete? _cJSON_Delete;
 
   int cJSON_GetArraySize(
     ffi.Pointer<cJSON> array,
   ) {
-    _cJSON_GetArraySize ??=
+    return (_cJSON_GetArraySize ??=
         _dylib.lookupFunction<_c_cJSON_GetArraySize, _dart_cJSON_GetArraySize>(
-            'cJSON_GetArraySize');
-    return _cJSON_GetArraySize(
+            'cJSON_GetArraySize'))(
       array,
     );
   }
 
-  _dart_cJSON_GetArraySize _cJSON_GetArraySize;
+  _dart_cJSON_GetArraySize? _cJSON_GetArraySize;
 
   ffi.Pointer<cJSON> cJSON_GetArrayItem(
     ffi.Pointer<cJSON> array,
     int index,
   ) {
-    _cJSON_GetArrayItem ??=
+    return (_cJSON_GetArrayItem ??=
         _dylib.lookupFunction<_c_cJSON_GetArrayItem, _dart_cJSON_GetArrayItem>(
-            'cJSON_GetArrayItem');
-    return _cJSON_GetArrayItem(
+            'cJSON_GetArrayItem'))(
       array,
       index,
     );
   }
 
-  _dart_cJSON_GetArrayItem _cJSON_GetArrayItem;
+  _dart_cJSON_GetArrayItem? _cJSON_GetArrayItem;
 
   ffi.Pointer<cJSON> cJSON_GetObjectItem(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_GetObjectItem ??= _dylib.lookupFunction<_c_cJSON_GetObjectItem,
-        _dart_cJSON_GetObjectItem>('cJSON_GetObjectItem');
-    return _cJSON_GetObjectItem(
+    return (_cJSON_GetObjectItem ??= _dylib.lookupFunction<
+        _c_cJSON_GetObjectItem,
+        _dart_cJSON_GetObjectItem>('cJSON_GetObjectItem'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_GetObjectItem _cJSON_GetObjectItem;
+  _dart_cJSON_GetObjectItem? _cJSON_GetObjectItem;
 
   ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_GetObjectItemCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_GetObjectItemCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_GetObjectItemCaseSensitive,
             _dart_cJSON_GetObjectItemCaseSensitive>(
-        'cJSON_GetObjectItemCaseSensitive');
-    return _cJSON_GetObjectItemCaseSensitive(
+        'cJSON_GetObjectItemCaseSensitive'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_GetObjectItemCaseSensitive _cJSON_GetObjectItemCaseSensitive;
+  _dart_cJSON_GetObjectItemCaseSensitive? _cJSON_GetObjectItemCaseSensitive;
 
   int cJSON_HasObjectItem(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_HasObjectItem ??= _dylib.lookupFunction<_c_cJSON_HasObjectItem,
-        _dart_cJSON_HasObjectItem>('cJSON_HasObjectItem');
-    return _cJSON_HasObjectItem(
+    return (_cJSON_HasObjectItem ??= _dylib.lookupFunction<
+        _c_cJSON_HasObjectItem,
+        _dart_cJSON_HasObjectItem>('cJSON_HasObjectItem'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_HasObjectItem _cJSON_HasObjectItem;
+  _dart_cJSON_HasObjectItem? _cJSON_HasObjectItem;
 
   ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
-    _cJSON_GetErrorPtr ??=
+    return (_cJSON_GetErrorPtr ??=
         _dylib.lookupFunction<_c_cJSON_GetErrorPtr, _dart_cJSON_GetErrorPtr>(
-            'cJSON_GetErrorPtr');
-    return _cJSON_GetErrorPtr();
+            'cJSON_GetErrorPtr'))();
   }
 
-  _dart_cJSON_GetErrorPtr _cJSON_GetErrorPtr;
+  _dart_cJSON_GetErrorPtr? _cJSON_GetErrorPtr;
 
   ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_GetStringValue ??= _dylib.lookupFunction<_c_cJSON_GetStringValue,
-        _dart_cJSON_GetStringValue>('cJSON_GetStringValue');
-    return _cJSON_GetStringValue(
+    return (_cJSON_GetStringValue ??= _dylib.lookupFunction<
+        _c_cJSON_GetStringValue,
+        _dart_cJSON_GetStringValue>('cJSON_GetStringValue'))(
       item,
     );
   }
 
-  _dart_cJSON_GetStringValue _cJSON_GetStringValue;
+  _dart_cJSON_GetStringValue? _cJSON_GetStringValue;
 
   int cJSON_IsInvalid(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsInvalid ??=
+    return (_cJSON_IsInvalid ??=
         _dylib.lookupFunction<_c_cJSON_IsInvalid, _dart_cJSON_IsInvalid>(
-            'cJSON_IsInvalid');
-    return _cJSON_IsInvalid(
+            'cJSON_IsInvalid'))(
       item,
     );
   }
 
-  _dart_cJSON_IsInvalid _cJSON_IsInvalid;
+  _dart_cJSON_IsInvalid? _cJSON_IsInvalid;
 
   int cJSON_IsFalse(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsFalse ??= _dylib
-        .lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>('cJSON_IsFalse');
-    return _cJSON_IsFalse(
+    return (_cJSON_IsFalse ??=
+        _dylib.lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>(
+            'cJSON_IsFalse'))(
       item,
     );
   }
 
-  _dart_cJSON_IsFalse _cJSON_IsFalse;
+  _dart_cJSON_IsFalse? _cJSON_IsFalse;
 
   int cJSON_IsTrue(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsTrue ??= _dylib
-        .lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue');
-    return _cJSON_IsTrue(
+    return (_cJSON_IsTrue ??= _dylib
+        .lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue'))(
       item,
     );
   }
 
-  _dart_cJSON_IsTrue _cJSON_IsTrue;
+  _dart_cJSON_IsTrue? _cJSON_IsTrue;
 
   int cJSON_IsBool(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsBool ??= _dylib
-        .lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool');
-    return _cJSON_IsBool(
+    return (_cJSON_IsBool ??= _dylib
+        .lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool'))(
       item,
     );
   }
 
-  _dart_cJSON_IsBool _cJSON_IsBool;
+  _dart_cJSON_IsBool? _cJSON_IsBool;
 
   int cJSON_IsNull(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsNull ??= _dylib
-        .lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull');
-    return _cJSON_IsNull(
+    return (_cJSON_IsNull ??= _dylib
+        .lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull'))(
       item,
     );
   }
 
-  _dart_cJSON_IsNull _cJSON_IsNull;
+  _dart_cJSON_IsNull? _cJSON_IsNull;
 
   int cJSON_IsNumber(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsNumber ??=
+    return (_cJSON_IsNumber ??=
         _dylib.lookupFunction<_c_cJSON_IsNumber, _dart_cJSON_IsNumber>(
-            'cJSON_IsNumber');
-    return _cJSON_IsNumber(
+            'cJSON_IsNumber'))(
       item,
     );
   }
 
-  _dart_cJSON_IsNumber _cJSON_IsNumber;
+  _dart_cJSON_IsNumber? _cJSON_IsNumber;
 
   int cJSON_IsString(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsString ??=
+    return (_cJSON_IsString ??=
         _dylib.lookupFunction<_c_cJSON_IsString, _dart_cJSON_IsString>(
-            'cJSON_IsString');
-    return _cJSON_IsString(
+            'cJSON_IsString'))(
       item,
     );
   }
 
-  _dart_cJSON_IsString _cJSON_IsString;
+  _dart_cJSON_IsString? _cJSON_IsString;
 
   int cJSON_IsArray(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsArray ??= _dylib
-        .lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>('cJSON_IsArray');
-    return _cJSON_IsArray(
+    return (_cJSON_IsArray ??=
+        _dylib.lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>(
+            'cJSON_IsArray'))(
       item,
     );
   }
 
-  _dart_cJSON_IsArray _cJSON_IsArray;
+  _dart_cJSON_IsArray? _cJSON_IsArray;
 
   int cJSON_IsObject(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsObject ??=
+    return (_cJSON_IsObject ??=
         _dylib.lookupFunction<_c_cJSON_IsObject, _dart_cJSON_IsObject>(
-            'cJSON_IsObject');
-    return _cJSON_IsObject(
+            'cJSON_IsObject'))(
       item,
     );
   }
 
-  _dart_cJSON_IsObject _cJSON_IsObject;
+  _dart_cJSON_IsObject? _cJSON_IsObject;
 
   int cJSON_IsRaw(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsRaw ??=
-        _dylib.lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw');
-    return _cJSON_IsRaw(
+    return (_cJSON_IsRaw ??= _dylib
+        .lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw'))(
       item,
     );
   }
 
-  _dart_cJSON_IsRaw _cJSON_IsRaw;
+  _dart_cJSON_IsRaw? _cJSON_IsRaw;
 
   ffi.Pointer<cJSON> cJSON_CreateNull() {
-    _cJSON_CreateNull ??=
+    return (_cJSON_CreateNull ??=
         _dylib.lookupFunction<_c_cJSON_CreateNull, _dart_cJSON_CreateNull>(
-            'cJSON_CreateNull');
-    return _cJSON_CreateNull();
+            'cJSON_CreateNull'))();
   }
 
-  _dart_cJSON_CreateNull _cJSON_CreateNull;
+  _dart_cJSON_CreateNull? _cJSON_CreateNull;
 
   ffi.Pointer<cJSON> cJSON_CreateTrue() {
-    _cJSON_CreateTrue ??=
+    return (_cJSON_CreateTrue ??=
         _dylib.lookupFunction<_c_cJSON_CreateTrue, _dart_cJSON_CreateTrue>(
-            'cJSON_CreateTrue');
-    return _cJSON_CreateTrue();
+            'cJSON_CreateTrue'))();
   }
 
-  _dart_cJSON_CreateTrue _cJSON_CreateTrue;
+  _dart_cJSON_CreateTrue? _cJSON_CreateTrue;
 
   ffi.Pointer<cJSON> cJSON_CreateFalse() {
-    _cJSON_CreateFalse ??=
+    return (_cJSON_CreateFalse ??=
         _dylib.lookupFunction<_c_cJSON_CreateFalse, _dart_cJSON_CreateFalse>(
-            'cJSON_CreateFalse');
-    return _cJSON_CreateFalse();
+            'cJSON_CreateFalse'))();
   }
 
-  _dart_cJSON_CreateFalse _cJSON_CreateFalse;
+  _dart_cJSON_CreateFalse? _cJSON_CreateFalse;
 
   ffi.Pointer<cJSON> cJSON_CreateBool(
     int boolean,
   ) {
-    _cJSON_CreateBool ??=
+    return (_cJSON_CreateBool ??=
         _dylib.lookupFunction<_c_cJSON_CreateBool, _dart_cJSON_CreateBool>(
-            'cJSON_CreateBool');
-    return _cJSON_CreateBool(
+            'cJSON_CreateBool'))(
       boolean,
     );
   }
 
-  _dart_cJSON_CreateBool _cJSON_CreateBool;
+  _dart_cJSON_CreateBool? _cJSON_CreateBool;
 
   ffi.Pointer<cJSON> cJSON_CreateNumber(
     double num,
   ) {
-    _cJSON_CreateNumber ??=
+    return (_cJSON_CreateNumber ??=
         _dylib.lookupFunction<_c_cJSON_CreateNumber, _dart_cJSON_CreateNumber>(
-            'cJSON_CreateNumber');
-    return _cJSON_CreateNumber(
+            'cJSON_CreateNumber'))(
       num,
     );
   }
 
-  _dart_cJSON_CreateNumber _cJSON_CreateNumber;
+  _dart_cJSON_CreateNumber? _cJSON_CreateNumber;
 
   ffi.Pointer<cJSON> cJSON_CreateString(
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_CreateString ??=
+    return (_cJSON_CreateString ??=
         _dylib.lookupFunction<_c_cJSON_CreateString, _dart_cJSON_CreateString>(
-            'cJSON_CreateString');
-    return _cJSON_CreateString(
+            'cJSON_CreateString'))(
       string,
     );
   }
 
-  _dart_cJSON_CreateString _cJSON_CreateString;
+  _dart_cJSON_CreateString? _cJSON_CreateString;
 
   ffi.Pointer<cJSON> cJSON_CreateRaw(
     ffi.Pointer<ffi.Int8> raw,
   ) {
-    _cJSON_CreateRaw ??=
+    return (_cJSON_CreateRaw ??=
         _dylib.lookupFunction<_c_cJSON_CreateRaw, _dart_cJSON_CreateRaw>(
-            'cJSON_CreateRaw');
-    return _cJSON_CreateRaw(
+            'cJSON_CreateRaw'))(
       raw,
     );
   }
 
-  _dart_cJSON_CreateRaw _cJSON_CreateRaw;
+  _dart_cJSON_CreateRaw? _cJSON_CreateRaw;
 
   ffi.Pointer<cJSON> cJSON_CreateArray() {
-    _cJSON_CreateArray ??=
+    return (_cJSON_CreateArray ??=
         _dylib.lookupFunction<_c_cJSON_CreateArray, _dart_cJSON_CreateArray>(
-            'cJSON_CreateArray');
-    return _cJSON_CreateArray();
+            'cJSON_CreateArray'))();
   }
 
-  _dart_cJSON_CreateArray _cJSON_CreateArray;
+  _dart_cJSON_CreateArray? _cJSON_CreateArray;
 
   ffi.Pointer<cJSON> cJSON_CreateObject() {
-    _cJSON_CreateObject ??=
+    return (_cJSON_CreateObject ??=
         _dylib.lookupFunction<_c_cJSON_CreateObject, _dart_cJSON_CreateObject>(
-            'cJSON_CreateObject');
-    return _cJSON_CreateObject();
+            'cJSON_CreateObject'))();
   }
 
-  _dart_cJSON_CreateObject _cJSON_CreateObject;
+  _dart_cJSON_CreateObject? _cJSON_CreateObject;
 
   ffi.Pointer<cJSON> cJSON_CreateStringReference(
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_CreateStringReference ??= _dylib.lookupFunction<
+    return (_cJSON_CreateStringReference ??= _dylib.lookupFunction<
         _c_cJSON_CreateStringReference,
-        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference');
-    return _cJSON_CreateStringReference(
+        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference'))(
       string,
     );
   }
 
-  _dart_cJSON_CreateStringReference _cJSON_CreateStringReference;
+  _dart_cJSON_CreateStringReference? _cJSON_CreateStringReference;
 
   ffi.Pointer<cJSON> cJSON_CreateObjectReference(
     ffi.Pointer<cJSON> child,
   ) {
-    _cJSON_CreateObjectReference ??= _dylib.lookupFunction<
+    return (_cJSON_CreateObjectReference ??= _dylib.lookupFunction<
         _c_cJSON_CreateObjectReference,
-        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference');
-    return _cJSON_CreateObjectReference(
+        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference'))(
       child,
     );
   }
 
-  _dart_cJSON_CreateObjectReference _cJSON_CreateObjectReference;
+  _dart_cJSON_CreateObjectReference? _cJSON_CreateObjectReference;
 
   ffi.Pointer<cJSON> cJSON_CreateArrayReference(
     ffi.Pointer<cJSON> child,
   ) {
-    _cJSON_CreateArrayReference ??= _dylib.lookupFunction<
+    return (_cJSON_CreateArrayReference ??= _dylib.lookupFunction<
         _c_cJSON_CreateArrayReference,
-        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference');
-    return _cJSON_CreateArrayReference(
+        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference'))(
       child,
     );
   }
 
-  _dart_cJSON_CreateArrayReference _cJSON_CreateArrayReference;
+  _dart_cJSON_CreateArrayReference? _cJSON_CreateArrayReference;
 
   ffi.Pointer<cJSON> cJSON_CreateIntArray(
     ffi.Pointer<ffi.Int32> numbers,
     int count,
   ) {
-    _cJSON_CreateIntArray ??= _dylib.lookupFunction<_c_cJSON_CreateIntArray,
-        _dart_cJSON_CreateIntArray>('cJSON_CreateIntArray');
-    return _cJSON_CreateIntArray(
+    return (_cJSON_CreateIntArray ??= _dylib.lookupFunction<
+        _c_cJSON_CreateIntArray,
+        _dart_cJSON_CreateIntArray>('cJSON_CreateIntArray'))(
       numbers,
       count,
     );
   }
 
-  _dart_cJSON_CreateIntArray _cJSON_CreateIntArray;
+  _dart_cJSON_CreateIntArray? _cJSON_CreateIntArray;
 
   ffi.Pointer<cJSON> cJSON_CreateFloatArray(
     ffi.Pointer<ffi.Float> numbers,
     int count,
   ) {
-    _cJSON_CreateFloatArray ??= _dylib.lookupFunction<_c_cJSON_CreateFloatArray,
-        _dart_cJSON_CreateFloatArray>('cJSON_CreateFloatArray');
-    return _cJSON_CreateFloatArray(
+    return (_cJSON_CreateFloatArray ??= _dylib.lookupFunction<
+        _c_cJSON_CreateFloatArray,
+        _dart_cJSON_CreateFloatArray>('cJSON_CreateFloatArray'))(
       numbers,
       count,
     );
   }
 
-  _dart_cJSON_CreateFloatArray _cJSON_CreateFloatArray;
+  _dart_cJSON_CreateFloatArray? _cJSON_CreateFloatArray;
 
   ffi.Pointer<cJSON> cJSON_CreateDoubleArray(
     ffi.Pointer<ffi.Double> numbers,
     int count,
   ) {
-    _cJSON_CreateDoubleArray ??= _dylib.lookupFunction<
+    return (_cJSON_CreateDoubleArray ??= _dylib.lookupFunction<
         _c_cJSON_CreateDoubleArray,
-        _dart_cJSON_CreateDoubleArray>('cJSON_CreateDoubleArray');
-    return _cJSON_CreateDoubleArray(
+        _dart_cJSON_CreateDoubleArray>('cJSON_CreateDoubleArray'))(
       numbers,
       count,
     );
   }
 
-  _dart_cJSON_CreateDoubleArray _cJSON_CreateDoubleArray;
+  _dart_cJSON_CreateDoubleArray? _cJSON_CreateDoubleArray;
 
   ffi.Pointer<cJSON> cJSON_CreateStringArray(
     ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
     int count,
   ) {
-    _cJSON_CreateStringArray ??= _dylib.lookupFunction<
+    return (_cJSON_CreateStringArray ??= _dylib.lookupFunction<
         _c_cJSON_CreateStringArray,
-        _dart_cJSON_CreateStringArray>('cJSON_CreateStringArray');
-    return _cJSON_CreateStringArray(
+        _dart_cJSON_CreateStringArray>('cJSON_CreateStringArray'))(
       strings,
       count,
     );
   }
 
-  _dart_cJSON_CreateStringArray _cJSON_CreateStringArray;
+  _dart_cJSON_CreateStringArray? _cJSON_CreateStringArray;
 
   void cJSON_AddItemToArray(
     ffi.Pointer<cJSON> array,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemToArray ??= _dylib.lookupFunction<_c_cJSON_AddItemToArray,
-        _dart_cJSON_AddItemToArray>('cJSON_AddItemToArray');
-    return _cJSON_AddItemToArray(
+    return (_cJSON_AddItemToArray ??= _dylib.lookupFunction<
+        _c_cJSON_AddItemToArray,
+        _dart_cJSON_AddItemToArray>('cJSON_AddItemToArray'))(
       array,
       item,
     );
   }
 
-  _dart_cJSON_AddItemToArray _cJSON_AddItemToArray;
+  _dart_cJSON_AddItemToArray? _cJSON_AddItemToArray;
 
   void cJSON_AddItemToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemToObject ??= _dylib.lookupFunction<_c_cJSON_AddItemToObject,
-        _dart_cJSON_AddItemToObject>('cJSON_AddItemToObject');
-    return _cJSON_AddItemToObject(
+    return (_cJSON_AddItemToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddItemToObject,
+        _dart_cJSON_AddItemToObject>('cJSON_AddItemToObject'))(
       object,
       string,
       item,
     );
   }
 
-  _dart_cJSON_AddItemToObject _cJSON_AddItemToObject;
+  _dart_cJSON_AddItemToObject? _cJSON_AddItemToObject;
 
   void cJSON_AddItemToObjectCS(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemToObjectCS ??= _dylib.lookupFunction<
+    return (_cJSON_AddItemToObjectCS ??= _dylib.lookupFunction<
         _c_cJSON_AddItemToObjectCS,
-        _dart_cJSON_AddItemToObjectCS>('cJSON_AddItemToObjectCS');
-    return _cJSON_AddItemToObjectCS(
+        _dart_cJSON_AddItemToObjectCS>('cJSON_AddItemToObjectCS'))(
       object,
       string,
       item,
     );
   }
 
-  _dart_cJSON_AddItemToObjectCS _cJSON_AddItemToObjectCS;
+  _dart_cJSON_AddItemToObjectCS? _cJSON_AddItemToObjectCS;
 
   void cJSON_AddItemReferenceToArray(
     ffi.Pointer<cJSON> array,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemReferenceToArray ??= _dylib.lookupFunction<
+    return (_cJSON_AddItemReferenceToArray ??= _dylib.lookupFunction<
         _c_cJSON_AddItemReferenceToArray,
-        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray');
-    return _cJSON_AddItemReferenceToArray(
+        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray'))(
       array,
       item,
     );
   }
 
-  _dart_cJSON_AddItemReferenceToArray _cJSON_AddItemReferenceToArray;
+  _dart_cJSON_AddItemReferenceToArray? _cJSON_AddItemReferenceToArray;
 
   void cJSON_AddItemReferenceToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemReferenceToObject ??= _dylib.lookupFunction<
-        _c_cJSON_AddItemReferenceToObject,
-        _dart_cJSON_AddItemReferenceToObject>('cJSON_AddItemReferenceToObject');
-    return _cJSON_AddItemReferenceToObject(
+    return (_cJSON_AddItemReferenceToObject ??= _dylib.lookupFunction<
+            _c_cJSON_AddItemReferenceToObject,
+            _dart_cJSON_AddItemReferenceToObject>(
+        'cJSON_AddItemReferenceToObject'))(
       object,
       string,
       item,
     );
   }
 
-  _dart_cJSON_AddItemReferenceToObject _cJSON_AddItemReferenceToObject;
+  _dart_cJSON_AddItemReferenceToObject? _cJSON_AddItemReferenceToObject;
 
   ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
     ffi.Pointer<cJSON> parent,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_DetachItemViaPointer ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemViaPointer ??= _dylib.lookupFunction<
         _c_cJSON_DetachItemViaPointer,
-        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer');
-    return _cJSON_DetachItemViaPointer(
+        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer'))(
       parent,
       item,
     );
   }
 
-  _dart_cJSON_DetachItemViaPointer _cJSON_DetachItemViaPointer;
+  _dart_cJSON_DetachItemViaPointer? _cJSON_DetachItemViaPointer;
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromArray(
     ffi.Pointer<cJSON> array,
     int which,
   ) {
-    _cJSON_DetachItemFromArray ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemFromArray ??= _dylib.lookupFunction<
         _c_cJSON_DetachItemFromArray,
-        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray');
-    return _cJSON_DetachItemFromArray(
+        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray'))(
       array,
       which,
     );
   }
 
-  _dart_cJSON_DetachItemFromArray _cJSON_DetachItemFromArray;
+  _dart_cJSON_DetachItemFromArray? _cJSON_DetachItemFromArray;
 
   void cJSON_DeleteItemFromArray(
     ffi.Pointer<cJSON> array,
     int which,
   ) {
-    _cJSON_DeleteItemFromArray ??= _dylib.lookupFunction<
+    return (_cJSON_DeleteItemFromArray ??= _dylib.lookupFunction<
         _c_cJSON_DeleteItemFromArray,
-        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray');
-    return _cJSON_DeleteItemFromArray(
+        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray'))(
       array,
       which,
     );
   }
 
-  _dart_cJSON_DeleteItemFromArray _cJSON_DeleteItemFromArray;
+  _dart_cJSON_DeleteItemFromArray? _cJSON_DeleteItemFromArray;
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DetachItemFromObject ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemFromObject ??= _dylib.lookupFunction<
         _c_cJSON_DetachItemFromObject,
-        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject');
-    return _cJSON_DetachItemFromObject(
+        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DetachItemFromObject _cJSON_DetachItemFromObject;
+  _dart_cJSON_DetachItemFromObject? _cJSON_DetachItemFromObject;
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DetachItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_DetachItemFromObjectCaseSensitive,
             _dart_cJSON_DetachItemFromObjectCaseSensitive>(
-        'cJSON_DetachItemFromObjectCaseSensitive');
-    return _cJSON_DetachItemFromObjectCaseSensitive(
+        'cJSON_DetachItemFromObjectCaseSensitive'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DetachItemFromObjectCaseSensitive
+  _dart_cJSON_DetachItemFromObjectCaseSensitive?
       _cJSON_DetachItemFromObjectCaseSensitive;
 
   void cJSON_DeleteItemFromObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DeleteItemFromObject ??= _dylib.lookupFunction<
+    return (_cJSON_DeleteItemFromObject ??= _dylib.lookupFunction<
         _c_cJSON_DeleteItemFromObject,
-        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject');
-    return _cJSON_DeleteItemFromObject(
+        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DeleteItemFromObject _cJSON_DeleteItemFromObject;
+  _dart_cJSON_DeleteItemFromObject? _cJSON_DeleteItemFromObject;
 
   void cJSON_DeleteItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DeleteItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_DeleteItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_DeleteItemFromObjectCaseSensitive,
             _dart_cJSON_DeleteItemFromObjectCaseSensitive>(
-        'cJSON_DeleteItemFromObjectCaseSensitive');
-    return _cJSON_DeleteItemFromObjectCaseSensitive(
+        'cJSON_DeleteItemFromObjectCaseSensitive'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DeleteItemFromObjectCaseSensitive
+  _dart_cJSON_DeleteItemFromObjectCaseSensitive?
       _cJSON_DeleteItemFromObjectCaseSensitive;
 
   void cJSON_InsertItemInArray(
@@ -755,332 +715,320 @@
     int which,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_InsertItemInArray ??= _dylib.lookupFunction<
+    return (_cJSON_InsertItemInArray ??= _dylib.lookupFunction<
         _c_cJSON_InsertItemInArray,
-        _dart_cJSON_InsertItemInArray>('cJSON_InsertItemInArray');
-    return _cJSON_InsertItemInArray(
+        _dart_cJSON_InsertItemInArray>('cJSON_InsertItemInArray'))(
       array,
       which,
       newitem,
     );
   }
 
-  _dart_cJSON_InsertItemInArray _cJSON_InsertItemInArray;
+  _dart_cJSON_InsertItemInArray? _cJSON_InsertItemInArray;
 
   int cJSON_ReplaceItemViaPointer(
     ffi.Pointer<cJSON> parent,
     ffi.Pointer<cJSON> item,
     ffi.Pointer<cJSON> replacement,
   ) {
-    _cJSON_ReplaceItemViaPointer ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemViaPointer ??= _dylib.lookupFunction<
         _c_cJSON_ReplaceItemViaPointer,
-        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer');
-    return _cJSON_ReplaceItemViaPointer(
+        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer'))(
       parent,
       item,
       replacement,
     );
   }
 
-  _dart_cJSON_ReplaceItemViaPointer _cJSON_ReplaceItemViaPointer;
+  _dart_cJSON_ReplaceItemViaPointer? _cJSON_ReplaceItemViaPointer;
 
   void cJSON_ReplaceItemInArray(
     ffi.Pointer<cJSON> array,
     int which,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_ReplaceItemInArray ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemInArray ??= _dylib.lookupFunction<
         _c_cJSON_ReplaceItemInArray,
-        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray');
-    return _cJSON_ReplaceItemInArray(
+        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray'))(
       array,
       which,
       newitem,
     );
   }
 
-  _dart_cJSON_ReplaceItemInArray _cJSON_ReplaceItemInArray;
+  _dart_cJSON_ReplaceItemInArray? _cJSON_ReplaceItemInArray;
 
   void cJSON_ReplaceItemInObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_ReplaceItemInObject ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemInObject ??= _dylib.lookupFunction<
         _c_cJSON_ReplaceItemInObject,
-        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject');
-    return _cJSON_ReplaceItemInObject(
+        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject'))(
       object,
       string,
       newitem,
     );
   }
 
-  _dart_cJSON_ReplaceItemInObject _cJSON_ReplaceItemInObject;
+  _dart_cJSON_ReplaceItemInObject? _cJSON_ReplaceItemInObject;
 
   void cJSON_ReplaceItemInObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_ReplaceItemInObjectCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemInObjectCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_ReplaceItemInObjectCaseSensitive,
             _dart_cJSON_ReplaceItemInObjectCaseSensitive>(
-        'cJSON_ReplaceItemInObjectCaseSensitive');
-    return _cJSON_ReplaceItemInObjectCaseSensitive(
+        'cJSON_ReplaceItemInObjectCaseSensitive'))(
       object,
       string,
       newitem,
     );
   }
 
-  _dart_cJSON_ReplaceItemInObjectCaseSensitive
+  _dart_cJSON_ReplaceItemInObjectCaseSensitive?
       _cJSON_ReplaceItemInObjectCaseSensitive;
 
   ffi.Pointer<cJSON> cJSON_Duplicate(
     ffi.Pointer<cJSON> item,
     int recurse,
   ) {
-    _cJSON_Duplicate ??=
+    return (_cJSON_Duplicate ??=
         _dylib.lookupFunction<_c_cJSON_Duplicate, _dart_cJSON_Duplicate>(
-            'cJSON_Duplicate');
-    return _cJSON_Duplicate(
+            'cJSON_Duplicate'))(
       item,
       recurse,
     );
   }
 
-  _dart_cJSON_Duplicate _cJSON_Duplicate;
+  _dart_cJSON_Duplicate? _cJSON_Duplicate;
 
   int cJSON_Compare(
     ffi.Pointer<cJSON> a,
     ffi.Pointer<cJSON> b,
     int case_sensitive,
   ) {
-    _cJSON_Compare ??= _dylib
-        .lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>('cJSON_Compare');
-    return _cJSON_Compare(
+    return (_cJSON_Compare ??=
+        _dylib.lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>(
+            'cJSON_Compare'))(
       a,
       b,
       case_sensitive,
     );
   }
 
-  _dart_cJSON_Compare _cJSON_Compare;
+  _dart_cJSON_Compare? _cJSON_Compare;
 
   void cJSON_Minify(
     ffi.Pointer<ffi.Int8> json,
   ) {
-    _cJSON_Minify ??= _dylib
-        .lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify');
-    return _cJSON_Minify(
+    return (_cJSON_Minify ??= _dylib
+        .lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify'))(
       json,
     );
   }
 
-  _dart_cJSON_Minify _cJSON_Minify;
+  _dart_cJSON_Minify? _cJSON_Minify;
 
   ffi.Pointer<cJSON> cJSON_AddNullToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddNullToObject ??= _dylib.lookupFunction<_c_cJSON_AddNullToObject,
-        _dart_cJSON_AddNullToObject>('cJSON_AddNullToObject');
-    return _cJSON_AddNullToObject(
+    return (_cJSON_AddNullToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddNullToObject,
+        _dart_cJSON_AddNullToObject>('cJSON_AddNullToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddNullToObject _cJSON_AddNullToObject;
+  _dart_cJSON_AddNullToObject? _cJSON_AddNullToObject;
 
   ffi.Pointer<cJSON> cJSON_AddTrueToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddTrueToObject ??= _dylib.lookupFunction<_c_cJSON_AddTrueToObject,
-        _dart_cJSON_AddTrueToObject>('cJSON_AddTrueToObject');
-    return _cJSON_AddTrueToObject(
+    return (_cJSON_AddTrueToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddTrueToObject,
+        _dart_cJSON_AddTrueToObject>('cJSON_AddTrueToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddTrueToObject _cJSON_AddTrueToObject;
+  _dart_cJSON_AddTrueToObject? _cJSON_AddTrueToObject;
 
   ffi.Pointer<cJSON> cJSON_AddFalseToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddFalseToObject ??= _dylib.lookupFunction<_c_cJSON_AddFalseToObject,
-        _dart_cJSON_AddFalseToObject>('cJSON_AddFalseToObject');
-    return _cJSON_AddFalseToObject(
+    return (_cJSON_AddFalseToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddFalseToObject,
+        _dart_cJSON_AddFalseToObject>('cJSON_AddFalseToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddFalseToObject _cJSON_AddFalseToObject;
+  _dart_cJSON_AddFalseToObject? _cJSON_AddFalseToObject;
 
   ffi.Pointer<cJSON> cJSON_AddBoolToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     int boolean,
   ) {
-    _cJSON_AddBoolToObject ??= _dylib.lookupFunction<_c_cJSON_AddBoolToObject,
-        _dart_cJSON_AddBoolToObject>('cJSON_AddBoolToObject');
-    return _cJSON_AddBoolToObject(
+    return (_cJSON_AddBoolToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddBoolToObject,
+        _dart_cJSON_AddBoolToObject>('cJSON_AddBoolToObject'))(
       object,
       name,
       boolean,
     );
   }
 
-  _dart_cJSON_AddBoolToObject _cJSON_AddBoolToObject;
+  _dart_cJSON_AddBoolToObject? _cJSON_AddBoolToObject;
 
   ffi.Pointer<cJSON> cJSON_AddNumberToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     double number,
   ) {
-    _cJSON_AddNumberToObject ??= _dylib.lookupFunction<
+    return (_cJSON_AddNumberToObject ??= _dylib.lookupFunction<
         _c_cJSON_AddNumberToObject,
-        _dart_cJSON_AddNumberToObject>('cJSON_AddNumberToObject');
-    return _cJSON_AddNumberToObject(
+        _dart_cJSON_AddNumberToObject>('cJSON_AddNumberToObject'))(
       object,
       name,
       number,
     );
   }
 
-  _dart_cJSON_AddNumberToObject _cJSON_AddNumberToObject;
+  _dart_cJSON_AddNumberToObject? _cJSON_AddNumberToObject;
 
   ffi.Pointer<cJSON> cJSON_AddStringToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_AddStringToObject ??= _dylib.lookupFunction<
+    return (_cJSON_AddStringToObject ??= _dylib.lookupFunction<
         _c_cJSON_AddStringToObject,
-        _dart_cJSON_AddStringToObject>('cJSON_AddStringToObject');
-    return _cJSON_AddStringToObject(
+        _dart_cJSON_AddStringToObject>('cJSON_AddStringToObject'))(
       object,
       name,
       string,
     );
   }
 
-  _dart_cJSON_AddStringToObject _cJSON_AddStringToObject;
+  _dart_cJSON_AddStringToObject? _cJSON_AddStringToObject;
 
   ffi.Pointer<cJSON> cJSON_AddRawToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     ffi.Pointer<ffi.Int8> raw,
   ) {
-    _cJSON_AddRawToObject ??= _dylib.lookupFunction<_c_cJSON_AddRawToObject,
-        _dart_cJSON_AddRawToObject>('cJSON_AddRawToObject');
-    return _cJSON_AddRawToObject(
+    return (_cJSON_AddRawToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddRawToObject,
+        _dart_cJSON_AddRawToObject>('cJSON_AddRawToObject'))(
       object,
       name,
       raw,
     );
   }
 
-  _dart_cJSON_AddRawToObject _cJSON_AddRawToObject;
+  _dart_cJSON_AddRawToObject? _cJSON_AddRawToObject;
 
   ffi.Pointer<cJSON> cJSON_AddObjectToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddObjectToObject ??= _dylib.lookupFunction<
+    return (_cJSON_AddObjectToObject ??= _dylib.lookupFunction<
         _c_cJSON_AddObjectToObject,
-        _dart_cJSON_AddObjectToObject>('cJSON_AddObjectToObject');
-    return _cJSON_AddObjectToObject(
+        _dart_cJSON_AddObjectToObject>('cJSON_AddObjectToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddObjectToObject _cJSON_AddObjectToObject;
+  _dart_cJSON_AddObjectToObject? _cJSON_AddObjectToObject;
 
   ffi.Pointer<cJSON> cJSON_AddArrayToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddArrayToObject ??= _dylib.lookupFunction<_c_cJSON_AddArrayToObject,
-        _dart_cJSON_AddArrayToObject>('cJSON_AddArrayToObject');
-    return _cJSON_AddArrayToObject(
+    return (_cJSON_AddArrayToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddArrayToObject,
+        _dart_cJSON_AddArrayToObject>('cJSON_AddArrayToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddArrayToObject _cJSON_AddArrayToObject;
+  _dart_cJSON_AddArrayToObject? _cJSON_AddArrayToObject;
 
   double cJSON_SetNumberHelper(
     ffi.Pointer<cJSON> object,
     double number,
   ) {
-    _cJSON_SetNumberHelper ??= _dylib.lookupFunction<_c_cJSON_SetNumberHelper,
-        _dart_cJSON_SetNumberHelper>('cJSON_SetNumberHelper');
-    return _cJSON_SetNumberHelper(
+    return (_cJSON_SetNumberHelper ??= _dylib.lookupFunction<
+        _c_cJSON_SetNumberHelper,
+        _dart_cJSON_SetNumberHelper>('cJSON_SetNumberHelper'))(
       object,
       number,
     );
   }
 
-  _dart_cJSON_SetNumberHelper _cJSON_SetNumberHelper;
+  _dart_cJSON_SetNumberHelper? _cJSON_SetNumberHelper;
 
   ffi.Pointer<ffi.Void> cJSON_malloc(
     int size,
   ) {
-    _cJSON_malloc ??= _dylib
-        .lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc');
-    return _cJSON_malloc(
+    return (_cJSON_malloc ??= _dylib
+        .lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc'))(
       size,
     );
   }
 
-  _dart_cJSON_malloc _cJSON_malloc;
+  _dart_cJSON_malloc? _cJSON_malloc;
 
   void cJSON_free(
     ffi.Pointer<ffi.Void> object,
   ) {
-    _cJSON_free ??=
-        _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free');
-    return _cJSON_free(
+    return (_cJSON_free ??=
+        _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free'))(
       object,
     );
   }
 
-  _dart_cJSON_free _cJSON_free;
+  _dart_cJSON_free? _cJSON_free;
 }
 
 class cJSON extends ffi.Struct {
-  ffi.Pointer<cJSON> next;
+  external ffi.Pointer<cJSON> next;
 
-  ffi.Pointer<cJSON> prev;
+  external ffi.Pointer<cJSON> prev;
 
-  ffi.Pointer<cJSON> child;
+  external ffi.Pointer<cJSON> child;
 
   @ffi.Int32()
-  int type;
+  external int type;
 
-  ffi.Pointer<ffi.Int8> valuestring;
+  external ffi.Pointer<ffi.Int8> valuestring;
 
   @ffi.Int32()
-  int valueint;
+  external int valueint;
 
   @ffi.Double()
-  double valuedouble;
+  external double valuedouble;
 
-  ffi.Pointer<ffi.Int8> string;
+  external ffi.Pointer<ffi.Int8> string;
 }
 
 class cJSON_Hooks extends ffi.Struct {
-  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> malloc_fn;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_1>> malloc_fn;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> free_fn;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> free_fn;
 }
 
 const int CJSON_VERSION_MAJOR = 1;
diff --git a/example/c_json/main.dart b/example/c_json/main.dart
index fa4bbbc..fbd6f69 100644
--- a/example/c_json/main.dart
+++ b/example/c_json/main.dart
@@ -60,20 +60,20 @@
   if (cjson.cJSON_IsObject(parsedcjson.cast()) == 1) {
     obj = <String, dynamic>{};
 
-    Pointer<cj.cJSON> ptr;
+    Pointer<cj.cJSON>? ptr;
     ptr = parsedcjson.ref.child;
     while (ptr != nullptr) {
-      final dynamic o = convertCJsonToDartObj(ptr);
+      final dynamic o = convertCJsonToDartObj(ptr!);
       _addToObj(obj, o, ptr.ref.string.cast());
       ptr = ptr.ref.next;
     }
   } else if (cjson.cJSON_IsArray(parsedcjson.cast()) == 1) {
     obj = <dynamic>[];
 
-    Pointer<cj.cJSON> ptr;
+    Pointer<cj.cJSON>? ptr;
     ptr = parsedcjson.ref.child;
     while (ptr != nullptr) {
-      final dynamic o = convertCJsonToDartObj(ptr);
+      final dynamic o = convertCJsonToDartObj(ptr!);
       _addToObj(obj, o);
       ptr = ptr.ref.next;
     }
@@ -88,9 +88,9 @@
   return obj;
 }
 
-void _addToObj(dynamic obj, dynamic o, [Pointer<Utf8> name]) {
+void _addToObj(dynamic obj, dynamic o, [Pointer<Utf8>? name]) {
   if (obj is Map<String, dynamic>) {
-    obj[Utf8.fromUtf8(name)] = o;
+    obj[Utf8.fromUtf8(name!)] = o;
   } else if (obj is List<dynamic>) {
     obj.add(o);
   }
diff --git a/example/c_json/pubspec.yaml b/example/c_json/pubspec.yaml
index 1b53211..dd99e63 100644
--- a/example/c_json/pubspec.yaml
+++ b/example/c_json/pubspec.yaml
@@ -5,10 +5,10 @@
 name: c_json_example
 
 environment:
-  sdk: '>=2.8.1 <3.0.0'
+  sdk: '>=2.12.0-29.10.beta <3.0.0'
 
 dependencies:
-  ffi: ^0.1.3
+  ffi: ^0.2.0-nullsafety.1
 
 dev_dependencies:
   ffigen:
diff --git a/example/libclang-example/generated_bindings.dart b/example/libclang-example/generated_bindings.dart
index 3b2fc26..d694962 100644
--- a/example/libclang-example/generated_bindings.dart
+++ b/example/libclang-example/generated_bindings.dart
@@ -20,14 +20,14 @@
   void clang_disposeStringSet(
     ffi.Pointer<CXStringSet> set_1,
   ) {
-    _clang_disposeStringSet ??= _dylib.lookupFunction<_c_clang_disposeStringSet,
-        _dart_clang_disposeStringSet>('clang_disposeStringSet');
-    return _clang_disposeStringSet(
+    return (_clang_disposeStringSet ??= _dylib.lookupFunction<
+        _c_clang_disposeStringSet,
+        _dart_clang_disposeStringSet>('clang_disposeStringSet'))(
       set_1,
     );
   }
 
-  _dart_clang_disposeStringSet _clang_disposeStringSet;
+  _dart_clang_disposeStringSet? _clang_disposeStringSet;
 
   /// Provides a shared context for creating translation units.
   ///
@@ -71,16 +71,15 @@
     int excludeDeclarationsFromPCH,
     int displayDiagnostics,
   ) {
-    _clang_createIndex ??=
+    return (_clang_createIndex ??=
         _dylib.lookupFunction<_c_clang_createIndex, _dart_clang_createIndex>(
-            'clang_createIndex');
-    return _clang_createIndex(
+            'clang_createIndex'))(
       excludeDeclarationsFromPCH,
       displayDiagnostics,
     );
   }
 
-  _dart_clang_createIndex _clang_createIndex;
+  _dart_clang_createIndex? _clang_createIndex;
 
   /// Destroy the given index.
   ///
@@ -89,15 +88,14 @@
   void clang_disposeIndex(
     ffi.Pointer<ffi.Void> index,
   ) {
-    _clang_disposeIndex ??=
+    return (_clang_disposeIndex ??=
         _dylib.lookupFunction<_c_clang_disposeIndex, _dart_clang_disposeIndex>(
-            'clang_disposeIndex');
-    return _clang_disposeIndex(
+            'clang_disposeIndex'))(
       index,
     );
   }
 
-  _dart_clang_disposeIndex _clang_disposeIndex;
+  _dart_clang_disposeIndex? _clang_disposeIndex;
 
   /// Sets general options associated with a CXIndex.
   ///
@@ -114,16 +112,16 @@
     ffi.Pointer<ffi.Void> arg0,
     int options,
   ) {
-    _clang_CXIndex_setGlobalOptions ??= _dylib.lookupFunction<
-        _c_clang_CXIndex_setGlobalOptions,
-        _dart_clang_CXIndex_setGlobalOptions>('clang_CXIndex_setGlobalOptions');
-    return _clang_CXIndex_setGlobalOptions(
+    return (_clang_CXIndex_setGlobalOptions ??= _dylib.lookupFunction<
+            _c_clang_CXIndex_setGlobalOptions,
+            _dart_clang_CXIndex_setGlobalOptions>(
+        'clang_CXIndex_setGlobalOptions'))(
       arg0,
       options,
     );
   }
 
-  _dart_clang_CXIndex_setGlobalOptions _clang_CXIndex_setGlobalOptions;
+  _dart_clang_CXIndex_setGlobalOptions? _clang_CXIndex_setGlobalOptions;
 
   /// Gets the general options associated with a CXIndex.
   ///
@@ -132,15 +130,15 @@
   int clang_CXIndex_getGlobalOptions(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_CXIndex_getGlobalOptions ??= _dylib.lookupFunction<
-        _c_clang_CXIndex_getGlobalOptions,
-        _dart_clang_CXIndex_getGlobalOptions>('clang_CXIndex_getGlobalOptions');
-    return _clang_CXIndex_getGlobalOptions(
+    return (_clang_CXIndex_getGlobalOptions ??= _dylib.lookupFunction<
+            _c_clang_CXIndex_getGlobalOptions,
+            _dart_clang_CXIndex_getGlobalOptions>(
+        'clang_CXIndex_getGlobalOptions'))(
       arg0,
     );
   }
 
-  _dart_clang_CXIndex_getGlobalOptions _clang_CXIndex_getGlobalOptions;
+  _dart_clang_CXIndex_getGlobalOptions? _clang_CXIndex_getGlobalOptions;
 
   /// Sets the invocation emission path option in a CXIndex.
   ///
@@ -151,32 +149,30 @@
     ffi.Pointer<ffi.Void> arg0,
     ffi.Pointer<ffi.Int8> Path,
   ) {
-    _clang_CXIndex_setInvocationEmissionPathOption ??= _dylib.lookupFunction<
-            _c_clang_CXIndex_setInvocationEmissionPathOption,
-            _dart_clang_CXIndex_setInvocationEmissionPathOption>(
-        'clang_CXIndex_setInvocationEmissionPathOption');
-    return _clang_CXIndex_setInvocationEmissionPathOption(
+    return (_clang_CXIndex_setInvocationEmissionPathOption ??=
+        _dylib.lookupFunction<_c_clang_CXIndex_setInvocationEmissionPathOption,
+                _dart_clang_CXIndex_setInvocationEmissionPathOption>(
+            'clang_CXIndex_setInvocationEmissionPathOption'))(
       arg0,
       Path,
     );
   }
 
-  _dart_clang_CXIndex_setInvocationEmissionPathOption
+  _dart_clang_CXIndex_setInvocationEmissionPathOption?
       _clang_CXIndex_setInvocationEmissionPathOption;
 
   /// Retrieve the last modification time of the given file.
   int clang_getFileTime(
     ffi.Pointer<ffi.Void> SFile,
   ) {
-    _clang_getFileTime ??=
+    return (_clang_getFileTime ??=
         _dylib.lookupFunction<_c_clang_getFileTime, _dart_clang_getFileTime>(
-            'clang_getFileTime');
-    return _clang_getFileTime(
+            'clang_getFileTime'))(
       SFile,
     );
   }
 
-  _dart_clang_getFileTime _clang_getFileTime;
+  _dart_clang_getFileTime? _clang_getFileTime;
 
   /// Retrieve the unique ID for the given \c file.
   ///
@@ -188,15 +184,15 @@
     ffi.Pointer<ffi.Void> file,
     ffi.Pointer<CXFileUniqueID> outID,
   ) {
-    _clang_getFileUniqueID ??= _dylib.lookupFunction<_c_clang_getFileUniqueID,
-        _dart_clang_getFileUniqueID>('clang_getFileUniqueID');
-    return _clang_getFileUniqueID(
+    return (_clang_getFileUniqueID ??= _dylib.lookupFunction<
+        _c_clang_getFileUniqueID,
+        _dart_clang_getFileUniqueID>('clang_getFileUniqueID'))(
       file,
       outID,
     );
   }
 
-  _dart_clang_getFileUniqueID _clang_getFileUniqueID;
+  _dart_clang_getFileUniqueID? _clang_getFileUniqueID;
 
   /// Determine whether the given header is guarded against
   /// multiple inclusions, either with the conventional
@@ -205,17 +201,16 @@
     ffi.Pointer<CXTranslationUnitImpl> tu,
     ffi.Pointer<ffi.Void> file,
   ) {
-    _clang_isFileMultipleIncludeGuarded ??= _dylib.lookupFunction<
+    return (_clang_isFileMultipleIncludeGuarded ??= _dylib.lookupFunction<
             _c_clang_isFileMultipleIncludeGuarded,
             _dart_clang_isFileMultipleIncludeGuarded>(
-        'clang_isFileMultipleIncludeGuarded');
-    return _clang_isFileMultipleIncludeGuarded(
+        'clang_isFileMultipleIncludeGuarded'))(
       tu,
       file,
     );
   }
 
-  _dart_clang_isFileMultipleIncludeGuarded _clang_isFileMultipleIncludeGuarded;
+  _dart_clang_isFileMultipleIncludeGuarded? _clang_isFileMultipleIncludeGuarded;
 
   /// Retrieve a file handle within the given translation unit.
   ///
@@ -229,15 +224,15 @@
     ffi.Pointer<CXTranslationUnitImpl> tu,
     ffi.Pointer<ffi.Int8> file_name,
   ) {
-    _clang_getFile ??= _dylib
-        .lookupFunction<_c_clang_getFile, _dart_clang_getFile>('clang_getFile');
-    return _clang_getFile(
+    return (_clang_getFile ??=
+        _dylib.lookupFunction<_c_clang_getFile, _dart_clang_getFile>(
+            'clang_getFile'))(
       tu,
       file_name,
     );
   }
 
-  _dart_clang_getFile _clang_getFile;
+  _dart_clang_getFile? _clang_getFile;
 
   /// Retrieve the buffer associated with the given file.
   ///
@@ -254,16 +249,16 @@
     ffi.Pointer<ffi.Void> file,
     ffi.Pointer<ffi.Uint64> size,
   ) {
-    _clang_getFileContents ??= _dylib.lookupFunction<_c_clang_getFileContents,
-        _dart_clang_getFileContents>('clang_getFileContents');
-    return _clang_getFileContents(
+    return (_clang_getFileContents ??= _dylib.lookupFunction<
+        _c_clang_getFileContents,
+        _dart_clang_getFileContents>('clang_getFileContents'))(
       tu,
       file,
       size,
     );
   }
 
-  _dart_clang_getFileContents _clang_getFileContents;
+  _dart_clang_getFileContents? _clang_getFileContents;
 
   /// Returns non-zero if the \c file1 and \c file2 point to the same file,
   /// or they are both NULL.
@@ -271,16 +266,15 @@
     ffi.Pointer<ffi.Void> file1,
     ffi.Pointer<ffi.Void> file2,
   ) {
-    _clang_File_isEqual ??=
+    return (_clang_File_isEqual ??=
         _dylib.lookupFunction<_c_clang_File_isEqual, _dart_clang_File_isEqual>(
-            'clang_File_isEqual');
-    return _clang_File_isEqual(
+            'clang_File_isEqual'))(
       file1,
       file2,
     );
   }
 
-  _dart_clang_File_isEqual _clang_File_isEqual;
+  _dart_clang_File_isEqual? _clang_File_isEqual;
 
   /// Retrieve all ranges that were skipped by the preprocessor.
   ///
@@ -290,15 +284,15 @@
     ffi.Pointer<CXTranslationUnitImpl> tu,
     ffi.Pointer<ffi.Void> file,
   ) {
-    _clang_getSkippedRanges ??= _dylib.lookupFunction<_c_clang_getSkippedRanges,
-        _dart_clang_getSkippedRanges>('clang_getSkippedRanges');
-    return _clang_getSkippedRanges(
+    return (_clang_getSkippedRanges ??= _dylib.lookupFunction<
+        _c_clang_getSkippedRanges,
+        _dart_clang_getSkippedRanges>('clang_getSkippedRanges'))(
       tu,
       file,
     );
   }
 
-  _dart_clang_getSkippedRanges _clang_getSkippedRanges;
+  _dart_clang_getSkippedRanges? _clang_getSkippedRanges;
 
   /// Retrieve all ranges from all files that were skipped by the
   /// preprocessor.
@@ -308,43 +302,40 @@
   ffi.Pointer<CXSourceRangeList> clang_getAllSkippedRanges(
     ffi.Pointer<CXTranslationUnitImpl> tu,
   ) {
-    _clang_getAllSkippedRanges ??= _dylib.lookupFunction<
+    return (_clang_getAllSkippedRanges ??= _dylib.lookupFunction<
         _c_clang_getAllSkippedRanges,
-        _dart_clang_getAllSkippedRanges>('clang_getAllSkippedRanges');
-    return _clang_getAllSkippedRanges(
+        _dart_clang_getAllSkippedRanges>('clang_getAllSkippedRanges'))(
       tu,
     );
   }
 
-  _dart_clang_getAllSkippedRanges _clang_getAllSkippedRanges;
+  _dart_clang_getAllSkippedRanges? _clang_getAllSkippedRanges;
 
   /// Destroy the given \c CXSourceRangeList.
   void clang_disposeSourceRangeList(
     ffi.Pointer<CXSourceRangeList> ranges,
   ) {
-    _clang_disposeSourceRangeList ??= _dylib.lookupFunction<
+    return (_clang_disposeSourceRangeList ??= _dylib.lookupFunction<
         _c_clang_disposeSourceRangeList,
-        _dart_clang_disposeSourceRangeList>('clang_disposeSourceRangeList');
-    return _clang_disposeSourceRangeList(
+        _dart_clang_disposeSourceRangeList>('clang_disposeSourceRangeList'))(
       ranges,
     );
   }
 
-  _dart_clang_disposeSourceRangeList _clang_disposeSourceRangeList;
+  _dart_clang_disposeSourceRangeList? _clang_disposeSourceRangeList;
 
   /// Determine the number of diagnostics in a CXDiagnosticSet.
   int clang_getNumDiagnosticsInSet(
     ffi.Pointer<ffi.Void> Diags,
   ) {
-    _clang_getNumDiagnosticsInSet ??= _dylib.lookupFunction<
+    return (_clang_getNumDiagnosticsInSet ??= _dylib.lookupFunction<
         _c_clang_getNumDiagnosticsInSet,
-        _dart_clang_getNumDiagnosticsInSet>('clang_getNumDiagnosticsInSet');
-    return _clang_getNumDiagnosticsInSet(
+        _dart_clang_getNumDiagnosticsInSet>('clang_getNumDiagnosticsInSet'))(
       Diags,
     );
   }
 
-  _dart_clang_getNumDiagnosticsInSet _clang_getNumDiagnosticsInSet;
+  _dart_clang_getNumDiagnosticsInSet? _clang_getNumDiagnosticsInSet;
 
   /// Retrieve a diagnostic associated with the given CXDiagnosticSet.
   ///
@@ -357,16 +348,15 @@
     ffi.Pointer<ffi.Void> Diags,
     int Index,
   ) {
-    _clang_getDiagnosticInSet ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticInSet ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticInSet,
-        _dart_clang_getDiagnosticInSet>('clang_getDiagnosticInSet');
-    return _clang_getDiagnosticInSet(
+        _dart_clang_getDiagnosticInSet>('clang_getDiagnosticInSet'))(
       Diags,
       Index,
     );
   }
 
-  _dart_clang_getDiagnosticInSet _clang_getDiagnosticInSet;
+  _dart_clang_getDiagnosticInSet? _clang_getDiagnosticInSet;
 
   /// Deserialize a set of diagnostics from a Clang diagnostics bitcode
   /// file.
@@ -384,30 +374,29 @@
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString,
   ) {
-    _clang_loadDiagnostics ??= _dylib.lookupFunction<_c_clang_loadDiagnostics,
-        _dart_clang_loadDiagnostics>('clang_loadDiagnostics');
-    return _clang_loadDiagnostics(
+    return (_clang_loadDiagnostics ??= _dylib.lookupFunction<
+        _c_clang_loadDiagnostics,
+        _dart_clang_loadDiagnostics>('clang_loadDiagnostics'))(
       file,
       error,
       errorString,
     );
   }
 
-  _dart_clang_loadDiagnostics _clang_loadDiagnostics;
+  _dart_clang_loadDiagnostics? _clang_loadDiagnostics;
 
   /// Release a CXDiagnosticSet and all of its contained diagnostics.
   void clang_disposeDiagnosticSet(
     ffi.Pointer<ffi.Void> Diags,
   ) {
-    _clang_disposeDiagnosticSet ??= _dylib.lookupFunction<
+    return (_clang_disposeDiagnosticSet ??= _dylib.lookupFunction<
         _c_clang_disposeDiagnosticSet,
-        _dart_clang_disposeDiagnosticSet>('clang_disposeDiagnosticSet');
-    return _clang_disposeDiagnosticSet(
+        _dart_clang_disposeDiagnosticSet>('clang_disposeDiagnosticSet'))(
       Diags,
     );
   }
 
-  _dart_clang_disposeDiagnosticSet _clang_disposeDiagnosticSet;
+  _dart_clang_disposeDiagnosticSet? _clang_disposeDiagnosticSet;
 
   /// Retrieve the child diagnostics of a CXDiagnostic.
   ///
@@ -416,30 +405,28 @@
   ffi.Pointer<ffi.Void> clang_getChildDiagnostics(
     ffi.Pointer<ffi.Void> D,
   ) {
-    _clang_getChildDiagnostics ??= _dylib.lookupFunction<
+    return (_clang_getChildDiagnostics ??= _dylib.lookupFunction<
         _c_clang_getChildDiagnostics,
-        _dart_clang_getChildDiagnostics>('clang_getChildDiagnostics');
-    return _clang_getChildDiagnostics(
+        _dart_clang_getChildDiagnostics>('clang_getChildDiagnostics'))(
       D,
     );
   }
 
-  _dart_clang_getChildDiagnostics _clang_getChildDiagnostics;
+  _dart_clang_getChildDiagnostics? _clang_getChildDiagnostics;
 
   /// Determine the number of diagnostics produced for the given
   /// translation unit.
   int clang_getNumDiagnostics(
     ffi.Pointer<CXTranslationUnitImpl> Unit,
   ) {
-    _clang_getNumDiagnostics ??= _dylib.lookupFunction<
+    return (_clang_getNumDiagnostics ??= _dylib.lookupFunction<
         _c_clang_getNumDiagnostics,
-        _dart_clang_getNumDiagnostics>('clang_getNumDiagnostics');
-    return _clang_getNumDiagnostics(
+        _dart_clang_getNumDiagnostics>('clang_getNumDiagnostics'))(
       Unit,
     );
   }
 
-  _dart_clang_getNumDiagnostics _clang_getNumDiagnostics;
+  _dart_clang_getNumDiagnostics? _clang_getNumDiagnostics;
 
   /// Retrieve a diagnostic associated with the given translation unit.
   ///
@@ -452,15 +439,15 @@
     ffi.Pointer<CXTranslationUnitImpl> Unit,
     int Index,
   ) {
-    _clang_getDiagnostic ??= _dylib.lookupFunction<_c_clang_getDiagnostic,
-        _dart_clang_getDiagnostic>('clang_getDiagnostic');
-    return _clang_getDiagnostic(
+    return (_clang_getDiagnostic ??= _dylib.lookupFunction<
+        _c_clang_getDiagnostic,
+        _dart_clang_getDiagnostic>('clang_getDiagnostic'))(
       Unit,
       Index,
     );
   }
 
-  _dart_clang_getDiagnostic _clang_getDiagnostic;
+  _dart_clang_getDiagnostic? _clang_getDiagnostic;
 
   /// Retrieve the complete set of diagnostics associated with a
   /// translation unit.
@@ -469,29 +456,27 @@
   ffi.Pointer<ffi.Void> clang_getDiagnosticSetFromTU(
     ffi.Pointer<CXTranslationUnitImpl> Unit,
   ) {
-    _clang_getDiagnosticSetFromTU ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticSetFromTU ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticSetFromTU,
-        _dart_clang_getDiagnosticSetFromTU>('clang_getDiagnosticSetFromTU');
-    return _clang_getDiagnosticSetFromTU(
+        _dart_clang_getDiagnosticSetFromTU>('clang_getDiagnosticSetFromTU'))(
       Unit,
     );
   }
 
-  _dart_clang_getDiagnosticSetFromTU _clang_getDiagnosticSetFromTU;
+  _dart_clang_getDiagnosticSetFromTU? _clang_getDiagnosticSetFromTU;
 
   /// Destroy a diagnostic.
   void clang_disposeDiagnostic(
     ffi.Pointer<ffi.Void> Diagnostic,
   ) {
-    _clang_disposeDiagnostic ??= _dylib.lookupFunction<
+    return (_clang_disposeDiagnostic ??= _dylib.lookupFunction<
         _c_clang_disposeDiagnostic,
-        _dart_clang_disposeDiagnostic>('clang_disposeDiagnostic');
-    return _clang_disposeDiagnostic(
+        _dart_clang_disposeDiagnostic>('clang_disposeDiagnostic'))(
       Diagnostic,
     );
   }
 
-  _dart_clang_disposeDiagnostic _clang_disposeDiagnostic;
+  _dart_clang_disposeDiagnostic? _clang_disposeDiagnostic;
 
   /// Retrieve the set of display options most similar to the
   /// default behavior of the clang compiler.
@@ -499,29 +484,27 @@
   /// \returns A set of display options suitable for use with \c
   /// clang_formatDiagnostic().
   int clang_defaultDiagnosticDisplayOptions() {
-    _clang_defaultDiagnosticDisplayOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultDiagnosticDisplayOptions ??= _dylib.lookupFunction<
             _c_clang_defaultDiagnosticDisplayOptions,
             _dart_clang_defaultDiagnosticDisplayOptions>(
-        'clang_defaultDiagnosticDisplayOptions');
-    return _clang_defaultDiagnosticDisplayOptions();
+        'clang_defaultDiagnosticDisplayOptions'))();
   }
 
-  _dart_clang_defaultDiagnosticDisplayOptions
+  _dart_clang_defaultDiagnosticDisplayOptions?
       _clang_defaultDiagnosticDisplayOptions;
 
   /// Determine the severity of the given diagnostic.
   int clang_getDiagnosticSeverity(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_getDiagnosticSeverity ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticSeverity ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticSeverity,
-        _dart_clang_getDiagnosticSeverity>('clang_getDiagnosticSeverity');
-    return _clang_getDiagnosticSeverity(
+        _dart_clang_getDiagnosticSeverity>('clang_getDiagnosticSeverity'))(
       arg0,
     );
   }
 
-  _dart_clang_getDiagnosticSeverity _clang_getDiagnosticSeverity;
+  _dart_clang_getDiagnosticSeverity? _clang_getDiagnosticSeverity;
 
   /// Retrieve the category number for this diagnostic.
   ///
@@ -534,45 +517,42 @@
   int clang_getDiagnosticCategory(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_getDiagnosticCategory ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticCategory ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticCategory,
-        _dart_clang_getDiagnosticCategory>('clang_getDiagnosticCategory');
-    return _clang_getDiagnosticCategory(
+        _dart_clang_getDiagnosticCategory>('clang_getDiagnosticCategory'))(
       arg0,
     );
   }
 
-  _dart_clang_getDiagnosticCategory _clang_getDiagnosticCategory;
+  _dart_clang_getDiagnosticCategory? _clang_getDiagnosticCategory;
 
   /// Determine the number of source ranges associated with the given
   /// diagnostic.
   int clang_getDiagnosticNumRanges(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_getDiagnosticNumRanges ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticNumRanges ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticNumRanges,
-        _dart_clang_getDiagnosticNumRanges>('clang_getDiagnosticNumRanges');
-    return _clang_getDiagnosticNumRanges(
+        _dart_clang_getDiagnosticNumRanges>('clang_getDiagnosticNumRanges'))(
       arg0,
     );
   }
 
-  _dart_clang_getDiagnosticNumRanges _clang_getDiagnosticNumRanges;
+  _dart_clang_getDiagnosticNumRanges? _clang_getDiagnosticNumRanges;
 
   /// Determine the number of fix-it hints associated with the
   /// given diagnostic.
   int clang_getDiagnosticNumFixIts(
     ffi.Pointer<ffi.Void> Diagnostic,
   ) {
-    _clang_getDiagnosticNumFixIts ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticNumFixIts ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticNumFixIts,
-        _dart_clang_getDiagnosticNumFixIts>('clang_getDiagnosticNumFixIts');
-    return _clang_getDiagnosticNumFixIts(
+        _dart_clang_getDiagnosticNumFixIts>('clang_getDiagnosticNumFixIts'))(
       Diagnostic,
     );
   }
 
-  _dart_clang_getDiagnosticNumFixIts _clang_getDiagnosticNumFixIts;
+  _dart_clang_getDiagnosticNumFixIts? _clang_getDiagnosticNumFixIts;
 
   /// Return the CXTranslationUnit for a given source file and the provided
   /// command line arguments one would pass to the compiler.
@@ -620,11 +600,10 @@
     int num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
   ) {
-    _clang_createTranslationUnitFromSourceFile ??= _dylib.lookupFunction<
-            _c_clang_createTranslationUnitFromSourceFile,
-            _dart_clang_createTranslationUnitFromSourceFile>(
-        'clang_createTranslationUnitFromSourceFile');
-    return _clang_createTranslationUnitFromSourceFile(
+    return (_clang_createTranslationUnitFromSourceFile ??=
+        _dylib.lookupFunction<_c_clang_createTranslationUnitFromSourceFile,
+                _dart_clang_createTranslationUnitFromSourceFile>(
+            'clang_createTranslationUnitFromSourceFile'))(
       CIdx,
       source_filename,
       num_clang_command_line_args,
@@ -634,7 +613,7 @@
     );
   }
 
-  _dart_clang_createTranslationUnitFromSourceFile
+  _dart_clang_createTranslationUnitFromSourceFile?
       _clang_createTranslationUnitFromSourceFile;
 
   /// Same as \c clang_createTranslationUnit2, but returns
@@ -645,16 +624,15 @@
     ffi.Pointer<ffi.Void> CIdx,
     ffi.Pointer<ffi.Int8> ast_filename,
   ) {
-    _clang_createTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_createTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_createTranslationUnit,
-        _dart_clang_createTranslationUnit>('clang_createTranslationUnit');
-    return _clang_createTranslationUnit(
+        _dart_clang_createTranslationUnit>('clang_createTranslationUnit'))(
       CIdx,
       ast_filename,
     );
   }
 
-  _dart_clang_createTranslationUnit _clang_createTranslationUnit;
+  _dart_clang_createTranslationUnit? _clang_createTranslationUnit;
 
   /// Create a translation unit from an AST file (\c -emit-ast).
   ///
@@ -667,17 +645,16 @@
     ffi.Pointer<ffi.Int8> ast_filename,
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
   ) {
-    _clang_createTranslationUnit2 ??= _dylib.lookupFunction<
+    return (_clang_createTranslationUnit2 ??= _dylib.lookupFunction<
         _c_clang_createTranslationUnit2,
-        _dart_clang_createTranslationUnit2>('clang_createTranslationUnit2');
-    return _clang_createTranslationUnit2(
+        _dart_clang_createTranslationUnit2>('clang_createTranslationUnit2'))(
       CIdx,
       ast_filename,
       out_TU,
     );
   }
 
-  _dart_clang_createTranslationUnit2 _clang_createTranslationUnit2;
+  _dart_clang_createTranslationUnit2? _clang_createTranslationUnit2;
 
   /// Returns the set of flags that is suitable for parsing a translation
   /// unit that is being edited.
@@ -690,14 +667,13 @@
   /// preamble) geared toward improving the performance of these routines. The
   /// set of optimizations enabled may change from one version to the next.
   int clang_defaultEditingTranslationUnitOptions() {
-    _clang_defaultEditingTranslationUnitOptions ??= _dylib.lookupFunction<
-            _c_clang_defaultEditingTranslationUnitOptions,
-            _dart_clang_defaultEditingTranslationUnitOptions>(
-        'clang_defaultEditingTranslationUnitOptions');
-    return _clang_defaultEditingTranslationUnitOptions();
+    return (_clang_defaultEditingTranslationUnitOptions ??=
+        _dylib.lookupFunction<_c_clang_defaultEditingTranslationUnitOptions,
+                _dart_clang_defaultEditingTranslationUnitOptions>(
+            'clang_defaultEditingTranslationUnitOptions'))();
   }
 
-  _dart_clang_defaultEditingTranslationUnitOptions
+  _dart_clang_defaultEditingTranslationUnitOptions?
       _clang_defaultEditingTranslationUnitOptions;
 
   /// Same as \c clang_parseTranslationUnit2, but returns
@@ -713,10 +689,9 @@
     int num_unsaved_files,
     int options,
   ) {
-    _clang_parseTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_parseTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_parseTranslationUnit,
-        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit');
-    return _clang_parseTranslationUnit(
+        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit'))(
       CIdx,
       source_filename,
       command_line_args,
@@ -727,7 +702,7 @@
     );
   }
 
-  _dart_clang_parseTranslationUnit _clang_parseTranslationUnit;
+  _dart_clang_parseTranslationUnit? _clang_parseTranslationUnit;
 
   /// Parse the given source file and the translation unit corresponding
   /// to that file.
@@ -781,10 +756,9 @@
     int options,
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
   ) {
-    _clang_parseTranslationUnit2 ??= _dylib.lookupFunction<
+    return (_clang_parseTranslationUnit2 ??= _dylib.lookupFunction<
         _c_clang_parseTranslationUnit2,
-        _dart_clang_parseTranslationUnit2>('clang_parseTranslationUnit2');
-    return _clang_parseTranslationUnit2(
+        _dart_clang_parseTranslationUnit2>('clang_parseTranslationUnit2'))(
       CIdx,
       source_filename,
       command_line_args,
@@ -796,7 +770,7 @@
     );
   }
 
-  _dart_clang_parseTranslationUnit2 _clang_parseTranslationUnit2;
+  _dart_clang_parseTranslationUnit2? _clang_parseTranslationUnit2;
 
   /// Same as clang_parseTranslationUnit2 but requires a full command line
   /// for \c command_line_args including argv[0]. This is useful if the standard
@@ -811,11 +785,10 @@
     int options,
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
   ) {
-    _clang_parseTranslationUnit2FullArgv ??= _dylib.lookupFunction<
+    return (_clang_parseTranslationUnit2FullArgv ??= _dylib.lookupFunction<
             _c_clang_parseTranslationUnit2FullArgv,
             _dart_clang_parseTranslationUnit2FullArgv>(
-        'clang_parseTranslationUnit2FullArgv');
-    return _clang_parseTranslationUnit2FullArgv(
+        'clang_parseTranslationUnit2FullArgv'))(
       CIdx,
       source_filename,
       command_line_args,
@@ -827,7 +800,7 @@
     );
   }
 
-  _dart_clang_parseTranslationUnit2FullArgv
+  _dart_clang_parseTranslationUnit2FullArgv?
       _clang_parseTranslationUnit2FullArgv;
 
   /// Returns the set of flags that is suitable for saving a translation
@@ -840,15 +813,14 @@
   int clang_defaultSaveOptions(
     ffi.Pointer<CXTranslationUnitImpl> TU,
   ) {
-    _clang_defaultSaveOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultSaveOptions ??= _dylib.lookupFunction<
         _c_clang_defaultSaveOptions,
-        _dart_clang_defaultSaveOptions>('clang_defaultSaveOptions');
-    return _clang_defaultSaveOptions(
+        _dart_clang_defaultSaveOptions>('clang_defaultSaveOptions'))(
       TU,
     );
   }
 
-  _dart_clang_defaultSaveOptions _clang_defaultSaveOptions;
+  _dart_clang_defaultSaveOptions? _clang_defaultSaveOptions;
 
   /// Saves a translation unit into a serialized representation of
   /// that translation unit on disk.
@@ -876,17 +848,16 @@
     ffi.Pointer<ffi.Int8> FileName,
     int options,
   ) {
-    _clang_saveTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_saveTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_saveTranslationUnit,
-        _dart_clang_saveTranslationUnit>('clang_saveTranslationUnit');
-    return _clang_saveTranslationUnit(
+        _dart_clang_saveTranslationUnit>('clang_saveTranslationUnit'))(
       TU,
       FileName,
       options,
     );
   }
 
-  _dart_clang_saveTranslationUnit _clang_saveTranslationUnit;
+  _dart_clang_saveTranslationUnit? _clang_saveTranslationUnit;
 
   /// Suspend a translation unit in order to free memory associated with it.
   ///
@@ -896,29 +867,27 @@
   int clang_suspendTranslationUnit(
     ffi.Pointer<CXTranslationUnitImpl> arg0,
   ) {
-    _clang_suspendTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_suspendTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_suspendTranslationUnit,
-        _dart_clang_suspendTranslationUnit>('clang_suspendTranslationUnit');
-    return _clang_suspendTranslationUnit(
+        _dart_clang_suspendTranslationUnit>('clang_suspendTranslationUnit'))(
       arg0,
     );
   }
 
-  _dart_clang_suspendTranslationUnit _clang_suspendTranslationUnit;
+  _dart_clang_suspendTranslationUnit? _clang_suspendTranslationUnit;
 
   /// Destroy the specified CXTranslationUnit object.
   void clang_disposeTranslationUnit(
     ffi.Pointer<CXTranslationUnitImpl> arg0,
   ) {
-    _clang_disposeTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_disposeTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_disposeTranslationUnit,
-        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit');
-    return _clang_disposeTranslationUnit(
+        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit'))(
       arg0,
     );
   }
 
-  _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit;
+  _dart_clang_disposeTranslationUnit? _clang_disposeTranslationUnit;
 
   /// Returns the set of flags that is suitable for reparsing a translation
   /// unit.
@@ -931,15 +900,14 @@
   int clang_defaultReparseOptions(
     ffi.Pointer<CXTranslationUnitImpl> TU,
   ) {
-    _clang_defaultReparseOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultReparseOptions ??= _dylib.lookupFunction<
         _c_clang_defaultReparseOptions,
-        _dart_clang_defaultReparseOptions>('clang_defaultReparseOptions');
-    return _clang_defaultReparseOptions(
+        _dart_clang_defaultReparseOptions>('clang_defaultReparseOptions'))(
       TU,
     );
   }
 
-  _dart_clang_defaultReparseOptions _clang_defaultReparseOptions;
+  _dart_clang_defaultReparseOptions? _clang_defaultReparseOptions;
 
   /// Reparse the source files that produced this translation unit.
   ///
@@ -984,10 +952,9 @@
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int options,
   ) {
-    _clang_reparseTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_reparseTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_reparseTranslationUnit,
-        _dart_clang_reparseTranslationUnit>('clang_reparseTranslationUnit');
-    return _clang_reparseTranslationUnit(
+        _dart_clang_reparseTranslationUnit>('clang_reparseTranslationUnit'))(
       TU,
       num_unsaved_files,
       unsaved_files,
@@ -995,22 +962,21 @@
     );
   }
 
-  _dart_clang_reparseTranslationUnit _clang_reparseTranslationUnit;
+  _dart_clang_reparseTranslationUnit? _clang_reparseTranslationUnit;
 
   /// Returns the human-readable null-terminated C string that represents
   /// the name of the memory category.  This string should never be freed.
   ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
     int kind,
   ) {
-    _clang_getTUResourceUsageName ??= _dylib.lookupFunction<
+    return (_clang_getTUResourceUsageName ??= _dylib.lookupFunction<
         _c_clang_getTUResourceUsageName,
-        _dart_clang_getTUResourceUsageName>('clang_getTUResourceUsageName');
-    return _clang_getTUResourceUsageName(
+        _dart_clang_getTUResourceUsageName>('clang_getTUResourceUsageName'))(
       kind,
     );
   }
 
-  _dart_clang_getTUResourceUsageName _clang_getTUResourceUsageName;
+  _dart_clang_getTUResourceUsageName? _clang_getTUResourceUsageName;
 
   /// Get target information for this translation unit.
   ///
@@ -1018,30 +984,28 @@
   ffi.Pointer<CXTargetInfoImpl> clang_getTranslationUnitTargetInfo(
     ffi.Pointer<CXTranslationUnitImpl> CTUnit,
   ) {
-    _clang_getTranslationUnitTargetInfo ??= _dylib.lookupFunction<
+    return (_clang_getTranslationUnitTargetInfo ??= _dylib.lookupFunction<
             _c_clang_getTranslationUnitTargetInfo,
             _dart_clang_getTranslationUnitTargetInfo>(
-        'clang_getTranslationUnitTargetInfo');
-    return _clang_getTranslationUnitTargetInfo(
+        'clang_getTranslationUnitTargetInfo'))(
       CTUnit,
     );
   }
 
-  _dart_clang_getTranslationUnitTargetInfo _clang_getTranslationUnitTargetInfo;
+  _dart_clang_getTranslationUnitTargetInfo? _clang_getTranslationUnitTargetInfo;
 
   /// Destroy the CXTargetInfo object.
   void clang_TargetInfo_dispose(
     ffi.Pointer<CXTargetInfoImpl> Info,
   ) {
-    _clang_TargetInfo_dispose ??= _dylib.lookupFunction<
+    return (_clang_TargetInfo_dispose ??= _dylib.lookupFunction<
         _c_clang_TargetInfo_dispose,
-        _dart_clang_TargetInfo_dispose>('clang_TargetInfo_dispose');
-    return _clang_TargetInfo_dispose(
+        _dart_clang_TargetInfo_dispose>('clang_TargetInfo_dispose'))(
       Info,
     );
   }
 
-  _dart_clang_TargetInfo_dispose _clang_TargetInfo_dispose;
+  _dart_clang_TargetInfo_dispose? _clang_TargetInfo_dispose;
 
   /// Get the pointer width of the target in bits.
   ///
@@ -1049,29 +1013,28 @@
   int clang_TargetInfo_getPointerWidth(
     ffi.Pointer<CXTargetInfoImpl> Info,
   ) {
-    _clang_TargetInfo_getPointerWidth ??= _dylib.lookupFunction<
+    return (_clang_TargetInfo_getPointerWidth ??= _dylib.lookupFunction<
             _c_clang_TargetInfo_getPointerWidth,
             _dart_clang_TargetInfo_getPointerWidth>(
-        'clang_TargetInfo_getPointerWidth');
-    return _clang_TargetInfo_getPointerWidth(
+        'clang_TargetInfo_getPointerWidth'))(
       Info,
     );
   }
 
-  _dart_clang_TargetInfo_getPointerWidth _clang_TargetInfo_getPointerWidth;
+  _dart_clang_TargetInfo_getPointerWidth? _clang_TargetInfo_getPointerWidth;
 
   /// Determine whether the given cursor kind represents a declaration.
   int clang_isDeclaration(
     int arg0,
   ) {
-    _clang_isDeclaration ??= _dylib.lookupFunction<_c_clang_isDeclaration,
-        _dart_clang_isDeclaration>('clang_isDeclaration');
-    return _clang_isDeclaration(
+    return (_clang_isDeclaration ??= _dylib.lookupFunction<
+        _c_clang_isDeclaration,
+        _dart_clang_isDeclaration>('clang_isDeclaration'))(
       arg0,
     );
   }
 
-  _dart_clang_isDeclaration _clang_isDeclaration;
+  _dart_clang_isDeclaration? _clang_isDeclaration;
 
   /// Determine whether the given cursor kind represents a simple
   /// reference.
@@ -1082,188 +1045,177 @@
   int clang_isReference(
     int arg0,
   ) {
-    _clang_isReference ??=
+    return (_clang_isReference ??=
         _dylib.lookupFunction<_c_clang_isReference, _dart_clang_isReference>(
-            'clang_isReference');
-    return _clang_isReference(
+            'clang_isReference'))(
       arg0,
     );
   }
 
-  _dart_clang_isReference _clang_isReference;
+  _dart_clang_isReference? _clang_isReference;
 
   /// Determine whether the given cursor kind represents an expression.
   int clang_isExpression(
     int arg0,
   ) {
-    _clang_isExpression ??=
+    return (_clang_isExpression ??=
         _dylib.lookupFunction<_c_clang_isExpression, _dart_clang_isExpression>(
-            'clang_isExpression');
-    return _clang_isExpression(
+            'clang_isExpression'))(
       arg0,
     );
   }
 
-  _dart_clang_isExpression _clang_isExpression;
+  _dart_clang_isExpression? _clang_isExpression;
 
   /// Determine whether the given cursor kind represents a statement.
   int clang_isStatement(
     int arg0,
   ) {
-    _clang_isStatement ??=
+    return (_clang_isStatement ??=
         _dylib.lookupFunction<_c_clang_isStatement, _dart_clang_isStatement>(
-            'clang_isStatement');
-    return _clang_isStatement(
+            'clang_isStatement'))(
       arg0,
     );
   }
 
-  _dart_clang_isStatement _clang_isStatement;
+  _dart_clang_isStatement? _clang_isStatement;
 
   /// Determine whether the given cursor kind represents an attribute.
   int clang_isAttribute(
     int arg0,
   ) {
-    _clang_isAttribute ??=
+    return (_clang_isAttribute ??=
         _dylib.lookupFunction<_c_clang_isAttribute, _dart_clang_isAttribute>(
-            'clang_isAttribute');
-    return _clang_isAttribute(
+            'clang_isAttribute'))(
       arg0,
     );
   }
 
-  _dart_clang_isAttribute _clang_isAttribute;
+  _dart_clang_isAttribute? _clang_isAttribute;
 
   /// Determine whether the given cursor kind represents an invalid
   /// cursor.
   int clang_isInvalid(
     int arg0,
   ) {
-    _clang_isInvalid ??=
+    return (_clang_isInvalid ??=
         _dylib.lookupFunction<_c_clang_isInvalid, _dart_clang_isInvalid>(
-            'clang_isInvalid');
-    return _clang_isInvalid(
+            'clang_isInvalid'))(
       arg0,
     );
   }
 
-  _dart_clang_isInvalid _clang_isInvalid;
+  _dart_clang_isInvalid? _clang_isInvalid;
 
   /// Determine whether the given cursor kind represents a translation
   /// unit.
   int clang_isTranslationUnit(
     int arg0,
   ) {
-    _clang_isTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_isTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_isTranslationUnit,
-        _dart_clang_isTranslationUnit>('clang_isTranslationUnit');
-    return _clang_isTranslationUnit(
+        _dart_clang_isTranslationUnit>('clang_isTranslationUnit'))(
       arg0,
     );
   }
 
-  _dart_clang_isTranslationUnit _clang_isTranslationUnit;
+  _dart_clang_isTranslationUnit? _clang_isTranslationUnit;
 
   /// Determine whether the given cursor represents a preprocessing
   /// element, such as a preprocessor directive or macro instantiation.
   int clang_isPreprocessing(
     int arg0,
   ) {
-    _clang_isPreprocessing ??= _dylib.lookupFunction<_c_clang_isPreprocessing,
-        _dart_clang_isPreprocessing>('clang_isPreprocessing');
-    return _clang_isPreprocessing(
+    return (_clang_isPreprocessing ??= _dylib.lookupFunction<
+        _c_clang_isPreprocessing,
+        _dart_clang_isPreprocessing>('clang_isPreprocessing'))(
       arg0,
     );
   }
 
-  _dart_clang_isPreprocessing _clang_isPreprocessing;
+  _dart_clang_isPreprocessing? _clang_isPreprocessing;
 
   /// Determine whether the given cursor represents a currently
   /// unexposed piece of the AST (e.g., CXCursor_UnexposedStmt).
   int clang_isUnexposed(
     int arg0,
   ) {
-    _clang_isUnexposed ??=
+    return (_clang_isUnexposed ??=
         _dylib.lookupFunction<_c_clang_isUnexposed, _dart_clang_isUnexposed>(
-            'clang_isUnexposed');
-    return _clang_isUnexposed(
+            'clang_isUnexposed'))(
       arg0,
     );
   }
 
-  _dart_clang_isUnexposed _clang_isUnexposed;
+  _dart_clang_isUnexposed? _clang_isUnexposed;
 
   /// Free the memory associated with a \c CXPlatformAvailability structure.
   void clang_disposeCXPlatformAvailability(
     ffi.Pointer<CXPlatformAvailability> availability,
   ) {
-    _clang_disposeCXPlatformAvailability ??= _dylib.lookupFunction<
+    return (_clang_disposeCXPlatformAvailability ??= _dylib.lookupFunction<
             _c_clang_disposeCXPlatformAvailability,
             _dart_clang_disposeCXPlatformAvailability>(
-        'clang_disposeCXPlatformAvailability');
-    return _clang_disposeCXPlatformAvailability(
+        'clang_disposeCXPlatformAvailability'))(
       availability,
     );
   }
 
-  _dart_clang_disposeCXPlatformAvailability
+  _dart_clang_disposeCXPlatformAvailability?
       _clang_disposeCXPlatformAvailability;
 
   /// Creates an empty CXCursorSet.
   ffi.Pointer<CXCursorSetImpl> clang_createCXCursorSet() {
-    _clang_createCXCursorSet ??= _dylib.lookupFunction<
+    return (_clang_createCXCursorSet ??= _dylib.lookupFunction<
         _c_clang_createCXCursorSet,
-        _dart_clang_createCXCursorSet>('clang_createCXCursorSet');
-    return _clang_createCXCursorSet();
+        _dart_clang_createCXCursorSet>('clang_createCXCursorSet'))();
   }
 
-  _dart_clang_createCXCursorSet _clang_createCXCursorSet;
+  _dart_clang_createCXCursorSet? _clang_createCXCursorSet;
 
   /// Disposes a CXCursorSet and releases its associated memory.
   void clang_disposeCXCursorSet(
     ffi.Pointer<CXCursorSetImpl> cset,
   ) {
-    _clang_disposeCXCursorSet ??= _dylib.lookupFunction<
+    return (_clang_disposeCXCursorSet ??= _dylib.lookupFunction<
         _c_clang_disposeCXCursorSet,
-        _dart_clang_disposeCXCursorSet>('clang_disposeCXCursorSet');
-    return _clang_disposeCXCursorSet(
+        _dart_clang_disposeCXCursorSet>('clang_disposeCXCursorSet'))(
       cset,
     );
   }
 
-  _dart_clang_disposeCXCursorSet _clang_disposeCXCursorSet;
+  _dart_clang_disposeCXCursorSet? _clang_disposeCXCursorSet;
 
   /// Free the set of overridden cursors returned by \c
   /// clang_getOverriddenCursors().
   void clang_disposeOverriddenCursors(
     ffi.Pointer<CXCursor> overridden,
   ) {
-    _clang_disposeOverriddenCursors ??= _dylib.lookupFunction<
-        _c_clang_disposeOverriddenCursors,
-        _dart_clang_disposeOverriddenCursors>('clang_disposeOverriddenCursors');
-    return _clang_disposeOverriddenCursors(
+    return (_clang_disposeOverriddenCursors ??= _dylib.lookupFunction<
+            _c_clang_disposeOverriddenCursors,
+            _dart_clang_disposeOverriddenCursors>(
+        'clang_disposeOverriddenCursors'))(
       overridden,
     );
   }
 
-  _dart_clang_disposeOverriddenCursors _clang_disposeOverriddenCursors;
+  _dart_clang_disposeOverriddenCursors? _clang_disposeOverriddenCursors;
 
   /// Get a property value for the given printing policy.
   int clang_PrintingPolicy_getProperty(
     ffi.Pointer<ffi.Void> Policy,
     int Property,
   ) {
-    _clang_PrintingPolicy_getProperty ??= _dylib.lookupFunction<
+    return (_clang_PrintingPolicy_getProperty ??= _dylib.lookupFunction<
             _c_clang_PrintingPolicy_getProperty,
             _dart_clang_PrintingPolicy_getProperty>(
-        'clang_PrintingPolicy_getProperty');
-    return _clang_PrintingPolicy_getProperty(
+        'clang_PrintingPolicy_getProperty'))(
       Policy,
       Property,
     );
   }
 
-  _dart_clang_PrintingPolicy_getProperty _clang_PrintingPolicy_getProperty;
+  _dart_clang_PrintingPolicy_getProperty? _clang_PrintingPolicy_getProperty;
 
   /// Set a property value for the given printing policy.
   void clang_PrintingPolicy_setProperty(
@@ -1271,32 +1223,30 @@
     int Property,
     int Value,
   ) {
-    _clang_PrintingPolicy_setProperty ??= _dylib.lookupFunction<
+    return (_clang_PrintingPolicy_setProperty ??= _dylib.lookupFunction<
             _c_clang_PrintingPolicy_setProperty,
             _dart_clang_PrintingPolicy_setProperty>(
-        'clang_PrintingPolicy_setProperty');
-    return _clang_PrintingPolicy_setProperty(
+        'clang_PrintingPolicy_setProperty'))(
       Policy,
       Property,
       Value,
     );
   }
 
-  _dart_clang_PrintingPolicy_setProperty _clang_PrintingPolicy_setProperty;
+  _dart_clang_PrintingPolicy_setProperty? _clang_PrintingPolicy_setProperty;
 
   /// Release a printing policy.
   void clang_PrintingPolicy_dispose(
     ffi.Pointer<ffi.Void> Policy,
   ) {
-    _clang_PrintingPolicy_dispose ??= _dylib.lookupFunction<
+    return (_clang_PrintingPolicy_dispose ??= _dylib.lookupFunction<
         _c_clang_PrintingPolicy_dispose,
-        _dart_clang_PrintingPolicy_dispose>('clang_PrintingPolicy_dispose');
-    return _clang_PrintingPolicy_dispose(
+        _dart_clang_PrintingPolicy_dispose>('clang_PrintingPolicy_dispose'))(
       Policy,
     );
   }
 
-  _dart_clang_PrintingPolicy_dispose _clang_PrintingPolicy_dispose;
+  _dart_clang_PrintingPolicy_dispose? _clang_PrintingPolicy_dispose;
 
   /// Given a CXFile header file, return the module that contains it, if one
   /// exists.
@@ -1304,15 +1254,15 @@
     ffi.Pointer<CXTranslationUnitImpl> arg0,
     ffi.Pointer<ffi.Void> arg1,
   ) {
-    _clang_getModuleForFile ??= _dylib.lookupFunction<_c_clang_getModuleForFile,
-        _dart_clang_getModuleForFile>('clang_getModuleForFile');
-    return _clang_getModuleForFile(
+    return (_clang_getModuleForFile ??= _dylib.lookupFunction<
+        _c_clang_getModuleForFile,
+        _dart_clang_getModuleForFile>('clang_getModuleForFile'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_clang_getModuleForFile _clang_getModuleForFile;
+  _dart_clang_getModuleForFile? _clang_getModuleForFile;
 
   /// \param Module a module object.
   ///
@@ -1320,15 +1270,14 @@
   ffi.Pointer<ffi.Void> clang_Module_getASTFile(
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_getASTFile ??= _dylib.lookupFunction<
+    return (_clang_Module_getASTFile ??= _dylib.lookupFunction<
         _c_clang_Module_getASTFile,
-        _dart_clang_Module_getASTFile>('clang_Module_getASTFile');
-    return _clang_Module_getASTFile(
+        _dart_clang_Module_getASTFile>('clang_Module_getASTFile'))(
       Module,
     );
   }
 
-  _dart_clang_Module_getASTFile _clang_Module_getASTFile;
+  _dart_clang_Module_getASTFile? _clang_Module_getASTFile;
 
   /// \param Module a module object.
   ///
@@ -1337,14 +1286,14 @@
   ffi.Pointer<ffi.Void> clang_Module_getParent(
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_getParent ??= _dylib.lookupFunction<_c_clang_Module_getParent,
-        _dart_clang_Module_getParent>('clang_Module_getParent');
-    return _clang_Module_getParent(
+    return (_clang_Module_getParent ??= _dylib.lookupFunction<
+        _c_clang_Module_getParent,
+        _dart_clang_Module_getParent>('clang_Module_getParent'))(
       Module,
     );
   }
 
-  _dart_clang_Module_getParent _clang_Module_getParent;
+  _dart_clang_Module_getParent? _clang_Module_getParent;
 
   /// \param Module a module object.
   ///
@@ -1352,14 +1301,14 @@
   int clang_Module_isSystem(
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_isSystem ??= _dylib.lookupFunction<_c_clang_Module_isSystem,
-        _dart_clang_Module_isSystem>('clang_Module_isSystem');
-    return _clang_Module_isSystem(
+    return (_clang_Module_isSystem ??= _dylib.lookupFunction<
+        _c_clang_Module_isSystem,
+        _dart_clang_Module_isSystem>('clang_Module_isSystem'))(
       Module,
     );
   }
 
-  _dart_clang_Module_isSystem _clang_Module_isSystem;
+  _dart_clang_Module_isSystem? _clang_Module_isSystem;
 
   /// \param Module a module object.
   ///
@@ -1368,17 +1317,16 @@
     ffi.Pointer<CXTranslationUnitImpl> arg0,
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_getNumTopLevelHeaders ??= _dylib.lookupFunction<
+    return (_clang_Module_getNumTopLevelHeaders ??= _dylib.lookupFunction<
             _c_clang_Module_getNumTopLevelHeaders,
             _dart_clang_Module_getNumTopLevelHeaders>(
-        'clang_Module_getNumTopLevelHeaders');
-    return _clang_Module_getNumTopLevelHeaders(
+        'clang_Module_getNumTopLevelHeaders'))(
       arg0,
       Module,
     );
   }
 
-  _dart_clang_Module_getNumTopLevelHeaders _clang_Module_getNumTopLevelHeaders;
+  _dart_clang_Module_getNumTopLevelHeaders? _clang_Module_getNumTopLevelHeaders;
 
   /// \param Module a module object.
   ///
@@ -1390,17 +1338,17 @@
     ffi.Pointer<ffi.Void> Module,
     int Index,
   ) {
-    _clang_Module_getTopLevelHeader ??= _dylib.lookupFunction<
-        _c_clang_Module_getTopLevelHeader,
-        _dart_clang_Module_getTopLevelHeader>('clang_Module_getTopLevelHeader');
-    return _clang_Module_getTopLevelHeader(
+    return (_clang_Module_getTopLevelHeader ??= _dylib.lookupFunction<
+            _c_clang_Module_getTopLevelHeader,
+            _dart_clang_Module_getTopLevelHeader>(
+        'clang_Module_getTopLevelHeader'))(
       arg0,
       Module,
       Index,
     );
   }
 
-  _dart_clang_Module_getTopLevelHeader _clang_Module_getTopLevelHeader;
+  _dart_clang_Module_getTopLevelHeader? _clang_Module_getTopLevelHeader;
 
   /// Annotate the given set of tokens by providing cursors for each token
   /// that can be mapped to a specific entity within the abstract syntax tree.
@@ -1436,9 +1384,9 @@
     int NumTokens,
     ffi.Pointer<CXCursor> Cursors,
   ) {
-    _clang_annotateTokens ??= _dylib.lookupFunction<_c_clang_annotateTokens,
-        _dart_clang_annotateTokens>('clang_annotateTokens');
-    return _clang_annotateTokens(
+    return (_clang_annotateTokens ??= _dylib.lookupFunction<
+        _c_clang_annotateTokens,
+        _dart_clang_annotateTokens>('clang_annotateTokens'))(
       TU,
       Tokens,
       NumTokens,
@@ -1446,7 +1394,7 @@
     );
   }
 
-  _dart_clang_annotateTokens _clang_annotateTokens;
+  _dart_clang_annotateTokens? _clang_annotateTokens;
 
   /// Free the given set of tokens.
   void clang_disposeTokens(
@@ -1454,41 +1402,40 @@
     ffi.Pointer<CXToken> Tokens,
     int NumTokens,
   ) {
-    _clang_disposeTokens ??= _dylib.lookupFunction<_c_clang_disposeTokens,
-        _dart_clang_disposeTokens>('clang_disposeTokens');
-    return _clang_disposeTokens(
+    return (_clang_disposeTokens ??= _dylib.lookupFunction<
+        _c_clang_disposeTokens,
+        _dart_clang_disposeTokens>('clang_disposeTokens'))(
       TU,
       Tokens,
       NumTokens,
     );
   }
 
-  _dart_clang_disposeTokens _clang_disposeTokens;
+  _dart_clang_disposeTokens? _clang_disposeTokens;
 
   void clang_enableStackTraces() {
-    _clang_enableStackTraces ??= _dylib.lookupFunction<
+    return (_clang_enableStackTraces ??= _dylib.lookupFunction<
         _c_clang_enableStackTraces,
-        _dart_clang_enableStackTraces>('clang_enableStackTraces');
-    return _clang_enableStackTraces();
+        _dart_clang_enableStackTraces>('clang_enableStackTraces'))();
   }
 
-  _dart_clang_enableStackTraces _clang_enableStackTraces;
+  _dart_clang_enableStackTraces? _clang_enableStackTraces;
 
   void clang_executeOnThread(
     ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
     ffi.Pointer<ffi.Void> user_data,
     int stack_size,
   ) {
-    _clang_executeOnThread ??= _dylib.lookupFunction<_c_clang_executeOnThread,
-        _dart_clang_executeOnThread>('clang_executeOnThread');
-    return _clang_executeOnThread(
+    return (_clang_executeOnThread ??= _dylib.lookupFunction<
+        _c_clang_executeOnThread,
+        _dart_clang_executeOnThread>('clang_executeOnThread'))(
       fn,
       user_data,
       stack_size,
     );
   }
 
-  _dart_clang_executeOnThread _clang_executeOnThread;
+  _dart_clang_executeOnThread? _clang_executeOnThread;
 
   /// Determine the kind of a particular chunk within a completion string.
   ///
@@ -1501,16 +1448,15 @@
     ffi.Pointer<ffi.Void> completion_string,
     int chunk_number,
   ) {
-    _clang_getCompletionChunkKind ??= _dylib.lookupFunction<
+    return (_clang_getCompletionChunkKind ??= _dylib.lookupFunction<
         _c_clang_getCompletionChunkKind,
-        _dart_clang_getCompletionChunkKind>('clang_getCompletionChunkKind');
-    return _clang_getCompletionChunkKind(
+        _dart_clang_getCompletionChunkKind>('clang_getCompletionChunkKind'))(
       completion_string,
       chunk_number,
     );
   }
 
-  _dart_clang_getCompletionChunkKind _clang_getCompletionChunkKind;
+  _dart_clang_getCompletionChunkKind? _clang_getCompletionChunkKind;
 
   /// Retrieve the completion string associated with a particular chunk
   /// within a completion string.
@@ -1525,32 +1471,30 @@
     ffi.Pointer<ffi.Void> completion_string,
     int chunk_number,
   ) {
-    _clang_getCompletionChunkCompletionString ??= _dylib.lookupFunction<
+    return (_clang_getCompletionChunkCompletionString ??= _dylib.lookupFunction<
             _c_clang_getCompletionChunkCompletionString,
             _dart_clang_getCompletionChunkCompletionString>(
-        'clang_getCompletionChunkCompletionString');
-    return _clang_getCompletionChunkCompletionString(
+        'clang_getCompletionChunkCompletionString'))(
       completion_string,
       chunk_number,
     );
   }
 
-  _dart_clang_getCompletionChunkCompletionString
+  _dart_clang_getCompletionChunkCompletionString?
       _clang_getCompletionChunkCompletionString;
 
   /// Retrieve the number of chunks in the given code-completion string.
   int clang_getNumCompletionChunks(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getNumCompletionChunks ??= _dylib.lookupFunction<
+    return (_clang_getNumCompletionChunks ??= _dylib.lookupFunction<
         _c_clang_getNumCompletionChunks,
-        _dart_clang_getNumCompletionChunks>('clang_getNumCompletionChunks');
-    return _clang_getNumCompletionChunks(
+        _dart_clang_getNumCompletionChunks>('clang_getNumCompletionChunks'))(
       completion_string,
     );
   }
 
-  _dart_clang_getNumCompletionChunks _clang_getNumCompletionChunks;
+  _dart_clang_getNumCompletionChunks? _clang_getNumCompletionChunks;
 
   /// Determine the priority of this code completion.
   ///
@@ -1565,15 +1509,14 @@
   int clang_getCompletionPriority(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getCompletionPriority ??= _dylib.lookupFunction<
+    return (_clang_getCompletionPriority ??= _dylib.lookupFunction<
         _c_clang_getCompletionPriority,
-        _dart_clang_getCompletionPriority>('clang_getCompletionPriority');
-    return _clang_getCompletionPriority(
+        _dart_clang_getCompletionPriority>('clang_getCompletionPriority'))(
       completion_string,
     );
   }
 
-  _dart_clang_getCompletionPriority _clang_getCompletionPriority;
+  _dart_clang_getCompletionPriority? _clang_getCompletionPriority;
 
   /// Determine the availability of the entity that this code-completion
   /// string refers to.
@@ -1584,16 +1527,15 @@
   int clang_getCompletionAvailability(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getCompletionAvailability ??= _dylib.lookupFunction<
+    return (_clang_getCompletionAvailability ??= _dylib.lookupFunction<
             _c_clang_getCompletionAvailability,
             _dart_clang_getCompletionAvailability>(
-        'clang_getCompletionAvailability');
-    return _clang_getCompletionAvailability(
+        'clang_getCompletionAvailability'))(
       completion_string,
     );
   }
 
-  _dart_clang_getCompletionAvailability _clang_getCompletionAvailability;
+  _dart_clang_getCompletionAvailability? _clang_getCompletionAvailability;
 
   /// Retrieve the number of annotations associated with the given
   /// completion string.
@@ -1605,16 +1547,15 @@
   int clang_getCompletionNumAnnotations(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getCompletionNumAnnotations ??= _dylib.lookupFunction<
+    return (_clang_getCompletionNumAnnotations ??= _dylib.lookupFunction<
             _c_clang_getCompletionNumAnnotations,
             _dart_clang_getCompletionNumAnnotations>(
-        'clang_getCompletionNumAnnotations');
-    return _clang_getCompletionNumAnnotations(
+        'clang_getCompletionNumAnnotations'))(
       completion_string,
     );
   }
 
-  _dart_clang_getCompletionNumAnnotations _clang_getCompletionNumAnnotations;
+  _dart_clang_getCompletionNumAnnotations? _clang_getCompletionNumAnnotations;
 
   /// Retrieve the number of fix-its for the given completion index.
   ///
@@ -1631,28 +1572,26 @@
     ffi.Pointer<CXCodeCompleteResults> results,
     int completion_index,
   ) {
-    _clang_getCompletionNumFixIts ??= _dylib.lookupFunction<
+    return (_clang_getCompletionNumFixIts ??= _dylib.lookupFunction<
         _c_clang_getCompletionNumFixIts,
-        _dart_clang_getCompletionNumFixIts>('clang_getCompletionNumFixIts');
-    return _clang_getCompletionNumFixIts(
+        _dart_clang_getCompletionNumFixIts>('clang_getCompletionNumFixIts'))(
       results,
       completion_index,
     );
   }
 
-  _dart_clang_getCompletionNumFixIts _clang_getCompletionNumFixIts;
+  _dart_clang_getCompletionNumFixIts? _clang_getCompletionNumFixIts;
 
   /// Returns a default set of code-completion options that can be
   /// passed to\c clang_codeCompleteAt().
   int clang_defaultCodeCompleteOptions() {
-    _clang_defaultCodeCompleteOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultCodeCompleteOptions ??= _dylib.lookupFunction<
             _c_clang_defaultCodeCompleteOptions,
             _dart_clang_defaultCodeCompleteOptions>(
-        'clang_defaultCodeCompleteOptions');
-    return _clang_defaultCodeCompleteOptions();
+        'clang_defaultCodeCompleteOptions'))();
   }
 
-  _dart_clang_defaultCodeCompleteOptions _clang_defaultCodeCompleteOptions;
+  _dart_clang_defaultCodeCompleteOptions? _clang_defaultCodeCompleteOptions;
 
   /// Perform code completion at a given location in a translation unit.
   ///
@@ -1729,9 +1668,9 @@
     int num_unsaved_files,
     int options,
   ) {
-    _clang_codeCompleteAt ??= _dylib.lookupFunction<_c_clang_codeCompleteAt,
-        _dart_clang_codeCompleteAt>('clang_codeCompleteAt');
-    return _clang_codeCompleteAt(
+    return (_clang_codeCompleteAt ??= _dylib.lookupFunction<
+        _c_clang_codeCompleteAt,
+        _dart_clang_codeCompleteAt>('clang_codeCompleteAt'))(
       TU,
       complete_filename,
       complete_line,
@@ -1742,7 +1681,7 @@
     );
   }
 
-  _dart_clang_codeCompleteAt _clang_codeCompleteAt;
+  _dart_clang_codeCompleteAt? _clang_codeCompleteAt;
 
   /// Sort the code-completion results in case-insensitive alphabetical
   /// order.
@@ -1753,48 +1692,45 @@
     ffi.Pointer<CXCompletionResult> Results,
     int NumResults,
   ) {
-    _clang_sortCodeCompletionResults ??= _dylib.lookupFunction<
+    return (_clang_sortCodeCompletionResults ??= _dylib.lookupFunction<
             _c_clang_sortCodeCompletionResults,
             _dart_clang_sortCodeCompletionResults>(
-        'clang_sortCodeCompletionResults');
-    return _clang_sortCodeCompletionResults(
+        'clang_sortCodeCompletionResults'))(
       Results,
       NumResults,
     );
   }
 
-  _dart_clang_sortCodeCompletionResults _clang_sortCodeCompletionResults;
+  _dart_clang_sortCodeCompletionResults? _clang_sortCodeCompletionResults;
 
   /// Free the given set of code-completion results.
   void clang_disposeCodeCompleteResults(
     ffi.Pointer<CXCodeCompleteResults> Results,
   ) {
-    _clang_disposeCodeCompleteResults ??= _dylib.lookupFunction<
+    return (_clang_disposeCodeCompleteResults ??= _dylib.lookupFunction<
             _c_clang_disposeCodeCompleteResults,
             _dart_clang_disposeCodeCompleteResults>(
-        'clang_disposeCodeCompleteResults');
-    return _clang_disposeCodeCompleteResults(
+        'clang_disposeCodeCompleteResults'))(
       Results,
     );
   }
 
-  _dart_clang_disposeCodeCompleteResults _clang_disposeCodeCompleteResults;
+  _dart_clang_disposeCodeCompleteResults? _clang_disposeCodeCompleteResults;
 
   /// Determine the number of diagnostics produced prior to the
   /// location where code completion was performed.
   int clang_codeCompleteGetNumDiagnostics(
     ffi.Pointer<CXCodeCompleteResults> Results,
   ) {
-    _clang_codeCompleteGetNumDiagnostics ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetNumDiagnostics ??= _dylib.lookupFunction<
             _c_clang_codeCompleteGetNumDiagnostics,
             _dart_clang_codeCompleteGetNumDiagnostics>(
-        'clang_codeCompleteGetNumDiagnostics');
-    return _clang_codeCompleteGetNumDiagnostics(
+        'clang_codeCompleteGetNumDiagnostics'))(
       Results,
     );
   }
 
-  _dart_clang_codeCompleteGetNumDiagnostics
+  _dart_clang_codeCompleteGetNumDiagnostics?
       _clang_codeCompleteGetNumDiagnostics;
 
   /// Retrieve a diagnostic associated with the given code completion.
@@ -1808,17 +1744,16 @@
     ffi.Pointer<CXCodeCompleteResults> Results,
     int Index,
   ) {
-    _clang_codeCompleteGetDiagnostic ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetDiagnostic ??= _dylib.lookupFunction<
             _c_clang_codeCompleteGetDiagnostic,
             _dart_clang_codeCompleteGetDiagnostic>(
-        'clang_codeCompleteGetDiagnostic');
-    return _clang_codeCompleteGetDiagnostic(
+        'clang_codeCompleteGetDiagnostic'))(
       Results,
       Index,
     );
   }
 
-  _dart_clang_codeCompleteGetDiagnostic _clang_codeCompleteGetDiagnostic;
+  _dart_clang_codeCompleteGetDiagnostic? _clang_codeCompleteGetDiagnostic;
 
   /// Determines what completions are appropriate for the context
   /// the given code completion.
@@ -1830,15 +1765,14 @@
   int clang_codeCompleteGetContexts(
     ffi.Pointer<CXCodeCompleteResults> Results,
   ) {
-    _clang_codeCompleteGetContexts ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetContexts ??= _dylib.lookupFunction<
         _c_clang_codeCompleteGetContexts,
-        _dart_clang_codeCompleteGetContexts>('clang_codeCompleteGetContexts');
-    return _clang_codeCompleteGetContexts(
+        _dart_clang_codeCompleteGetContexts>('clang_codeCompleteGetContexts'))(
       Results,
     );
   }
 
-  _dart_clang_codeCompleteGetContexts _clang_codeCompleteGetContexts;
+  _dart_clang_codeCompleteGetContexts? _clang_codeCompleteGetContexts;
 
   /// Returns the cursor kind for the container for the current code
   /// completion context. The container is only guaranteed to be set for
@@ -1858,17 +1792,16 @@
     ffi.Pointer<CXCodeCompleteResults> Results,
     ffi.Pointer<ffi.Uint32> IsIncomplete,
   ) {
-    _clang_codeCompleteGetContainerKind ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetContainerKind ??= _dylib.lookupFunction<
             _c_clang_codeCompleteGetContainerKind,
             _dart_clang_codeCompleteGetContainerKind>(
-        'clang_codeCompleteGetContainerKind');
-    return _clang_codeCompleteGetContainerKind(
+        'clang_codeCompleteGetContainerKind'))(
       Results,
       IsIncomplete,
     );
   }
 
-  _dart_clang_codeCompleteGetContainerKind _clang_codeCompleteGetContainerKind;
+  _dart_clang_codeCompleteGetContainerKind? _clang_codeCompleteGetContainerKind;
 
   /// Enable/disable crash recovery.
   ///
@@ -1877,15 +1810,14 @@
   void clang_toggleCrashRecovery(
     int isEnabled,
   ) {
-    _clang_toggleCrashRecovery ??= _dylib.lookupFunction<
+    return (_clang_toggleCrashRecovery ??= _dylib.lookupFunction<
         _c_clang_toggleCrashRecovery,
-        _dart_clang_toggleCrashRecovery>('clang_toggleCrashRecovery');
-    return _clang_toggleCrashRecovery(
+        _dart_clang_toggleCrashRecovery>('clang_toggleCrashRecovery'))(
       isEnabled,
     );
   }
 
-  _dart_clang_toggleCrashRecovery _clang_toggleCrashRecovery;
+  _dart_clang_toggleCrashRecovery? _clang_toggleCrashRecovery;
 
   /// Visit the set of preprocessor inclusions in a translation unit.
   /// The visitor function is called with the provided data for every included
@@ -1896,45 +1828,43 @@
     ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor>> visitor,
     ffi.Pointer<ffi.Void> client_data,
   ) {
-    _clang_getInclusions ??= _dylib.lookupFunction<_c_clang_getInclusions,
-        _dart_clang_getInclusions>('clang_getInclusions');
-    return _clang_getInclusions(
+    return (_clang_getInclusions ??= _dylib.lookupFunction<
+        _c_clang_getInclusions,
+        _dart_clang_getInclusions>('clang_getInclusions'))(
       tu,
       visitor,
       client_data,
     );
   }
 
-  _dart_clang_getInclusions _clang_getInclusions;
+  _dart_clang_getInclusions? _clang_getInclusions;
 
   /// Returns the kind of the evaluated result.
   int clang_EvalResult_getKind(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getKind ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getKind ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getKind,
-        _dart_clang_EvalResult_getKind>('clang_EvalResult_getKind');
-    return _clang_EvalResult_getKind(
+        _dart_clang_EvalResult_getKind>('clang_EvalResult_getKind'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getKind _clang_EvalResult_getKind;
+  _dart_clang_EvalResult_getKind? _clang_EvalResult_getKind;
 
   /// Returns the evaluation result as integer if the
   /// kind is Int.
   int clang_EvalResult_getAsInt(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsInt ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getAsInt ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsInt,
-        _dart_clang_EvalResult_getAsInt>('clang_EvalResult_getAsInt');
-    return _clang_EvalResult_getAsInt(
+        _dart_clang_EvalResult_getAsInt>('clang_EvalResult_getAsInt'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsInt _clang_EvalResult_getAsInt;
+  _dart_clang_EvalResult_getAsInt? _clang_EvalResult_getAsInt;
 
   /// Returns the evaluation result as a long long integer if the
   /// kind is Int. This prevents overflows that may happen if the result is
@@ -1942,60 +1872,59 @@
   int clang_EvalResult_getAsLongLong(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsLongLong ??= _dylib.lookupFunction<
-        _c_clang_EvalResult_getAsLongLong,
-        _dart_clang_EvalResult_getAsLongLong>('clang_EvalResult_getAsLongLong');
-    return _clang_EvalResult_getAsLongLong(
+    return (_clang_EvalResult_getAsLongLong ??= _dylib.lookupFunction<
+            _c_clang_EvalResult_getAsLongLong,
+            _dart_clang_EvalResult_getAsLongLong>(
+        'clang_EvalResult_getAsLongLong'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsLongLong _clang_EvalResult_getAsLongLong;
+  _dart_clang_EvalResult_getAsLongLong? _clang_EvalResult_getAsLongLong;
 
   /// Returns a non-zero value if the kind is Int and the evaluation
   /// result resulted in an unsigned integer.
   int clang_EvalResult_isUnsignedInt(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_isUnsignedInt ??= _dylib.lookupFunction<
-        _c_clang_EvalResult_isUnsignedInt,
-        _dart_clang_EvalResult_isUnsignedInt>('clang_EvalResult_isUnsignedInt');
-    return _clang_EvalResult_isUnsignedInt(
+    return (_clang_EvalResult_isUnsignedInt ??= _dylib.lookupFunction<
+            _c_clang_EvalResult_isUnsignedInt,
+            _dart_clang_EvalResult_isUnsignedInt>(
+        'clang_EvalResult_isUnsignedInt'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_isUnsignedInt _clang_EvalResult_isUnsignedInt;
+  _dart_clang_EvalResult_isUnsignedInt? _clang_EvalResult_isUnsignedInt;
 
   /// Returns the evaluation result as an unsigned integer if
   /// the kind is Int and clang_EvalResult_isUnsignedInt is non-zero.
   int clang_EvalResult_getAsUnsigned(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsUnsigned ??= _dylib.lookupFunction<
-        _c_clang_EvalResult_getAsUnsigned,
-        _dart_clang_EvalResult_getAsUnsigned>('clang_EvalResult_getAsUnsigned');
-    return _clang_EvalResult_getAsUnsigned(
+    return (_clang_EvalResult_getAsUnsigned ??= _dylib.lookupFunction<
+            _c_clang_EvalResult_getAsUnsigned,
+            _dart_clang_EvalResult_getAsUnsigned>(
+        'clang_EvalResult_getAsUnsigned'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsUnsigned _clang_EvalResult_getAsUnsigned;
+  _dart_clang_EvalResult_getAsUnsigned? _clang_EvalResult_getAsUnsigned;
 
   /// Returns the evaluation result as double if the
   /// kind is double.
   double clang_EvalResult_getAsDouble(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsDouble ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getAsDouble ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsDouble,
-        _dart_clang_EvalResult_getAsDouble>('clang_EvalResult_getAsDouble');
-    return _clang_EvalResult_getAsDouble(
+        _dart_clang_EvalResult_getAsDouble>('clang_EvalResult_getAsDouble'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsDouble _clang_EvalResult_getAsDouble;
+  _dart_clang_EvalResult_getAsDouble? _clang_EvalResult_getAsDouble;
 
   /// Returns the evaluation result as a constant string if the
   /// kind is other than Int or float. User must not free this pointer,
@@ -2004,29 +1933,27 @@
   ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsStr ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getAsStr ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsStr,
-        _dart_clang_EvalResult_getAsStr>('clang_EvalResult_getAsStr');
-    return _clang_EvalResult_getAsStr(
+        _dart_clang_EvalResult_getAsStr>('clang_EvalResult_getAsStr'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsStr _clang_EvalResult_getAsStr;
+  _dart_clang_EvalResult_getAsStr? _clang_EvalResult_getAsStr;
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_dispose ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_dispose ??= _dylib.lookupFunction<
         _c_clang_EvalResult_dispose,
-        _dart_clang_EvalResult_dispose>('clang_EvalResult_dispose');
-    return _clang_EvalResult_dispose(
+        _dart_clang_EvalResult_dispose>('clang_EvalResult_dispose'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_dispose _clang_EvalResult_dispose;
+  _dart_clang_EvalResult_dispose? _clang_EvalResult_dispose;
 
   /// Retrieve a remapping.
   ///
@@ -2037,14 +1964,14 @@
   ffi.Pointer<ffi.Void> clang_getRemappings(
     ffi.Pointer<ffi.Int8> path,
   ) {
-    _clang_getRemappings ??= _dylib.lookupFunction<_c_clang_getRemappings,
-        _dart_clang_getRemappings>('clang_getRemappings');
-    return _clang_getRemappings(
+    return (_clang_getRemappings ??= _dylib.lookupFunction<
+        _c_clang_getRemappings,
+        _dart_clang_getRemappings>('clang_getRemappings'))(
       path,
     );
   }
 
-  _dart_clang_getRemappings _clang_getRemappings;
+  _dart_clang_getRemappings? _clang_getRemappings;
 
   /// Retrieve a remapping.
   ///
@@ -2058,31 +1985,29 @@
     ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
     int numFiles,
   ) {
-    _clang_getRemappingsFromFileList ??= _dylib.lookupFunction<
+    return (_clang_getRemappingsFromFileList ??= _dylib.lookupFunction<
             _c_clang_getRemappingsFromFileList,
             _dart_clang_getRemappingsFromFileList>(
-        'clang_getRemappingsFromFileList');
-    return _clang_getRemappingsFromFileList(
+        'clang_getRemappingsFromFileList'))(
       filePaths,
       numFiles,
     );
   }
 
-  _dart_clang_getRemappingsFromFileList _clang_getRemappingsFromFileList;
+  _dart_clang_getRemappingsFromFileList? _clang_getRemappingsFromFileList;
 
   /// Determine the number of remappings.
   int clang_remap_getNumFiles(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_remap_getNumFiles ??= _dylib.lookupFunction<
+    return (_clang_remap_getNumFiles ??= _dylib.lookupFunction<
         _c_clang_remap_getNumFiles,
-        _dart_clang_remap_getNumFiles>('clang_remap_getNumFiles');
-    return _clang_remap_getNumFiles(
+        _dart_clang_remap_getNumFiles>('clang_remap_getNumFiles'))(
       arg0,
     );
   }
 
-  _dart_clang_remap_getNumFiles _clang_remap_getNumFiles;
+  _dart_clang_remap_getNumFiles? _clang_remap_getNumFiles;
 
   /// Get the original and the associated filename from the remapping.
   ///
@@ -2096,10 +2021,9 @@
     ffi.Pointer<CXString> original,
     ffi.Pointer<CXString> transformed,
   ) {
-    _clang_remap_getFilenames ??= _dylib.lookupFunction<
+    return (_clang_remap_getFilenames ??= _dylib.lookupFunction<
         _c_clang_remap_getFilenames,
-        _dart_clang_remap_getFilenames>('clang_remap_getFilenames');
-    return _clang_remap_getFilenames(
+        _dart_clang_remap_getFilenames>('clang_remap_getFilenames'))(
       arg0,
       index,
       original,
@@ -2107,156 +2031,148 @@
     );
   }
 
-  _dart_clang_remap_getFilenames _clang_remap_getFilenames;
+  _dart_clang_remap_getFilenames? _clang_remap_getFilenames;
 
   /// Dispose the remapping.
   void clang_remap_dispose(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_remap_dispose ??= _dylib.lookupFunction<_c_clang_remap_dispose,
-        _dart_clang_remap_dispose>('clang_remap_dispose');
-    return _clang_remap_dispose(
+    return (_clang_remap_dispose ??= _dylib.lookupFunction<
+        _c_clang_remap_dispose,
+        _dart_clang_remap_dispose>('clang_remap_dispose'))(
       arg0,
     );
   }
 
-  _dart_clang_remap_dispose _clang_remap_dispose;
+  _dart_clang_remap_dispose? _clang_remap_dispose;
 
   int clang_index_isEntityObjCContainerKind(
     int arg0,
   ) {
-    _clang_index_isEntityObjCContainerKind ??= _dylib.lookupFunction<
+    return (_clang_index_isEntityObjCContainerKind ??= _dylib.lookupFunction<
             _c_clang_index_isEntityObjCContainerKind,
             _dart_clang_index_isEntityObjCContainerKind>(
-        'clang_index_isEntityObjCContainerKind');
-    return _clang_index_isEntityObjCContainerKind(
+        'clang_index_isEntityObjCContainerKind'))(
       arg0,
     );
   }
 
-  _dart_clang_index_isEntityObjCContainerKind
+  _dart_clang_index_isEntityObjCContainerKind?
       _clang_index_isEntityObjCContainerKind;
 
   ffi.Pointer<CXIdxObjCContainerDeclInfo> clang_index_getObjCContainerDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCContainerDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCContainerDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCContainerDeclInfo,
             _dart_clang_index_getObjCContainerDeclInfo>(
-        'clang_index_getObjCContainerDeclInfo');
-    return _clang_index_getObjCContainerDeclInfo(
+        'clang_index_getObjCContainerDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCContainerDeclInfo
+  _dart_clang_index_getObjCContainerDeclInfo?
       _clang_index_getObjCContainerDeclInfo;
 
   ffi.Pointer<CXIdxObjCInterfaceDeclInfo> clang_index_getObjCInterfaceDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCInterfaceDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCInterfaceDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCInterfaceDeclInfo,
             _dart_clang_index_getObjCInterfaceDeclInfo>(
-        'clang_index_getObjCInterfaceDeclInfo');
-    return _clang_index_getObjCInterfaceDeclInfo(
+        'clang_index_getObjCInterfaceDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCInterfaceDeclInfo
+  _dart_clang_index_getObjCInterfaceDeclInfo?
       _clang_index_getObjCInterfaceDeclInfo;
 
   ffi.Pointer<CXIdxObjCCategoryDeclInfo> clang_index_getObjCCategoryDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCCategoryDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCCategoryDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCCategoryDeclInfo,
             _dart_clang_index_getObjCCategoryDeclInfo>(
-        'clang_index_getObjCCategoryDeclInfo');
-    return _clang_index_getObjCCategoryDeclInfo(
+        'clang_index_getObjCCategoryDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCCategoryDeclInfo
+  _dart_clang_index_getObjCCategoryDeclInfo?
       _clang_index_getObjCCategoryDeclInfo;
 
   ffi.Pointer<CXIdxObjCProtocolRefListInfo>
       clang_index_getObjCProtocolRefListInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCProtocolRefListInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCProtocolRefListInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCProtocolRefListInfo,
             _dart_clang_index_getObjCProtocolRefListInfo>(
-        'clang_index_getObjCProtocolRefListInfo');
-    return _clang_index_getObjCProtocolRefListInfo(
+        'clang_index_getObjCProtocolRefListInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCProtocolRefListInfo
+  _dart_clang_index_getObjCProtocolRefListInfo?
       _clang_index_getObjCProtocolRefListInfo;
 
   ffi.Pointer<CXIdxObjCPropertyDeclInfo> clang_index_getObjCPropertyDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCPropertyDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCPropertyDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCPropertyDeclInfo,
             _dart_clang_index_getObjCPropertyDeclInfo>(
-        'clang_index_getObjCPropertyDeclInfo');
-    return _clang_index_getObjCPropertyDeclInfo(
+        'clang_index_getObjCPropertyDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCPropertyDeclInfo
+  _dart_clang_index_getObjCPropertyDeclInfo?
       _clang_index_getObjCPropertyDeclInfo;
 
   ffi.Pointer<CXIdxIBOutletCollectionAttrInfo>
       clang_index_getIBOutletCollectionAttrInfo(
     ffi.Pointer<CXIdxAttrInfo> arg0,
   ) {
-    _clang_index_getIBOutletCollectionAttrInfo ??= _dylib.lookupFunction<
-            _c_clang_index_getIBOutletCollectionAttrInfo,
-            _dart_clang_index_getIBOutletCollectionAttrInfo>(
-        'clang_index_getIBOutletCollectionAttrInfo');
-    return _clang_index_getIBOutletCollectionAttrInfo(
+    return (_clang_index_getIBOutletCollectionAttrInfo ??=
+        _dylib.lookupFunction<_c_clang_index_getIBOutletCollectionAttrInfo,
+                _dart_clang_index_getIBOutletCollectionAttrInfo>(
+            'clang_index_getIBOutletCollectionAttrInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getIBOutletCollectionAttrInfo
+  _dart_clang_index_getIBOutletCollectionAttrInfo?
       _clang_index_getIBOutletCollectionAttrInfo;
 
   ffi.Pointer<CXIdxCXXClassDeclInfo> clang_index_getCXXClassDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getCXXClassDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getCXXClassDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getCXXClassDeclInfo,
             _dart_clang_index_getCXXClassDeclInfo>(
-        'clang_index_getCXXClassDeclInfo');
-    return _clang_index_getCXXClassDeclInfo(
+        'clang_index_getCXXClassDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getCXXClassDeclInfo _clang_index_getCXXClassDeclInfo;
+  _dart_clang_index_getCXXClassDeclInfo? _clang_index_getCXXClassDeclInfo;
 
   /// For retrieving a custom CXIdxClientContainer attached to a
   /// container.
   ffi.Pointer<ffi.Void> clang_index_getClientContainer(
     ffi.Pointer<CXIdxContainerInfo> arg0,
   ) {
-    _clang_index_getClientContainer ??= _dylib.lookupFunction<
-        _c_clang_index_getClientContainer,
-        _dart_clang_index_getClientContainer>('clang_index_getClientContainer');
-    return _clang_index_getClientContainer(
+    return (_clang_index_getClientContainer ??= _dylib.lookupFunction<
+            _c_clang_index_getClientContainer,
+            _dart_clang_index_getClientContainer>(
+        'clang_index_getClientContainer'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getClientContainer _clang_index_getClientContainer;
+  _dart_clang_index_getClientContainer? _clang_index_getClientContainer;
 
   /// For setting a custom CXIdxClientContainer attached to a
   /// container.
@@ -2264,46 +2180,44 @@
     ffi.Pointer<CXIdxContainerInfo> arg0,
     ffi.Pointer<ffi.Void> arg1,
   ) {
-    _clang_index_setClientContainer ??= _dylib.lookupFunction<
-        _c_clang_index_setClientContainer,
-        _dart_clang_index_setClientContainer>('clang_index_setClientContainer');
-    return _clang_index_setClientContainer(
+    return (_clang_index_setClientContainer ??= _dylib.lookupFunction<
+            _c_clang_index_setClientContainer,
+            _dart_clang_index_setClientContainer>(
+        'clang_index_setClientContainer'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_clang_index_setClientContainer _clang_index_setClientContainer;
+  _dart_clang_index_setClientContainer? _clang_index_setClientContainer;
 
   /// For retrieving a custom CXIdxClientEntity attached to an entity.
   ffi.Pointer<ffi.Void> clang_index_getClientEntity(
     ffi.Pointer<CXIdxEntityInfo> arg0,
   ) {
-    _clang_index_getClientEntity ??= _dylib.lookupFunction<
+    return (_clang_index_getClientEntity ??= _dylib.lookupFunction<
         _c_clang_index_getClientEntity,
-        _dart_clang_index_getClientEntity>('clang_index_getClientEntity');
-    return _clang_index_getClientEntity(
+        _dart_clang_index_getClientEntity>('clang_index_getClientEntity'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getClientEntity _clang_index_getClientEntity;
+  _dart_clang_index_getClientEntity? _clang_index_getClientEntity;
 
   /// For setting a custom CXIdxClientEntity attached to an entity.
   void clang_index_setClientEntity(
     ffi.Pointer<CXIdxEntityInfo> arg0,
     ffi.Pointer<ffi.Void> arg1,
   ) {
-    _clang_index_setClientEntity ??= _dylib.lookupFunction<
+    return (_clang_index_setClientEntity ??= _dylib.lookupFunction<
         _c_clang_index_setClientEntity,
-        _dart_clang_index_setClientEntity>('clang_index_setClientEntity');
-    return _clang_index_setClientEntity(
+        _dart_clang_index_setClientEntity>('clang_index_setClientEntity'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_clang_index_setClientEntity _clang_index_setClientEntity;
+  _dart_clang_index_setClientEntity? _clang_index_setClientEntity;
 
   /// An indexing action/session, to be applied to one or multiple
   /// translation units.
@@ -2312,15 +2226,14 @@
   ffi.Pointer<ffi.Void> clang_IndexAction_create(
     ffi.Pointer<ffi.Void> CIdx,
   ) {
-    _clang_IndexAction_create ??= _dylib.lookupFunction<
+    return (_clang_IndexAction_create ??= _dylib.lookupFunction<
         _c_clang_IndexAction_create,
-        _dart_clang_IndexAction_create>('clang_IndexAction_create');
-    return _clang_IndexAction_create(
+        _dart_clang_IndexAction_create>('clang_IndexAction_create'))(
       CIdx,
     );
   }
 
-  _dart_clang_IndexAction_create _clang_IndexAction_create;
+  _dart_clang_IndexAction_create? _clang_IndexAction_create;
 
   /// Destroy the given index action.
   ///
@@ -2329,15 +2242,14 @@
   void clang_IndexAction_dispose(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_IndexAction_dispose ??= _dylib.lookupFunction<
+    return (_clang_IndexAction_dispose ??= _dylib.lookupFunction<
         _c_clang_IndexAction_dispose,
-        _dart_clang_IndexAction_dispose>('clang_IndexAction_dispose');
-    return _clang_IndexAction_dispose(
+        _dart_clang_IndexAction_dispose>('clang_IndexAction_dispose'))(
       arg0,
     );
   }
 
-  _dart_clang_IndexAction_dispose _clang_IndexAction_dispose;
+  _dart_clang_IndexAction_dispose? _clang_IndexAction_dispose;
 
   /// Index the given source file and the translation unit corresponding
   /// to that file via callbacks implemented through #IndexerCallbacks.
@@ -2376,9 +2288,9 @@
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
     int TU_options,
   ) {
-    _clang_indexSourceFile ??= _dylib.lookupFunction<_c_clang_indexSourceFile,
-        _dart_clang_indexSourceFile>('clang_indexSourceFile');
-    return _clang_indexSourceFile(
+    return (_clang_indexSourceFile ??= _dylib.lookupFunction<
+        _c_clang_indexSourceFile,
+        _dart_clang_indexSourceFile>('clang_indexSourceFile'))(
       arg0,
       client_data,
       index_callbacks,
@@ -2394,7 +2306,7 @@
     );
   }
 
-  _dart_clang_indexSourceFile _clang_indexSourceFile;
+  _dart_clang_indexSourceFile? _clang_indexSourceFile;
 
   /// Same as clang_indexSourceFile but requires a full command line
   /// for \c command_line_args including argv[0]. This is useful if the standard
@@ -2413,10 +2325,9 @@
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
     int TU_options,
   ) {
-    _clang_indexSourceFileFullArgv ??= _dylib.lookupFunction<
+    return (_clang_indexSourceFileFullArgv ??= _dylib.lookupFunction<
         _c_clang_indexSourceFileFullArgv,
-        _dart_clang_indexSourceFileFullArgv>('clang_indexSourceFileFullArgv');
-    return _clang_indexSourceFileFullArgv(
+        _dart_clang_indexSourceFileFullArgv>('clang_indexSourceFileFullArgv'))(
       arg0,
       client_data,
       index_callbacks,
@@ -2432,7 +2343,7 @@
     );
   }
 
-  _dart_clang_indexSourceFileFullArgv _clang_indexSourceFileFullArgv;
+  _dart_clang_indexSourceFileFullArgv? _clang_indexSourceFileFullArgv;
 
   /// Index the given translation unit via callbacks implemented through
   /// #IndexerCallbacks.
@@ -2456,10 +2367,9 @@
     int index_options,
     ffi.Pointer<CXTranslationUnitImpl> arg5,
   ) {
-    _clang_indexTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_indexTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_indexTranslationUnit,
-        _dart_clang_indexTranslationUnit>('clang_indexTranslationUnit');
-    return _clang_indexTranslationUnit(
+        _dart_clang_indexTranslationUnit>('clang_indexTranslationUnit'))(
       arg0,
       client_data,
       index_callbacks,
@@ -2469,7 +2379,7 @@
     );
   }
 
-  _dart_clang_indexTranslationUnit _clang_indexTranslationUnit;
+  _dart_clang_indexTranslationUnit? _clang_indexTranslationUnit;
 }
 
 /// A character string.
@@ -2479,17 +2389,17 @@
 /// Use \c clang_getCString() to retrieve the string data and, once finished
 /// with the string data, call \c clang_disposeString() to free the string.
 class CXString extends ffi.Struct {
-  ffi.Pointer<ffi.Void> data;
+  external ffi.Pointer<ffi.Void> data;
 
   @ffi.Uint32()
-  int private_flags;
+  external int private_flags;
 }
 
 class CXStringSet extends ffi.Struct {
-  ffi.Pointer<CXString> Strings;
+  external ffi.Pointer<CXString> Strings;
 
   @ffi.Uint32()
-  int Count;
+  external int Count;
 }
 
 class CXTargetInfoImpl extends ffi.Struct {}
@@ -2505,14 +2415,14 @@
   /// The file whose contents have not yet been saved.
   ///
   /// This file must already exist in the file system.
-  ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<ffi.Int8> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<ffi.Int8> Contents;
 
   /// The length of the unsaved contents of this buffer.
   @ffi.Uint64()
-  int Length;
+  external int Length;
 }
 
 /// Describes a version number of the form major.minor.subminor.
@@ -2520,19 +2430,19 @@
   /// The major version number, e.g., the '10' in '10.7.3'. A negative
   /// value indicates that there is no version number at all.
   @ffi.Int32()
-  int Major;
+  external int Major;
 
   /// The minor version number, e.g., the '7' in '10.7.3'. This value
   /// will be negative if no minor version number was provided, e.g., for
   /// version '10'.
   @ffi.Int32()
-  int Minor;
+  external int Minor;
 
   /// The subminor version number, e.g., the '3' in '10.7.3'. This value
   /// will be negative if no minor or subminor version number was provided,
   /// e.g., in version '10' or '10.7'.
   @ffi.Int32()
-  int Subminor;
+  external int Subminor;
 }
 
 abstract class CXGlobalOptFlags {
@@ -2562,11 +2472,11 @@
 /// across an indexing session.
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Uint64()
-  int _unique_data_item_0;
+  external int _unique_data_item_0;
   @ffi.Uint64()
-  int _unique_data_item_1;
+  external int _unique_data_item_1;
   @ffi.Uint64()
-  int _unique_data_item_2;
+  external int _unique_data_item_2;
 
   /// Helper for array `data`.
   ArrayHelper_CXFileUniqueID_data_level0 get data =>
@@ -2627,14 +2537,14 @@
 /// Use clang_getExpansionLocation() or clang_getSpellingLocation()
 /// to map a source location to a particular file, line, and column.
 class CXSourceLocation extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceLocation_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXSourceLocation_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int int_data;
+  external int int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXSourceLocation`.
@@ -2685,17 +2595,17 @@
 /// Use clang_getRangeStart() and clang_getRangeEnd() to retrieve the
 /// starting and end locations from a source range, respectively.
 class CXSourceRange extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceRange_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXSourceRange_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int begin_int_data;
+  external int begin_int_data;
 
   @ffi.Uint32()
-  int end_int_data;
+  external int end_int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXSourceRange`.
@@ -2745,28 +2655,28 @@
 class CXSourceRangeList extends ffi.Struct {
   /// The number of ranges in the \c ranges array.
   @ffi.Uint32()
-  int count;
+  external int count;
 
   /// An array of \c CXSourceRanges.
-  ffi.Pointer<CXSourceRange> ranges;
+  external ffi.Pointer<CXSourceRange> ranges;
 }
 
 class CXTUResourceUsageEntry extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  external int kind;
 
   @ffi.Uint64()
-  int amount;
+  external int amount;
 }
 
 /// The memory usage of a CXTranslationUnit, broken into categories.
 class CXTUResourceUsage extends ffi.Struct {
-  ffi.Pointer<ffi.Void> data;
+  external ffi.Pointer<ffi.Void> data;
 
   @ffi.Uint32()
-  int numEntries;
+  external int numEntries;
 
-  ffi.Pointer<CXTUResourceUsageEntry> entries;
+  external ffi.Pointer<CXTUResourceUsageEntry> entries;
 }
 
 /// A cursor representing some element in the abstract syntax tree for
@@ -2787,14 +2697,14 @@
 /// source code into the AST.
 class CXCursor extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  external int kind;
 
   @ffi.Int32()
-  int xdata;
+  external int xdata;
 
-  ffi.Pointer<ffi.Void> _unique_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_data_item_1;
-  ffi.Pointer<ffi.Void> _unique_data_item_2;
+  external ffi.Pointer<ffi.Void> _unique_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_data_item_2;
 
   /// Helper for array `data`.
   ArrayHelper_CXCursor_data_level0 get data =>
@@ -2988,10 +2898,10 @@
 /// The type of an element in the abstract syntax tree.
 class CXType extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  external int kind;
 
-  ffi.Pointer<ffi.Void> _unique_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_data_item_1;
 
   /// Helper for array `data`.
   ArrayHelper_CXType_data_level0 get data =>
@@ -3044,18 +2954,18 @@
 /// Describes a single preprocessing token.
 class CXToken extends ffi.Struct {
   @ffi.Uint32()
-  int _unique_int_data_item_0;
+  external int _unique_int_data_item_0;
   @ffi.Uint32()
-  int _unique_int_data_item_1;
+  external int _unique_int_data_item_1;
   @ffi.Uint32()
-  int _unique_int_data_item_2;
+  external int _unique_int_data_item_2;
   @ffi.Uint32()
-  int _unique_int_data_item_3;
+  external int _unique_int_data_item_3;
 
   /// Helper for array `int_data`.
   ArrayHelper_CXToken_int_data_level0 get int_data =>
       ArrayHelper_CXToken_int_data_level0(this, [4], 0, 0);
-  ffi.Pointer<ffi.Void> ptr_data;
+  external ffi.Pointer<ffi.Void> ptr_data;
 }
 
 /// Helper for array `int_data` in struct `CXToken`.
@@ -3122,11 +3032,11 @@
   /// \todo In the future, we would like to provide a full cursor, to allow
   /// the client to extract additional information from declaration.
   @ffi.Int32()
-  int CursorKind;
+  external int CursorKind;
 
   /// The code-completion string that describes how to insert this
   /// code-completion result into the editing buffer.
-  ffi.Pointer<ffi.Void> CompletionString;
+  external ffi.Pointer<ffi.Void> CompletionString;
 }
 
 /// Contains the results of code-completion.
@@ -3136,26 +3046,26 @@
 /// \c clang_disposeCodeCompleteResults.
 class CXCodeCompleteResults extends ffi.Struct {
   /// The code-completion results.
-  ffi.Pointer<CXCompletionResult> Results;
+  external ffi.Pointer<CXCompletionResult> Results;
 
   /// The number of code-completion results stored in the
   /// \c Results array.
   @ffi.Uint32()
-  int NumResults;
+  external int NumResults;
 }
 
 class CXCursorAndRangeVisitor extends ffi.Struct {}
 
 /// Source location passed to index callbacks.
 class CXIdxLoc extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXIdxLoc_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXIdxLoc_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int int_data;
+  external int int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXIdxLoc`.
@@ -3218,10 +3128,10 @@
 class CXIdxDeclInfo extends ffi.Struct {}
 
 class CXIdxObjCContainerDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
+  external ffi.Pointer<CXIdxDeclInfo> declInfo;
 
   @ffi.Int32()
-  int kind;
+  external int kind;
 }
 
 class CXIdxBaseClassInfo extends ffi.Struct {}
@@ -3229,37 +3139,37 @@
 class CXIdxObjCProtocolRefInfo extends ffi.Struct {}
 
 class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
-  ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
+  external ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
 
   @ffi.Uint32()
-  int numProtocols;
+  external int numProtocols;
 }
 
 class CXIdxObjCInterfaceDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;
+  external ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;
 
-  ffi.Pointer<CXIdxBaseClassInfo> superInfo;
+  external ffi.Pointer<CXIdxBaseClassInfo> superInfo;
 
-  ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
+  external ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
 }
 
 class CXIdxObjCCategoryDeclInfo extends ffi.Struct {}
 
 class CXIdxObjCPropertyDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
+  external ffi.Pointer<CXIdxDeclInfo> declInfo;
 
-  ffi.Pointer<CXIdxEntityInfo> getter;
+  external ffi.Pointer<CXIdxEntityInfo> getter;
 
-  ffi.Pointer<CXIdxEntityInfo> setter;
+  external ffi.Pointer<CXIdxEntityInfo> setter;
 }
 
 class CXIdxCXXClassDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
+  external ffi.Pointer<CXIdxDeclInfo> declInfo;
 
-  ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
+  external ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
 
   @ffi.Uint32()
-  int numBases;
+  external int numBases;
 }
 
 /// Data for IndexerCallbacks#indexEntityReference.
@@ -3270,15 +3180,15 @@
 class IndexerCallbacks extends ffi.Struct {
   /// Called periodically to check whether indexing should be aborted.
   /// Should return 0 to continue, and non-zero to abort.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> abortQuery;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> abortQuery;
 
   /// Called at the end of indexing; passes the complete diagnostic set.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_3>> diagnostic;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_3>> diagnostic;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_4>> enteredMainFile;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_4>> enteredMainFile;
 
   /// Called when a file gets \#included/\#imported.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_5>> ppIncludedFile;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_5>> ppIncludedFile;
 
   /// Called when a AST file (PCH or module) gets imported.
   ///
@@ -3286,15 +3196,15 @@
   /// the entities in an AST file). The recommended action is that, if the AST
   /// file is not already indexed, to initiate a new indexing job specific to
   /// the AST file.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_6>> importedASTFile;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_6>> importedASTFile;
 
   /// Called at the beginning of indexing a translation unit.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_7>> startedTranslationUnit;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_7>> startedTranslationUnit;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_8>> indexDeclaration;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_8>> indexDeclaration;
 
   /// Called to index a reference of an entity.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_9>> indexEntityReference;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_9>> indexEntityReference;
 }
 
 const int CINDEX_VERSION_MAJOR = 0;
diff --git a/example/libclang-example/pubspec.yaml b/example/libclang-example/pubspec.yaml
index ba3067f..e1a3cfc 100644
--- a/example/libclang-example/pubspec.yaml
+++ b/example/libclang-example/pubspec.yaml
@@ -5,7 +5,7 @@
 name: libclang_example
 
 environment:
-  sdk: '>=2.8.1 <3.0.0'
+  sdk: '>=2.12.0-29.10.beta <3.0.0'
 
 dev_dependencies:
   ffigen:
diff --git a/example/simple/generated_bindings.dart b/example/simple/generated_bindings.dart
index 9b0b3a2..9a94f0d 100644
--- a/example/simple/generated_bindings.dart
+++ b/example/simple/generated_bindings.dart
@@ -16,74 +16,70 @@
     int a,
     int b,
   ) {
-    _sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum');
-    return _sum(
+    return (_sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum'))(
       a,
       b,
     );
   }
 
-  _dart_sum _sum;
+  _dart_sum? _sum;
 
   /// Subtracts 2 integers.
   int subtract(
     ffi.Pointer<ffi.Int32> a,
     int b,
   ) {
-    _subtract ??=
-        _dylib.lookupFunction<_c_subtract, _dart_subtract>('subtract');
-    return _subtract(
+    return (_subtract ??=
+        _dylib.lookupFunction<_c_subtract, _dart_subtract>('subtract'))(
       a,
       b,
     );
   }
 
-  _dart_subtract _subtract;
+  _dart_subtract? _subtract;
 
   /// Multiplies 2 integers, returns pointer to an integer,.
   ffi.Pointer<ffi.Int32> multiply(
     int a,
     int b,
   ) {
-    _multiply ??=
-        _dylib.lookupFunction<_c_multiply, _dart_multiply>('multiply');
-    return _multiply(
+    return (_multiply ??=
+        _dylib.lookupFunction<_c_multiply, _dart_multiply>('multiply'))(
       a,
       b,
     );
   }
 
-  _dart_multiply _multiply;
+  _dart_multiply? _multiply;
 
   /// Divides 2 integers, returns pointer to a float.
   ffi.Pointer<ffi.Float> divide(
     int a,
     int b,
   ) {
-    _divide ??= _dylib.lookupFunction<_c_divide, _dart_divide>('divide');
-    return _divide(
+    return (_divide ??=
+        _dylib.lookupFunction<_c_divide, _dart_divide>('divide'))(
       a,
       b,
     );
   }
 
-  _dart_divide _divide;
+  _dart_divide? _divide;
 
   /// Divides 2 floats, returns a pointer to double.
   ffi.Pointer<ffi.Double> dividePercision(
     ffi.Pointer<ffi.Float> a,
     ffi.Pointer<ffi.Float> b,
   ) {
-    _dividePercision ??=
+    return (_dividePercision ??=
         _dylib.lookupFunction<_c_dividePercision, _dart_dividePercision>(
-            'dividePercision');
-    return _dividePercision(
+            'dividePercision'))(
       a,
       b,
     );
   }
 
-  _dart_dividePercision _dividePercision;
+  _dart_dividePercision? _dividePercision;
 }
 
 typedef _c_sum = ffi.Int32 Function(
diff --git a/example/simple/pubspec.yaml b/example/simple/pubspec.yaml
index c742a26..9e461ec 100644
--- a/example/simple/pubspec.yaml
+++ b/example/simple/pubspec.yaml
@@ -5,7 +5,7 @@
 name: simple_example
 
 environment:
-  sdk: '>=2.8.1 <3.0.0'
+  sdk: '>=2.12.0-29.10.beta <3.0.0'
 
 dev_dependencies:
   ffigen:
diff --git a/lib/src/code_generator/binding.dart b/lib/src/code_generator/binding.dart
index 4f24d58..877f243 100644
--- a/lib/src/code_generator/binding.dart
+++ b/lib/src/code_generator/binding.dart
@@ -2,8 +2,6 @@
 // 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 'binding_string.dart';
 import 'typedef.dart';
 import 'writer.dart';
@@ -21,12 +19,12 @@
   /// Binding name to generate, may get changed to resolve name conflicts.
   String name;
 
-  final String dartDoc;
+  final String? dartDoc;
 
   Binding({
-    @required this.usr,
-    @required this.originalName,
-    @required this.name,
+    required this.usr,
+    required this.originalName,
+    required this.name,
     this.dartDoc,
   });
 
@@ -43,10 +41,10 @@
 /// Base class for bindings which look up symbols in dynamic library.
 abstract class LookUpBinding extends Binding {
   LookUpBinding({
-    String usr,
-    String originalName,
-    @required String name,
-    String dartDoc,
+    String? usr,
+    String? originalName,
+    required String name,
+    String? dartDoc,
   }) : super(
           usr: usr ?? name,
           originalName: originalName ?? name,
@@ -58,10 +56,10 @@
 /// Base class for bindings which don't look up symbols in dynamic library.
 abstract class NoLookUpBinding extends Binding {
   NoLookUpBinding({
-    String usr,
-    String originalName,
-    @required String name,
-    String dartDoc,
+    String? usr,
+    String? originalName,
+    required String name,
+    String? dartDoc,
   }) : super(
           usr: usr ?? name,
           originalName: originalName ?? name,
diff --git a/lib/src/code_generator/binding_string.dart b/lib/src/code_generator/binding_string.dart
index c0d4325..a2b721e 100644
--- a/lib/src/code_generator/binding_string.dart
+++ b/lib/src/code_generator/binding_string.dart
@@ -2,15 +2,13 @@
 // 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';
-
 /// A Binding's String representation.
 class BindingString {
   // Meta data, (not used for generation).
   final BindingStringType type;
   final String string;
 
-  const BindingString({@required this.type, @required this.string});
+  const BindingString({required this.type, required this.string});
 
   @override
   String toString() => string;
diff --git a/lib/src/code_generator/constant.dart b/lib/src/code_generator/constant.dart
index 617f2d7..41a9961 100644
--- a/lib/src/code_generator/constant.dart
+++ b/lib/src/code_generator/constant.dart
@@ -2,8 +2,6 @@
 // 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 'binding.dart';
 import 'binding_string.dart';
 import 'utils.dart';
@@ -30,12 +28,12 @@
   final String rawValue;
 
   Constant({
-    String usr,
-    String originalName,
-    @required String name,
-    String dartDoc,
-    @required this.rawType,
-    @required this.rawValue,
+    String? usr,
+    String? originalName,
+    required String name,
+    String? dartDoc,
+    required this.rawType,
+    required this.rawValue,
   }) : super(
           usr: usr,
           originalName: originalName,
@@ -49,7 +47,7 @@
     final constantName = name;
 
     if (dartDoc != null) {
-      s.write(makeDartDoc(dartDoc));
+      s.write(makeDartDoc(dartDoc!));
     }
 
     s.write('const ${rawType} $constantName = $rawValue;\n\n');
diff --git a/lib/src/code_generator/enum_class.dart b/lib/src/code_generator/enum_class.dart
index 867133a..249ab8c 100644
--- a/lib/src/code_generator/enum_class.dart
+++ b/lib/src/code_generator/enum_class.dart
@@ -2,8 +2,6 @@
 // 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 'binding.dart';
 import 'binding_string.dart';
 import 'utils.dart';
@@ -27,11 +25,11 @@
   final List<EnumConstant> enumConstants;
 
   EnumClass({
-    String usr,
-    String originalName,
-    @required String name,
-    String dartDoc,
-    List<EnumConstant> enumConstants,
+    String? usr,
+    String? originalName,
+    required String name,
+    String? dartDoc,
+    List<EnumConstant>? enumConstants,
   })  : enumConstants = enumConstants ?? [],
         super(
           usr: usr,
@@ -46,7 +44,7 @@
     final enclosingClassName = name;
 
     if (dartDoc != null) {
-      s.write(makeDartDoc(dartDoc));
+      s.write(makeDartDoc(dartDoc!));
     }
 
     /// Adding [enclosingClassName] because dart doesn't allow class member
@@ -60,7 +58,7 @@
       final enum_value_name = localUniqueNamer.makeUnique(ec.name);
       if (ec.dartDoc != null) {
         s.write(depth + '/// ');
-        s.writeAll(ec.dartDoc.split('\n'), '\n' + depth + '/// ');
+        s.writeAll(ec.dartDoc!.split('\n'), '\n' + depth + '/// ');
         s.write('\n');
       }
       s.write(depth + 'static const int ${enum_value_name} = ${ec.value};\n');
@@ -74,14 +72,14 @@
 
 /// Represents a single value in an enum.
 class EnumConstant {
-  final String originalName;
-  final String dartDoc;
+  final String? originalName;
+  final String? dartDoc;
   final String name;
   final int value;
   const EnumConstant({
-    String originalName,
-    @required this.name,
-    @required this.value,
+    String? originalName,
+    required this.name,
+    required this.value,
     this.dartDoc,
   }) : originalName = originalName ?? name;
 }
diff --git a/lib/src/code_generator/func.dart b/lib/src/code_generator/func.dart
index a55f6d2..5a526a5 100644
--- a/lib/src/code_generator/func.dart
+++ b/lib/src/code_generator/func.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:meta/meta.dart';
 
 import 'binding.dart';
 import 'binding_string.dart';
@@ -36,12 +35,12 @@
   /// [originalName] is looked up in dynamic library, if not
   /// provided, takes the value of [name].
   Func({
-    String usr,
-    @required String name,
-    String originalName,
-    String dartDoc,
-    @required this.returnType,
-    List<Parameter> parameters,
+    String? usr,
+    required String name,
+    String? originalName,
+    String? dartDoc,
+    required this.returnType,
+    List<Parameter>? parameters,
   })  : parameters = parameters ?? [],
         super(
           usr: usr,
@@ -50,14 +49,13 @@
           dartDoc: dartDoc,
         ) {
     for (var i = 0; i < this.parameters.length; i++) {
-      if (this.parameters[i].name == null ||
-          this.parameters[i].name.trim() == '') {
+      if (this.parameters[i].name.trim() == '') {
         this.parameters[i].name = 'arg$i';
       }
     }
   }
 
-  List<Typedef> _typedefDependencies;
+  List<Typedef>? _typedefDependencies;
   @override
   List<Typedef> getTypedefDependencies(Writer w) {
     if (_typedefDependencies == null) {
@@ -66,26 +64,26 @@
       // Add typedef's required by return type.
       final returnTypeBase = returnType.getBaseType();
       if (returnTypeBase.broadType == BroadType.NativeFunction) {
-        _typedefDependencies
-            .addAll(returnTypeBase.nativeFunc.getDependencies());
+        _typedefDependencies!
+            .addAll(returnTypeBase.nativeFunc!.getDependencies());
       }
 
       // Add typedef's required by parameters.
       for (final p in parameters) {
         final base = p.type.getBaseType();
         if (base.broadType == BroadType.NativeFunction) {
-          _typedefDependencies.addAll(base.nativeFunc.getDependencies());
+          _typedefDependencies!.addAll(base.nativeFunc!.getDependencies());
         }
       }
       // Add C function typedef.
-      _typedefDependencies.add(cType);
+      _typedefDependencies!.add(cType);
       // Add Dart function typedef.
-      _typedefDependencies.add(dartType);
+      _typedefDependencies!.add(dartType);
     }
-    return _typedefDependencies;
+    return _typedefDependencies!;
   }
 
-  Typedef _cType, _dartType;
+  Typedef? _cType, _dartType;
   Typedef get cType => _cType ??= Typedef(
         name: '_c_$name',
         returnType: returnType,
@@ -106,7 +104,7 @@
     final funcVarName = w.wrapperLevelUniqueNamer.makeUnique('_$name');
 
     if (dartDoc != null) {
-      s.write(makeDartDoc(dartDoc));
+      s.write(makeDartDoc(dartDoc!));
     }
     // Resolve name conflicts in function parameter names.
     final paramNamer = UniqueNamer({});
@@ -130,9 +128,9 @@
     }
     s.write(') {\n');
     s.write(
-        "$funcVarName ??= ${w.dylibIdentifier}.lookupFunction<${cType.name},${dartType.name}>('$originalName');\n");
+        "return ($funcVarName ??= ${w.dylibIdentifier}.lookupFunction<${cType.name},${dartType.name}>('$originalName'))");
 
-    s.write('  return $funcVarName(\n');
+    s.write('(\n');
     for (final p in parameters) {
       if (w.dartBool && p.type.broadType == BroadType.Boolean) {
         // Convert bool parameter to int before calling.
@@ -150,7 +148,7 @@
     s.write('}\n');
 
     // Write function variable.
-    s.write('${dartType.name} $funcVarName;\n\n');
+    s.write('${dartType.name}? $funcVarName;\n\n');
 
     return BindingString(type: BindingStringType.func, string: s.toString());
   }
@@ -158,11 +156,11 @@
 
 /// Represents a Parameter, used in [Func] and [Typedef].
 class Parameter {
-  final String originalName;
+  final String? originalName;
   String name;
   final Type type;
 
-  Parameter({String originalName, this.name = '', @required Type type})
+  Parameter({String? originalName, this.name = '', required Type type})
       : originalName = originalName ?? name,
         // A type with broadtype [BroadType.NativeFunction] is wrapped with a
         // pointer because this is a shorthand used in C for Pointer to function.
diff --git a/lib/src/code_generator/global.dart b/lib/src/code_generator/global.dart
index 817844d..b52fa70 100644
--- a/lib/src/code_generator/global.dart
+++ b/lib/src/code_generator/global.dart
@@ -2,8 +2,6 @@
 // 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 'binding.dart';
 import 'binding_string.dart';
 import 'type.dart';
@@ -24,11 +22,11 @@
   final Type type;
 
   Global({
-    String usr,
-    String originalName,
-    @required String name,
-    @required this.type,
-    String dartDoc,
+    String? usr,
+    String? originalName,
+    required String name,
+    required this.type,
+    String? dartDoc,
   }) : super(
           usr: usr,
           originalName: originalName,
@@ -41,7 +39,7 @@
     final s = StringBuffer();
     final globalVarName = name;
     if (dartDoc != null) {
-      s.write(makeDartDoc(dartDoc));
+      s.write(makeDartDoc(dartDoc!));
     }
 
     final holderVarName =
diff --git a/lib/src/code_generator/library.dart b/lib/src/code_generator/library.dart
index e1d2390..4ea8e65 100644
--- a/lib/src/code_generator/library.dart
+++ b/lib/src/code_generator/library.dart
@@ -6,7 +6,6 @@
 
 import 'package:cli_util/cli_util.dart';
 import 'package:logging/logging.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as p;
 import 'package:pub_semver/pub_semver.dart';
 import 'binding.dart';
@@ -20,14 +19,14 @@
   /// List of bindings in this library.
   final List<Binding> bindings;
 
-  Writer _writer;
+  late Writer _writer;
   Writer get writer => _writer;
 
   Library({
-    @required String name,
-    String description,
-    @required this.bindings,
-    String header,
+    required String name,
+    String? description,
+    required this.bindings,
+    String? header,
     bool dartBool = true,
   }) {
     // Seperate bindings which require lookup.
@@ -116,8 +115,7 @@
 
   /// Generates the bindings.
   String generate() {
-    final w = writer;
-    return w.generate();
+    return writer.generate();
   }
 
   @override
diff --git a/lib/src/code_generator/struc.dart b/lib/src/code_generator/struc.dart
index a17649b..ee8a523 100644
--- a/lib/src/code_generator/struc.dart
+++ b/lib/src/code_generator/struc.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator/typedef.dart';
-import 'package:meta/meta.dart';
 
 import 'binding.dart';
 import 'binding_string.dart';
@@ -39,11 +38,11 @@
   List<Member> members;
 
   Struc({
-    String usr,
-    String originalName,
-    @required String name,
-    String dartDoc,
-    List<Member> members,
+    String? usr,
+    String? originalName,
+    required String name,
+    String? dartDoc,
+    List<Member>? members,
   })  : members = members ?? [],
         super(
           usr: usr,
@@ -56,13 +55,13 @@
     final array = <int>[];
     var startType = type;
     while (startType.broadType == BroadType.ConstantArray) {
-      array.add(startType.length);
-      startType = startType.child;
+      array.add(startType.length!);
+      startType = startType.child!;
     }
     return array;
   }
 
-  List<Typedef> _typedefDependencies;
+  List<Typedef>? _typedefDependencies;
   @override
   List<Typedef> getTypedefDependencies(Writer w) {
     if (_typedefDependencies == null) {
@@ -72,20 +71,19 @@
       for (final m in members) {
         final base = m.type.getBaseType();
         if (base.broadType == BroadType.NativeFunction) {
-          _typedefDependencies.addAll(base.nativeFunc.getDependencies());
+          _typedefDependencies!.addAll(base.nativeFunc!.getDependencies());
         }
       }
     }
-    return _typedefDependencies;
+    return _typedefDependencies ?? [];
   }
 
   @override
   BindingString toBindingString(Writer w) {
-    members = members ?? [];
     final s = StringBuffer();
     final enclosingClassName = name;
     if (dartDoc != null) {
-      s.write(makeDartDoc(dartDoc));
+      s.write(makeDartDoc(dartDoc!));
     }
 
     final helpers = <ArrayHelper>[];
@@ -118,13 +116,13 @@
         const depth = '  ';
         if (m.dartDoc != null) {
           s.write(depth + '/// ');
-          s.writeAll(m.dartDoc.split('\n'), '\n' + depth + '/// ');
+          s.writeAll(m.dartDoc!.split('\n'), '\n' + depth + '/// ');
           s.write('\n');
         }
         if (m.type.isPrimitive) {
           s.write('$depth@${m.type.getCType(w)}()\n');
         }
-        s.write('$depth${m.type.getDartType(w)} ${memberName};\n\n');
+        s.write('${depth}external ${m.type.getDartType(w)} ${memberName};\n\n');
       }
     }
     s.write('}\n\n');
@@ -154,15 +152,15 @@
 }
 
 class Member {
-  final String dartDoc;
+  final String? dartDoc;
   final String originalName;
   final String name;
   final Type type;
 
   const Member({
-    String originalName,
-    @required this.name,
-    @required this.type,
+    String? originalName,
+    required this.name,
+    required this.type,
     this.dartDoc,
   }) : originalName = originalName ?? name;
 }
@@ -171,15 +169,15 @@
 class ArrayHelper {
   final Type elementType;
   final List<int> dimensions;
-  final String structName;
+  final String? structName;
 
-  final String name;
+  final String? name;
   final String helperClassGroupName;
   final String elementNamePrefix;
 
-  int _expandedArrayLength;
+  int? _expandedArrayLength;
   int get expandedArrayLength {
-    if (_expandedArrayLength != null) return _expandedArrayLength;
+    if (_expandedArrayLength != null) return _expandedArrayLength!;
 
     var arrayLength = 1;
     for (final i in dimensions) {
@@ -189,12 +187,12 @@
   }
 
   ArrayHelper({
-    @required this.elementType,
-    @required this.dimensions,
-    @required this.structName,
-    @required this.name,
-    @required this.helperClassGroupName,
-    @required this.elementNamePrefix,
+    required this.elementType,
+    required this.dimensions,
+    required this.structName,
+    required this.name,
+    required this.helperClassGroupName,
+    required this.elementNamePrefix,
   });
 
   /// Create declaration binding, added inside the struct binding.
@@ -207,7 +205,7 @@
       if (elementType.isPrimitive) {
         s.write('  @${arrayCType}()\n');
       }
-      s.write('  ${arrayDartType} ${elementNamePrefix}$i;\n');
+      s.write('  external ${arrayDartType} ${elementNamePrefix}$i;\n');
     }
 
     s.write('/// Helper for array `$name`.\n');
diff --git a/lib/src/code_generator/type.dart b/lib/src/code_generator/type.dart
index 5922b38..0f2071e 100644
--- a/lib/src/code_generator/type.dart
+++ b/lib/src/code_generator/type.dart
@@ -2,8 +2,6 @@
 // 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 'struc.dart';
 import 'typedef.dart';
 import 'writer.dart';
@@ -12,7 +10,7 @@
   final String c;
   final String dart;
 
-  const _SubType({this.c, this.dart});
+  const _SubType({required this.c, required this.dart});
 }
 
 enum SupportedNativeType {
@@ -69,28 +67,28 @@
   };
 
   /// Reference to the [Struc] binding this type refers to.
-  Struc struc;
+  Struc? struc;
 
   /// Reference to the [Typedef] this type refers to.
-  Typedef nativeFunc;
+  Typedef? nativeFunc;
 
   /// For providing [SupportedNativeType] only.
-  final SupportedNativeType nativeType;
+  final SupportedNativeType? nativeType;
 
   /// The BroadType of this Type.
   final BroadType broadType;
 
   /// Child Type, e.g Pointer(Parent) to Int(Child), or Child Type of an Array.
-  final Type child;
+  final Type? child;
 
   /// For ConstantArray and IncompleteArray type.
-  final int length;
+  final int? length;
 
   /// For storing cursor type info for an unimplemented type.
-  String unimplementedReason;
+  String? unimplementedReason;
 
   Type._({
-    @required this.broadType,
+    required this.broadType,
     this.child,
     this.struc,
     this.nativeType,
@@ -102,13 +100,13 @@
   factory Type.pointer(Type child) {
     return Type._(broadType: BroadType.Pointer, child: child);
   }
-  factory Type.struct(Struc struc) {
+  factory Type.struct(Struc? struc) {
     return Type._(broadType: BroadType.Struct, struc: struc);
   }
-  factory Type.nativeFunc(Typedef nativeFunc) {
+  factory Type.nativeFunc(Typedef? nativeFunc) {
     return Type._(broadType: BroadType.NativeFunction, nativeFunc: nativeFunc);
   }
-  factory Type.nativeType(SupportedNativeType nativeType) {
+  factory Type.nativeType(SupportedNativeType? nativeType) {
     return Type._(broadType: BroadType.NativeType, nativeType: nativeType);
   }
   factory Type.constantArray(int length, Type elementType) {
@@ -143,7 +141,7 @@
   /// double[2][3] has base [Type] of double.
   Type getBaseType() {
     if (child != null) {
-      return child.getBaseType();
+      return child!.getBaseType();
     } else {
       return this;
     }
@@ -155,7 +153,7 @@
   Type getBaseArrayType() {
     if (broadType == BroadType.ConstantArray ||
         broadType == BroadType.IncompleteArray) {
-      return child.getBaseArrayType();
+      return child!.getBaseArrayType();
     } else {
       return this;
     }
@@ -167,21 +165,21 @@
   String getCType(Writer w) {
     switch (broadType) {
       case BroadType.NativeType:
-        return '${w.ffiLibraryPrefix}.${_primitives[nativeType].c}';
+        return '${w.ffiLibraryPrefix}.${_primitives[nativeType!]!.c}';
       case BroadType.Pointer:
-        return '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>';
+        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
       case BroadType.Struct:
-        return '${struc.name}';
+        return '${struc!.name}';
       case BroadType.NativeFunction:
-        return '${w.ffiLibraryPrefix}.NativeFunction<${nativeFunc.name}>';
+        return '${w.ffiLibraryPrefix}.NativeFunction<${nativeFunc!.name}>';
       case BroadType
           .IncompleteArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>';
+        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
       case BroadType
           .ConstantArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>';
+        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
       case BroadType.Boolean: // Booleans are treated as uint8.
-        return '${w.ffiLibraryPrefix}.${_primitives[SupportedNativeType.Uint8].c}';
+        return '${w.ffiLibraryPrefix}.${_primitives[SupportedNativeType.Uint8]!.c}';
       case BroadType.Handle:
         return '${w.ffiLibraryPrefix}.Handle';
       default:
@@ -189,24 +187,24 @@
     }
   }
 
-  String getDartType(Writer w) {
+  String? getDartType(Writer w) {
     switch (broadType) {
       case BroadType.NativeType:
-        return _primitives[nativeType].dart;
+        return _primitives[nativeType!]!.dart;
       case BroadType.Pointer:
-        return '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>';
+        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
       case BroadType.Struct:
-        return '${struc.name}';
+        return '${struc!.name}';
       case BroadType.NativeFunction:
-        return '${w.ffiLibraryPrefix}.NativeFunction<${nativeFunc.name}>';
+        return '${w.ffiLibraryPrefix}.NativeFunction<${nativeFunc!.name}>';
       case BroadType
           .IncompleteArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>';
+        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
       case BroadType
           .ConstantArray: // Array parameters are treated as Pointers in C.
-        return '${w.ffiLibraryPrefix}.Pointer<${child.getCType(w)}>';
+        return '${w.ffiLibraryPrefix}.Pointer<${child!.getCType(w)}>';
       case BroadType.Boolean: // Booleans are treated as uint8.
-        return _primitives[SupportedNativeType.Uint8].dart;
+        return _primitives[SupportedNativeType.Uint8]!.dart;
       case BroadType.Handle:
         return 'Object';
       default:
diff --git a/lib/src/code_generator/typedef.dart b/lib/src/code_generator/typedef.dart
index 7f3c684..f1ba5ad 100644
--- a/lib/src/code_generator/typedef.dart
+++ b/lib/src/code_generator/typedef.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator.dart';
-import 'package:meta/meta.dart';
 
 import 'func.dart' show Parameter;
 import 'type.dart';
@@ -25,17 +24,17 @@
 /// Note: re-set [name] after resolving name conflicts.
 class Typedef {
   String name;
-  String dartDoc;
+  String? dartDoc;
   final Type returnType;
   final TypedefType typedefType;
   final List<Parameter> parameters;
 
   Typedef({
-    @required this.name,
+    required this.name,
     this.dartDoc,
-    @required this.returnType,
-    @required this.typedefType,
-    List<Parameter> parameters,
+    required this.returnType,
+    required this.typedefType,
+    List<Parameter>? parameters,
   }) : parameters = parameters ?? [];
 
   /// Returns the [Typedef] dependencies required by this typedef including itself.
@@ -44,12 +43,12 @@
     for (final p in parameters) {
       final base = p.type.getBaseType();
       if (base.broadType == BroadType.NativeFunction) {
-        dep.addAll(base.nativeFunc.getDependencies());
+        dep.addAll(base.nativeFunc!.getDependencies());
       }
     }
     final returnTypeBase = returnType.getBaseType();
     if (returnTypeBase.broadType == BroadType.NativeFunction) {
-      dep.addAll(returnTypeBase.nativeFunc.getDependencies());
+      dep.addAll(returnTypeBase.nativeFunc!.getDependencies());
     }
     dep.add(this);
     return dep;
@@ -58,7 +57,7 @@
   String toTypedefString(Writer w) {
     final s = StringBuffer();
     if (dartDoc != null) {
-      s.write(makeDartDoc(dartDoc));
+      s.write(makeDartDoc(dartDoc!));
     }
     final typedefName = name;
     final paramNamer = UniqueNamer({});
diff --git a/lib/src/code_generator/writer.dart b/lib/src/code_generator/writer.dart
index 0a02ed0..9e91099 100644
--- a/lib/src/code_generator/writer.dart
+++ b/lib/src/code_generator/writer.dart
@@ -3,14 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/code_generator/utils.dart';
-import 'package:meta/meta.dart';
 
 import 'binding.dart';
 import 'typedef.dart';
 
 /// To store generated String bindings.
 class Writer {
-  final String header;
+  final String? header;
 
   /// Holds bindings, which lookup symbols.
   final List<Binding> lookUpBindings;
@@ -18,42 +17,41 @@
   /// Holds bindings which don't lookup symbols.
   final List<Binding> noLookUpBindings;
 
-  String _className;
-  final String classDocComment;
+  String? _className;
+  final String? classDocComment;
 
-  String _ffiLibraryPrefix;
-  String get ffiLibraryPrefix => _ffiLibraryPrefix;
+  String? _ffiLibraryPrefix;
+  String? get ffiLibraryPrefix => _ffiLibraryPrefix;
 
-  String _dylibIdentifier;
-  String get dylibIdentifier => _dylibIdentifier;
+  String? _dylibIdentifier;
+  String? get dylibIdentifier => _dylibIdentifier;
 
   final bool dartBool;
 
   /// Initial namers set after running constructor. Namers are reset to this
   /// initial state everytime [generate] is called.
-  UniqueNamer _initialTopLevelUniqueNamer, _initialWrapperLevelUniqueNamer;
+  late UniqueNamer _initialTopLevelUniqueNamer, _initialWrapperLevelUniqueNamer;
 
   /// Used by [Binding]s for generating required code.
-  UniqueNamer _topLevelUniqueNamer, _wrapperLevelUniqueNamer;
+  late UniqueNamer _topLevelUniqueNamer, _wrapperLevelUniqueNamer;
   UniqueNamer get topLevelUniqueNamer => _topLevelUniqueNamer;
   UniqueNamer get wrapperLevelUniqueNamer => _wrapperLevelUniqueNamer;
 
-  String _arrayHelperClassPrefix;
+  String? _arrayHelperClassPrefix;
 
   /// Guaranteed to be a unique prefix.
-  String get arrayHelperClassPrefix => _arrayHelperClassPrefix;
+  String? get arrayHelperClassPrefix => _arrayHelperClassPrefix;
 
   /// [_usedUpNames] should contain names of all the declarations which are
   /// already used. This is used to avoid name collisions.
   Writer({
-    @required this.lookUpBindings,
-    @required this.noLookUpBindings,
-    @required String className,
-    @required this.dartBool,
+    required this.lookUpBindings,
+    required this.noLookUpBindings,
+    required String className,
+    required this.dartBool,
     this.classDocComment,
     this.header,
-  })  : assert(className != null),
-        assert(dartBool != null) {
+  }) {
     final globalLevelNameSet = noLookUpBindings.map((e) => e.name).toSet();
     final wrapperLevelNameSet = lookUpBindings.map((e) => e.name).toSet();
     final allNameSet = <String>{}
@@ -66,8 +64,8 @@
 
     /// Wrapper class name must be unique among all names.
     _className = allLevelsUniqueNamer.makeUnique(className);
-    _initialWrapperLevelUniqueNamer.markUsed(_className);
-    _initialTopLevelUniqueNamer.markUsed(_className);
+    _initialWrapperLevelUniqueNamer.markUsed(_className!);
+    _initialTopLevelUniqueNamer.markUsed(_className!);
 
     /// [_ffiLibraryPrefix] should be unique in top level.
     _ffiLibraryPrefix = _initialTopLevelUniqueNamer.makeUnique('ffi');
@@ -81,7 +79,7 @@
     _arrayHelperClassPrefix = base;
     var suffixInt = 0;
     for (var i = 0; i < allNameSet.length; i++) {
-      if (allNameSet.elementAt(i).startsWith(_arrayHelperClassPrefix)) {
+      if (allNameSet.elementAt(i).startsWith(_arrayHelperClassPrefix!)) {
         // Not a unique prefix, start over with a new suffix.
         i = -1;
         suffixInt++;
@@ -137,7 +135,7 @@
     if (lookUpBindings.isNotEmpty) {
       // Write doc comment for wrapper class.
       if (classDocComment != null) {
-        s.write(makeDartDoc(classDocComment));
+        s.write(makeDartDoc(classDocComment!));
       }
       // Write wrapper classs.
       s.write('class $_className{\n');
diff --git a/lib/src/config_provider/config.dart b/lib/src/config_provider/config.dart
index 04ae2a9..0649de5 100644
--- a/lib/src/config_provider/config.dart
+++ b/lib/src/config_provider/config.dart
@@ -22,79 +22,80 @@
 class Config {
   /// output file name.
   String get output => _output;
-  String _output;
+  late String _output;
   // Holds headers and filters for header.
   Headers get headers => _headers;
-  Headers _headers;
+  late Headers _headers;
 
   /// CommandLine Arguments to pass to clang_compiler.
   List<String> get compilerOpts => _compilerOpts;
-  List<String> _compilerOpts;
+  late List<String> _compilerOpts;
 
   /// Declaration config for Functions.
   Declaration get functionDecl => _functionDecl;
-  Declaration _functionDecl;
+  late Declaration _functionDecl;
 
   /// Declaration config for Structs.
   Declaration get structDecl => _structDecl;
-  Declaration _structDecl;
+  late Declaration _structDecl;
 
   /// Declaration config for Enums.
   Declaration get enumClassDecl => _enumClassDecl;
-  Declaration _enumClassDecl;
+  late Declaration _enumClassDecl;
 
   /// Declaration config for Unnamed enum constants.
   Declaration get unnamedEnumConstants => _unnamedEnumConstants;
-  Declaration _unnamedEnumConstants;
+  late Declaration _unnamedEnumConstants;
 
   /// Declaration config for Macro constants.
   Declaration get macroDecl => _macroDecl;
-  Declaration _macroDecl;
+  late Declaration _macroDecl;
 
   /// If generated bindings should be sorted alphabetically.
   bool get sort => _sort;
-  bool _sort;
+  late bool _sort;
 
   /// If typedef of supported types(int8_t) should be directly used.
   bool get useSupportedTypedefs => _useSupportedTypedefs;
-  bool _useSupportedTypedefs;
+  late bool _useSupportedTypedefs;
 
   /// Stores typedef name to NativeType mappings specified by user.
   Map<String, SupportedNativeType> get typedefNativeTypeMappings =>
       _typedefNativeTypeMappings;
-  Map<String, SupportedNativeType> _typedefNativeTypeMappings;
+  late Map<String, SupportedNativeType> _typedefNativeTypeMappings;
 
   /// Extracted Doc comment type.
   CommentType get commentType => _commentType;
-  CommentType _commentType;
+  late CommentType _commentType;
 
   /// If tool should generate array workarounds.
   ///
   /// If false(default), structs with inline array members will have all its
   /// members removed.
   bool get arrayWorkaround => _arrayWorkaround;
-  bool _arrayWorkaround;
+  late bool _arrayWorkaround;
 
   /// If dart bool should be generated for C booleans.
   bool get dartBool => _dartBool;
-  bool _dartBool;
+  late bool _dartBool;
 
   /// Name of the wrapper class.
   String get wrapperName => _wrapperName;
-  String _wrapperName;
+  late String _wrapperName;
 
   /// Doc comment for the wrapper class.
   String get wrapperDocComment => _wrapperDocComment;
-  String _wrapperDocComment;
+  late String _wrapperDocComment;
 
   /// Header of the generated bindings.
   String get preamble => _preamble;
-  String _preamble;
-  Config._();
+  late String _preamble;
 
   /// If `Dart_Handle` should be mapped with Handle/Object.
   bool get useDartHandle => _useDartHandle;
-  bool _useDartHandle;
+  late bool _useDartHandle;
+
+  Config._();
 
   /// Create config from Yaml map.
   factory Config.fromYaml(YamlMap map) {
@@ -118,8 +119,8 @@
     for (final key in specs.keys) {
       final spec = specs[key];
       if (map.containsKey(key)) {
-        _result = _result && spec.validator(key, map[key]);
-      } else if (spec.requirement == Requirement.yes) {
+        _result = _result && spec!.validator(key, map[key]);
+      } else if (spec!.requirement == Requirement.yes) {
         _logger.severe("Key '${key}' is required.");
         _result = false;
       } else if (spec.requirement == Requirement.prefer) {
@@ -143,9 +144,9 @@
     for (final key in specs.keys) {
       final spec = specs[key];
       if (map.containsKey(key)) {
-        spec.extractedResult(spec.extractor(map[key]));
+        spec!.extractedResult(spec.extractor(map[key]));
       } else {
-        spec.extractedResult(spec.defaultValue?.call());
+        spec!.extractedResult(spec.defaultValue?.call());
       }
     }
   }
@@ -227,7 +228,7 @@
           final map = result as Map<int, SupportedNativeType>;
           for (final key in map.keys) {
             if (cxTypeKindToSupportedNativeTypes.containsKey(key)) {
-              cxTypeKindToSupportedNativeTypes[key] = map[key];
+              cxTypeKindToSupportedNativeTypes[key] = map[key]!;
             }
           }
         },
@@ -283,7 +284,7 @@
         defaultValue: () => 'NativeLibrary',
         extractedResult: (dynamic result) => _wrapperName = result as String,
       ),
-      strings.description: Specification<String>(
+      strings.description: Specification<String?>(
         requirement: Requirement.prefer,
         validator: nonEmptyStringValidator,
         extractor: stringExtractor,
diff --git a/lib/src/config_provider/config_types.dart b/lib/src/config_provider/config_types.dart
index fa59745..9ce215c 100644
--- a/lib/src/config_provider/config_types.dart
+++ b/lib/src/config_provider/config_types.dart
@@ -4,7 +4,6 @@
 
 /// Contains all the neccesary classes required by config.
 
-import 'package:meta/meta.dart';
 import 'package:quiver/pattern.dart' as quiver;
 
 class CommentType {
@@ -33,15 +32,15 @@
 class Specification<E> {
   final bool Function(String name, dynamic value) validator;
   final E Function(dynamic map) extractor;
-  final E Function() defaultValue;
+  final E Function()? defaultValue;
 
   final Requirement requirement;
   final void Function(dynamic result) extractedResult;
 
   Specification({
-    @required this.extractedResult,
-    @required this.validator,
-    @required this.extractor,
+    required this.extractedResult,
+    required this.validator,
+    required this.extractor,
     this.defaultValue,
     this.requirement = Requirement.no,
   });
@@ -59,7 +58,7 @@
   /// Include filter for headers.
   final HeaderIncludeFilter includeFilter;
 
-  Headers({List<String> entryPoints, HeaderIncludeFilter includeFilter})
+  Headers({List<String>? entryPoints, HeaderIncludeFilter? includeFilter})
       : entryPoints = entryPoints ?? [],
         includeFilter = includeFilter ?? GlobHeaderFilter();
 }
@@ -69,7 +68,7 @@
 }
 
 class GlobHeaderFilter extends HeaderIncludeFilter {
-  List<quiver.Glob> includeGlobs = [];
+  List<quiver.Glob>? includeGlobs = [];
 
   GlobHeaderFilter({
     this.includeGlobs,
@@ -78,14 +77,14 @@
   @override
   bool shouldInclude(String header) {
     // Return true if header was included.
-    for (final globPattern in includeGlobs) {
+    for (final globPattern in includeGlobs!) {
       if (quiver.matchesFull(globPattern, header)) {
         return true;
       }
     }
 
     // If any includedInclusionHeaders is provided, return false.
-    if (includeGlobs.isNotEmpty) {
+    if (includeGlobs!.isNotEmpty) {
       return false;
     } else {
       return true;
@@ -100,9 +99,9 @@
   final MemberRenamer _memberRenamer;
 
   Declaration({
-    Includer includer,
-    Renamer renamer,
-    MemberRenamer memberRenamer,
+    Includer? includer,
+    Renamer? renamer,
+    MemberRenamer? memberRenamer,
   })  : _includer = includer ?? Includer(),
         _renamer = renamer ?? Renamer(),
         _memberRenamer = memberRenamer ?? MemberRenamer();
@@ -137,7 +136,7 @@
   String rename(String str) {
     if (matches(str)) {
       // Get match.
-      final regExpMatch = regExp.firstMatch(str);
+      final regExpMatch = regExp.firstMatch(str)!;
 
       /// Get group values.
       /// E.g for `str`: `clang_dispose` and `regExp`: `clang_(.*)`
@@ -149,8 +148,8 @@
       /// Replace all `$<int>` symbols with respective groups (if any).
       final result =
           replacementPattern.replaceAllMapped(replaceGroupRegexp, (match) {
-        final groupInt = int.parse(match.group(1));
-        return groups[groupInt];
+        final groupInt = int.parse(match.group(1)!);
+        return groups[groupInt]!;
       });
       return result;
     } else {
@@ -172,10 +171,10 @@
   final Set<String> _excludeFull;
 
   Includer({
-    List<RegExp> includeMatchers,
-    Set<String> includeFull,
-    List<RegExp> excludeMatchers,
-    Set<String> excludeFull,
+    List<RegExp>? includeMatchers,
+    Set<String>? includeFull,
+    List<RegExp>? excludeMatchers,
+    Set<String>? excludeFull,
   })  : _includeMatchers = includeMatchers ?? [],
         _includeFull = includeFull ?? {},
         _excludeMatchers = excludeMatchers ?? [],
@@ -221,8 +220,8 @@
   final List<RegExpRenamer> _renameMatchers;
 
   Renamer({
-    List<RegExpRenamer> renamePatterns,
-    Map<String, String> renameFull,
+    List<RegExpRenamer>? renamePatterns,
+    Map<String, String>? renameFull,
   })  : _renameMatchers = renamePatterns ?? [],
         _renameFull = renameFull ?? {};
 
@@ -233,7 +232,7 @@
   String rename(String name) {
     // Apply full rename (if any).
     if (_renameFull.containsKey(name)) {
-      return _renameFull[name];
+      return _renameFull[name]!;
     }
 
     // Apply rename regexp (if matches).
@@ -273,21 +272,21 @@
   final Map<String, Renamer> _cache = {};
 
   MemberRenamer({
-    Map<String, Renamer> memberRenameFull,
-    List<RegExpMemberRenamer> memberRenamePattern,
+    Map<String, Renamer>? memberRenameFull,
+    List<RegExpMemberRenamer>? memberRenamePattern,
   })  : _memberRenameFull = memberRenameFull ?? {},
         _memberRenameMatchers = memberRenamePattern ?? [];
 
   String rename(String declaration, String member) {
     if (_cache.containsKey(declaration)) {
-      return _cache[declaration].rename(member);
+      return _cache[declaration]!.rename(member);
     }
 
     // Apply full rename (if any).
     if (_memberRenameFull.containsKey(declaration)) {
       // Add to cache.
-      _cache[declaration] = _memberRenameFull[declaration];
-      return _cache[declaration].rename(member);
+      _cache[declaration] = _memberRenameFull[declaration]!;
+      return _cache[declaration]!.rename(member);
     }
 
     // Apply rename regexp (if matches).
@@ -295,7 +294,7 @@
       if (renamer.matchesDeclarationName(declaration)) {
         // Add to cache.
         _cache[declaration] = renamer.memberRenamer;
-        return _cache[declaration].rename(member);
+        return _cache[declaration]!.rename(member);
       }
     }
 
diff --git a/lib/src/config_provider/spec_utils.dart b/lib/src/config_provider/spec_utils.dart
index 3ed5767..2df7939 100644
--- a/lib/src/config_provider/spec_utils.dart
+++ b/lib/src/config_provider/spec_utils.dart
@@ -44,11 +44,11 @@
 
 Map<int, SupportedNativeType> sizemapExtractor(dynamic yamlConfig) {
   final resultMap = <int, SupportedNativeType>{};
-  final sizemap = yamlConfig as YamlMap;
+  final sizemap = yamlConfig as YamlMap?;
   if (sizemap != null) {
     for (final typeName in strings.sizemap_native_mapping.keys) {
       if (sizemap.containsKey(typeName)) {
-        final cxTypeInt = strings.sizemap_native_mapping[typeName];
+        final cxTypeInt = strings.sizemap_native_mapping[typeName] as int;
         final byteSize = sizemap[typeName] as int;
         resultMap[cxTypeInt] = nativeSupportedType(byteSize,
             signed: typeName.contains('unsigned') ? false : true);
@@ -73,7 +73,7 @@
 
 Map<String, SupportedNativeType> typedefmapExtractor(dynamic yamlConfig) {
   final resultMap = <String, SupportedNativeType>{};
-  final typedefmap = yamlConfig as YamlMap;
+  final typedefmap = yamlConfig as YamlMap?;
   if (typedefmap != null) {
     for (final typeName in typedefmap.keys) {
       if (typedefmap[typeName] is String &&
@@ -81,7 +81,7 @@
               .containsKey(typedefmap[typeName])) {
         // Map this typename to specified supportedNativeType.
         resultMap[typeName as String] =
-            strings.supportedNativeType_mappings[typedefmap[typeName]];
+            strings.supportedNativeType_mappings[typedefmap[typeName]]!;
       }
     }
   }
@@ -103,7 +103,7 @@
 }
 
 List<String> compilerOptsExtractor(dynamic value) =>
-    (value as String)?.split(' ');
+    (value as String).split(' ');
 
 bool compilerOptsValidator(String name, dynamic value) =>
     checkType<String>([name], value);
@@ -153,7 +153,7 @@
     _logger.severe("Expected '$name -> ${strings.entryPoints}' to be a Map.");
     return false;
   } else {
-    for (final key in (value as YamlMap).keys) {
+    for (final key in value.keys) {
       if (key == strings.entryPoints || key == strings.includeDirectives) {
         if (!checkType<YamlList>([name, key as String], value[key])) {
           return false;
@@ -218,7 +218,7 @@
   final memberRenamePatterns = <RegExpMemberRenamer>[];
   final memberRenamerFull = <String, Renamer>{};
 
-  final include = (yamlMap[strings.include] as YamlList)?.cast<String>();
+  final include = (yamlMap[strings.include] as YamlList?)?.cast<String>();
   if (include != null) {
     for (final str in include) {
       if (isFullDeclarationName(str)) {
@@ -229,7 +229,7 @@
     }
   }
 
-  final exclude = (yamlMap[strings.exclude] as YamlList)?.cast<String>();
+  final exclude = (yamlMap[strings.exclude] as YamlList?)?.cast<String>();
   if (exclude != null) {
     for (final str in exclude) {
       if (isFullDeclarationName(str)) {
@@ -240,34 +240,34 @@
     }
   }
 
-  final rename = (yamlMap[strings.rename] as YamlMap)?.cast<String, String>();
+  final rename = (yamlMap[strings.rename] as YamlMap?)?.cast<String, String>();
 
   if (rename != null) {
     for (final str in rename.keys) {
       if (isFullDeclarationName(str)) {
-        renameFull[str] = rename[str];
+        renameFull[str] = rename[str]!;
       } else {
         renamePatterns
-            .add(RegExpRenamer(RegExp(str, dotAll: true), rename[str]));
+            .add(RegExpRenamer(RegExp(str, dotAll: true), rename[str]!));
       }
     }
   }
 
   final memberRename =
-      (yamlMap[strings.memberRename] as YamlMap)?.cast<String, YamlMap>();
+      (yamlMap[strings.memberRename] as YamlMap?)?.cast<String, YamlMap>();
 
   if (memberRename != null) {
     for (final decl in memberRename.keys) {
       final renamePatterns = <RegExpRenamer>[];
       final renameFull = <String, String>{};
 
-      final memberRenameMap = memberRename[decl].cast<String, String>();
+      final memberRenameMap = memberRename[decl]!.cast<String, String>();
       for (final member in memberRenameMap.keys) {
         if (isFullDeclarationName(member)) {
-          renameFull[member] = memberRenameMap[member];
+          renameFull[member] = memberRenameMap[member]!;
         } else {
           renamePatterns.add(RegExpRenamer(
-              RegExp(member, dotAll: true), memberRenameMap[member]));
+              RegExp(member, dotAll: true), memberRenameMap[member]!));
         }
       }
       if (isFullDeclarationName(decl)) {
@@ -321,7 +321,7 @@
         } else {
           for (final subkey in value[key].keys) {
             if (!checkType<String>(
-                [name, key as String, subkey as String], value[key][subkey])) {
+                [name, key, subkey as String], value[key][subkey])) {
               _result = false;
             }
           }
@@ -332,15 +332,14 @@
         } else {
           for (final declNameKey in value[key].keys) {
             if (!checkType<YamlMap>(
-                [name, key as String, declNameKey as String],
-                value[key][declNameKey])) {
+                [name, key, declNameKey as String], value[key][declNameKey])) {
               _result = false;
             } else {
               for (final memberNameKey in value[key][declNameKey].keys) {
                 if (!checkType<String>([
                   name,
-                  key as String,
-                  declNameKey as String,
+                  key,
+                  declNameKey,
                   memberNameKey as String,
                 ], value[key][declNameKey][memberNameKey])) {
                   _result = false;
diff --git a/lib/src/find_resource.dart b/lib/src/find_resource.dart
index 7a8df1a..c16d47f 100644
--- a/lib/src/find_resource.dart
+++ b/lib/src/find_resource.dart
@@ -11,7 +11,7 @@
 final _logger = Logger('ffigen.find_resource');
 
 /// Find the `.dart_tool/` folder, returns `null` if unable to find it.
-Uri findDotDartTool() {
+Uri? findDotDartTool() {
   // HACK: Because 'dart:isolate' is unavailable in Flutter we have no means
   //       by which we can find the location of the package_config.json file.
   //       Which we need, because the binary library created by:
@@ -32,7 +32,7 @@
 }
 
 /// Get [Uri] for [posixPath] inside ffigen's rootUri.
-Uri _findInPackageRoot(String posixPath) {
+Uri? _findInPackageRoot(String posixPath) {
   var root = Directory.current.uri;
   // Traverse up until we see a `.dart_tool/package_config.json` file.
   do {
@@ -67,22 +67,22 @@
   return null;
 }
 
-Uri findWrapper(String wrapperName) {
+Uri? findWrapper(String wrapperName) {
   return _findInPackageRoot('lib/src/clang_library/$wrapperName');
 }
 
-Uri _findFfigenPubspecYaml() {
+Uri? _findFfigenPubspecYaml() {
   return _findInPackageRoot('pubspec.yaml');
 }
 
-String _ffigenVersion;
+String? _ffigenVersion;
 
 /// Gets ffigen version from ffigen's pubspec.yaml
-String get ffigenVersion {
+String? get ffigenVersion {
   if (_ffigenVersion == null) {
     try {
       final yaml =
-          loadYaml(File.fromUri(_findFfigenPubspecYaml()).readAsStringSync())
+          loadYaml(File.fromUri(_findFfigenPubspecYaml()!).readAsStringSync())
               as YamlMap;
       final rawVersion = yaml['version'] as String;
       // Sanitize name to be used as a file name.
diff --git a/lib/src/header_parser/clang_bindings/clang_bindings.dart b/lib/src/header_parser/clang_bindings/clang_bindings.dart
index b108302..db84398 100644
--- a/lib/src/header_parser/clang_bindings/clang_bindings.dart
+++ b/lib/src/header_parser/clang_bindings/clang_bindings.dart
@@ -61,13 +61,13 @@
     _clang_createIndex ??=
         _dylib.lookupFunction<_c_clang_createIndex, _dart_clang_createIndex>(
             'clang_createIndex');
-    return _clang_createIndex(
+    return _clang_createIndex!(
       excludeDeclarationsFromPCH,
       displayDiagnostics,
     );
   }
 
-  _dart_clang_createIndex _clang_createIndex;
+  _dart_clang_createIndex? _clang_createIndex;
 
   /// Destroy the given index.
   ///
@@ -79,12 +79,12 @@
     _clang_disposeIndex ??=
         _dylib.lookupFunction<_c_clang_disposeIndex, _dart_clang_disposeIndex>(
             'clang_disposeIndex');
-    return _clang_disposeIndex(
+    return _clang_disposeIndex!(
       index,
     );
   }
 
-  _dart_clang_disposeIndex _clang_disposeIndex;
+  _dart_clang_disposeIndex? _clang_disposeIndex;
 
   /// Determine the number of diagnostics produced for the given
   /// translation unit.
@@ -94,12 +94,12 @@
     _clang_getNumDiagnostics ??= _dylib.lookupFunction<
         _c_clang_getNumDiagnostics,
         _dart_clang_getNumDiagnostics>('clang_getNumDiagnostics');
-    return _clang_getNumDiagnostics(
+    return _clang_getNumDiagnostics!(
       Unit,
     );
   }
 
-  _dart_clang_getNumDiagnostics _clang_getNumDiagnostics;
+  _dart_clang_getNumDiagnostics? _clang_getNumDiagnostics;
 
   /// Retrieve a diagnostic associated with the given translation unit.
   ///
@@ -114,13 +114,13 @@
   ) {
     _clang_getDiagnostic ??= _dylib.lookupFunction<_c_clang_getDiagnostic,
         _dart_clang_getDiagnostic>('clang_getDiagnostic');
-    return _clang_getDiagnostic(
+    return _clang_getDiagnostic!(
       Unit,
       Index,
     );
   }
 
-  _dart_clang_getDiagnostic _clang_getDiagnostic;
+  _dart_clang_getDiagnostic? _clang_getDiagnostic;
 
   /// Destroy a diagnostic.
   void clang_disposeDiagnostic(
@@ -129,12 +129,12 @@
     _clang_disposeDiagnostic ??= _dylib.lookupFunction<
         _c_clang_disposeDiagnostic,
         _dart_clang_disposeDiagnostic>('clang_disposeDiagnostic');
-    return _clang_disposeDiagnostic(
+    return _clang_disposeDiagnostic!(
       Diagnostic,
     );
   }
 
-  _dart_clang_disposeDiagnostic _clang_disposeDiagnostic;
+  _dart_clang_disposeDiagnostic? _clang_disposeDiagnostic;
 
   /// Same as \c clang_parseTranslationUnit2, but returns
   /// the \c CXTranslationUnit instead of an error code.  In case of an error this
@@ -152,7 +152,7 @@
     _clang_parseTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_parseTranslationUnit,
         _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit');
-    return _clang_parseTranslationUnit(
+    return _clang_parseTranslationUnit!(
       CIdx,
       source_filename,
       command_line_args,
@@ -163,7 +163,7 @@
     );
   }
 
-  _dart_clang_parseTranslationUnit _clang_parseTranslationUnit;
+  _dart_clang_parseTranslationUnit? _clang_parseTranslationUnit;
 
   /// Destroy the specified CXTranslationUnit object.
   void clang_disposeTranslationUnit(
@@ -172,12 +172,12 @@
     _clang_disposeTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_disposeTranslationUnit,
         _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit');
-    return _clang_disposeTranslationUnit(
+    return _clang_disposeTranslationUnit!(
       arg0,
     );
   }
 
-  _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit;
+  _dart_clang_disposeTranslationUnit? _clang_disposeTranslationUnit;
 
   /// Returns the kind of the evaluated result.
   int clang_EvalResult_getKind(
@@ -186,12 +186,12 @@
     _clang_EvalResult_getKind ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getKind,
         _dart_clang_EvalResult_getKind>('clang_EvalResult_getKind');
-    return _clang_EvalResult_getKind(
+    return _clang_EvalResult_getKind!(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getKind _clang_EvalResult_getKind;
+  _dart_clang_EvalResult_getKind? _clang_EvalResult_getKind;
 
   /// Returns the evaluation result as integer if the
   /// kind is Int.
@@ -201,12 +201,12 @@
     _clang_EvalResult_getAsInt ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsInt,
         _dart_clang_EvalResult_getAsInt>('clang_EvalResult_getAsInt');
-    return _clang_EvalResult_getAsInt(
+    return _clang_EvalResult_getAsInt!(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsInt _clang_EvalResult_getAsInt;
+  _dart_clang_EvalResult_getAsInt? _clang_EvalResult_getAsInt;
 
   /// Returns the evaluation result as a long long integer if the
   /// kind is Int. This prevents overflows that may happen if the result is
@@ -217,12 +217,12 @@
     _clang_EvalResult_getAsLongLong ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsLongLong,
         _dart_clang_EvalResult_getAsLongLong>('clang_EvalResult_getAsLongLong');
-    return _clang_EvalResult_getAsLongLong(
+    return _clang_EvalResult_getAsLongLong!(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsLongLong _clang_EvalResult_getAsLongLong;
+  _dart_clang_EvalResult_getAsLongLong? _clang_EvalResult_getAsLongLong;
 
   /// Returns the evaluation result as double if the
   /// kind is double.
@@ -232,12 +232,12 @@
     _clang_EvalResult_getAsDouble ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsDouble,
         _dart_clang_EvalResult_getAsDouble>('clang_EvalResult_getAsDouble');
-    return _clang_EvalResult_getAsDouble(
+    return _clang_EvalResult_getAsDouble!(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsDouble _clang_EvalResult_getAsDouble;
+  _dart_clang_EvalResult_getAsDouble? _clang_EvalResult_getAsDouble;
 
   /// Returns the evaluation result as a constant string if the
   /// kind is other than Int or float. User must not free this pointer,
@@ -249,12 +249,12 @@
     _clang_EvalResult_getAsStr ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsStr,
         _dart_clang_EvalResult_getAsStr>('clang_EvalResult_getAsStr');
-    return _clang_EvalResult_getAsStr(
+    return _clang_EvalResult_getAsStr!(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsStr _clang_EvalResult_getAsStr;
+  _dart_clang_EvalResult_getAsStr? _clang_EvalResult_getAsStr;
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
@@ -263,24 +263,24 @@
     _clang_EvalResult_dispose ??= _dylib.lookupFunction<
         _c_clang_EvalResult_dispose,
         _dart_clang_EvalResult_dispose>('clang_EvalResult_dispose');
-    return _clang_EvalResult_dispose(
+    return _clang_EvalResult_dispose!(
       E,
     );
   }
 
-  _dart_clang_EvalResult_dispose _clang_EvalResult_dispose;
+  _dart_clang_EvalResult_dispose? _clang_EvalResult_dispose;
 
   ffi.Pointer<ffi.Int8> clang_getCString_wrap(
     ffi.Pointer<CXString> string,
   ) {
     _clang_getCString_wrap ??= _dylib.lookupFunction<_c_clang_getCString_wrap,
         _dart_clang_getCString_wrap>('clang_getCString_wrap');
-    return _clang_getCString_wrap(
+    return _clang_getCString_wrap!(
       string,
     );
   }
 
-  _dart_clang_getCString_wrap _clang_getCString_wrap;
+  _dart_clang_getCString_wrap? _clang_getCString_wrap;
 
   void clang_disposeString_wrap(
     ffi.Pointer<CXString> string,
@@ -288,12 +288,12 @@
     _clang_disposeString_wrap ??= _dylib.lookupFunction<
         _c_clang_disposeString_wrap,
         _dart_clang_disposeString_wrap>('clang_disposeString_wrap');
-    return _clang_disposeString_wrap(
+    return _clang_disposeString_wrap!(
       string,
     );
   }
 
-  _dart_clang_disposeString_wrap _clang_disposeString_wrap;
+  _dart_clang_disposeString_wrap? _clang_disposeString_wrap;
 
   int clang_getCursorKind_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -301,12 +301,12 @@
     _clang_getCursorKind_wrap ??= _dylib.lookupFunction<
         _c_clang_getCursorKind_wrap,
         _dart_clang_getCursorKind_wrap>('clang_getCursorKind_wrap');
-    return _clang_getCursorKind_wrap(
+    return _clang_getCursorKind_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_getCursorKind_wrap _clang_getCursorKind_wrap;
+  _dart_clang_getCursorKind_wrap? _clang_getCursorKind_wrap;
 
   ffi.Pointer<CXString> clang_getCursorKindSpelling_wrap(
     int kind,
@@ -315,12 +315,12 @@
             _c_clang_getCursorKindSpelling_wrap,
             _dart_clang_getCursorKindSpelling_wrap>(
         'clang_getCursorKindSpelling_wrap');
-    return _clang_getCursorKindSpelling_wrap(
+    return _clang_getCursorKindSpelling_wrap!(
       kind,
     );
   }
 
-  _dart_clang_getCursorKindSpelling_wrap _clang_getCursorKindSpelling_wrap;
+  _dart_clang_getCursorKindSpelling_wrap? _clang_getCursorKindSpelling_wrap;
 
   ffi.Pointer<CXType> clang_getCursorType_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -328,12 +328,12 @@
     _clang_getCursorType_wrap ??= _dylib.lookupFunction<
         _c_clang_getCursorType_wrap,
         _dart_clang_getCursorType_wrap>('clang_getCursorType_wrap');
-    return _clang_getCursorType_wrap(
+    return _clang_getCursorType_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_getCursorType_wrap _clang_getCursorType_wrap;
+  _dart_clang_getCursorType_wrap? _clang_getCursorType_wrap;
 
   ffi.Pointer<CXString> clang_getTypeSpelling_wrap(
     ffi.Pointer<CXType> type,
@@ -341,25 +341,25 @@
     _clang_getTypeSpelling_wrap ??= _dylib.lookupFunction<
         _c_clang_getTypeSpelling_wrap,
         _dart_clang_getTypeSpelling_wrap>('clang_getTypeSpelling_wrap');
-    return _clang_getTypeSpelling_wrap(
+    return _clang_getTypeSpelling_wrap!(
       type,
     );
   }
 
-  _dart_clang_getTypeSpelling_wrap _clang_getTypeSpelling_wrap;
+  _dart_clang_getTypeSpelling_wrap? _clang_getTypeSpelling_wrap;
 
   ffi.Pointer<CXString> clang_getTypeKindSpelling_wrap(
-    int typeKind,
+    int? typeKind,
   ) {
     _clang_getTypeKindSpelling_wrap ??= _dylib.lookupFunction<
         _c_clang_getTypeKindSpelling_wrap,
         _dart_clang_getTypeKindSpelling_wrap>('clang_getTypeKindSpelling_wrap');
-    return _clang_getTypeKindSpelling_wrap(
+    return _clang_getTypeKindSpelling_wrap!(
       typeKind,
     );
   }
 
-  _dart_clang_getTypeKindSpelling_wrap _clang_getTypeKindSpelling_wrap;
+  _dart_clang_getTypeKindSpelling_wrap? _clang_getTypeKindSpelling_wrap;
 
   ffi.Pointer<CXType> clang_getResultType_wrap(
     ffi.Pointer<CXType> functionType,
@@ -367,12 +367,12 @@
     _clang_getResultType_wrap ??= _dylib.lookupFunction<
         _c_clang_getResultType_wrap,
         _dart_clang_getResultType_wrap>('clang_getResultType_wrap');
-    return _clang_getResultType_wrap(
+    return _clang_getResultType_wrap!(
       functionType,
     );
   }
 
-  _dart_clang_getResultType_wrap _clang_getResultType_wrap;
+  _dart_clang_getResultType_wrap? _clang_getResultType_wrap;
 
   ffi.Pointer<CXType> clang_getPointeeType_wrap(
     ffi.Pointer<CXType> pointerType,
@@ -380,12 +380,12 @@
     _clang_getPointeeType_wrap ??= _dylib.lookupFunction<
         _c_clang_getPointeeType_wrap,
         _dart_clang_getPointeeType_wrap>('clang_getPointeeType_wrap');
-    return _clang_getPointeeType_wrap(
+    return _clang_getPointeeType_wrap!(
       pointerType,
     );
   }
 
-  _dart_clang_getPointeeType_wrap _clang_getPointeeType_wrap;
+  _dart_clang_getPointeeType_wrap? _clang_getPointeeType_wrap;
 
   ffi.Pointer<CXType> clang_getCanonicalType_wrap(
     ffi.Pointer<CXType> typerefType,
@@ -393,12 +393,12 @@
     _clang_getCanonicalType_wrap ??= _dylib.lookupFunction<
         _c_clang_getCanonicalType_wrap,
         _dart_clang_getCanonicalType_wrap>('clang_getCanonicalType_wrap');
-    return _clang_getCanonicalType_wrap(
+    return _clang_getCanonicalType_wrap!(
       typerefType,
     );
   }
 
-  _dart_clang_getCanonicalType_wrap _clang_getCanonicalType_wrap;
+  _dart_clang_getCanonicalType_wrap? _clang_getCanonicalType_wrap;
 
   ffi.Pointer<CXType> clang_Type_getNamedType_wrap(
     ffi.Pointer<CXType> elaboratedType,
@@ -406,12 +406,12 @@
     _clang_Type_getNamedType_wrap ??= _dylib.lookupFunction<
         _c_clang_Type_getNamedType_wrap,
         _dart_clang_Type_getNamedType_wrap>('clang_Type_getNamedType_wrap');
-    return _clang_Type_getNamedType_wrap(
+    return _clang_Type_getNamedType_wrap!(
       elaboratedType,
     );
   }
 
-  _dart_clang_Type_getNamedType_wrap _clang_Type_getNamedType_wrap;
+  _dart_clang_Type_getNamedType_wrap? _clang_Type_getNamedType_wrap;
 
   ffi.Pointer<CXCursor> clang_getTypeDeclaration_wrap(
     ffi.Pointer<CXType> cxtype,
@@ -419,12 +419,12 @@
     _clang_getTypeDeclaration_wrap ??= _dylib.lookupFunction<
         _c_clang_getTypeDeclaration_wrap,
         _dart_clang_getTypeDeclaration_wrap>('clang_getTypeDeclaration_wrap');
-    return _clang_getTypeDeclaration_wrap(
+    return _clang_getTypeDeclaration_wrap!(
       cxtype,
     );
   }
 
-  _dart_clang_getTypeDeclaration_wrap _clang_getTypeDeclaration_wrap;
+  _dart_clang_getTypeDeclaration_wrap? _clang_getTypeDeclaration_wrap;
 
   ffi.Pointer<CXType> clang_getTypedefDeclUnderlyingType_wrap(
     ffi.Pointer<CXCursor> cxcursor,
@@ -433,12 +433,12 @@
             _c_clang_getTypedefDeclUnderlyingType_wrap,
             _dart_clang_getTypedefDeclUnderlyingType_wrap>(
         'clang_getTypedefDeclUnderlyingType_wrap');
-    return _clang_getTypedefDeclUnderlyingType_wrap(
+    return _clang_getTypedefDeclUnderlyingType_wrap!(
       cxcursor,
     );
   }
 
-  _dart_clang_getTypedefDeclUnderlyingType_wrap
+  _dart_clang_getTypedefDeclUnderlyingType_wrap?
       _clang_getTypedefDeclUnderlyingType_wrap;
 
   /// The name of parameter, struct, typedef.
@@ -448,12 +448,12 @@
     _clang_getCursorSpelling_wrap ??= _dylib.lookupFunction<
         _c_clang_getCursorSpelling_wrap,
         _dart_clang_getCursorSpelling_wrap>('clang_getCursorSpelling_wrap');
-    return _clang_getCursorSpelling_wrap(
+    return _clang_getCursorSpelling_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_getCursorSpelling_wrap _clang_getCursorSpelling_wrap;
+  _dart_clang_getCursorSpelling_wrap? _clang_getCursorSpelling_wrap;
 
   ffi.Pointer<CXCursor> clang_getTranslationUnitCursor_wrap(
     ffi.Pointer<CXTranslationUnitImpl> tu,
@@ -462,12 +462,12 @@
             _c_clang_getTranslationUnitCursor_wrap,
             _dart_clang_getTranslationUnitCursor_wrap>(
         'clang_getTranslationUnitCursor_wrap');
-    return _clang_getTranslationUnitCursor_wrap(
+    return _clang_getTranslationUnitCursor_wrap!(
       tu,
     );
   }
 
-  _dart_clang_getTranslationUnitCursor_wrap
+  _dart_clang_getTranslationUnitCursor_wrap?
       _clang_getTranslationUnitCursor_wrap;
 
   ffi.Pointer<CXString> clang_formatDiagnostic_wrap(
@@ -477,13 +477,13 @@
     _clang_formatDiagnostic_wrap ??= _dylib.lookupFunction<
         _c_clang_formatDiagnostic_wrap,
         _dart_clang_formatDiagnostic_wrap>('clang_formatDiagnostic_wrap');
-    return _clang_formatDiagnostic_wrap(
+    return _clang_formatDiagnostic_wrap!(
       diag,
       opts,
     );
   }
 
-  _dart_clang_formatDiagnostic_wrap _clang_formatDiagnostic_wrap;
+  _dart_clang_formatDiagnostic_wrap? _clang_formatDiagnostic_wrap;
 
   /// Visitor is a function pointer with parameters having pointers to cxcursor
   /// instead of cxcursor by default.
@@ -495,14 +495,14 @@
     _clang_visitChildren_wrap ??= _dylib.lookupFunction<
         _c_clang_visitChildren_wrap,
         _dart_clang_visitChildren_wrap>('clang_visitChildren_wrap');
-    return _clang_visitChildren_wrap(
+    return _clang_visitChildren_wrap!(
       parent,
       _modifiedVisitor,
       uid,
     );
   }
 
-  _dart_clang_visitChildren_wrap _clang_visitChildren_wrap;
+  _dart_clang_visitChildren_wrap? _clang_visitChildren_wrap;
 
   int clang_Cursor_getNumArguments_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -511,12 +511,12 @@
             _c_clang_Cursor_getNumArguments_wrap,
             _dart_clang_Cursor_getNumArguments_wrap>(
         'clang_Cursor_getNumArguments_wrap');
-    return _clang_Cursor_getNumArguments_wrap(
+    return _clang_Cursor_getNumArguments_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_getNumArguments_wrap _clang_Cursor_getNumArguments_wrap;
+  _dart_clang_Cursor_getNumArguments_wrap? _clang_Cursor_getNumArguments_wrap;
 
   ffi.Pointer<CXCursor> clang_Cursor_getArgument_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -525,13 +525,13 @@
     _clang_Cursor_getArgument_wrap ??= _dylib.lookupFunction<
         _c_clang_Cursor_getArgument_wrap,
         _dart_clang_Cursor_getArgument_wrap>('clang_Cursor_getArgument_wrap');
-    return _clang_Cursor_getArgument_wrap(
+    return _clang_Cursor_getArgument_wrap!(
       cursor,
       i,
     );
   }
 
-  _dart_clang_Cursor_getArgument_wrap _clang_Cursor_getArgument_wrap;
+  _dart_clang_Cursor_getArgument_wrap? _clang_Cursor_getArgument_wrap;
 
   int clang_getNumArgTypes_wrap(
     ffi.Pointer<CXType> cxtype,
@@ -539,12 +539,12 @@
     _clang_getNumArgTypes_wrap ??= _dylib.lookupFunction<
         _c_clang_getNumArgTypes_wrap,
         _dart_clang_getNumArgTypes_wrap>('clang_getNumArgTypes_wrap');
-    return _clang_getNumArgTypes_wrap(
+    return _clang_getNumArgTypes_wrap!(
       cxtype,
     );
   }
 
-  _dart_clang_getNumArgTypes_wrap _clang_getNumArgTypes_wrap;
+  _dart_clang_getNumArgTypes_wrap? _clang_getNumArgTypes_wrap;
 
   ffi.Pointer<CXType> clang_getArgType_wrap(
     ffi.Pointer<CXType> cxtype,
@@ -552,13 +552,13 @@
   ) {
     _clang_getArgType_wrap ??= _dylib.lookupFunction<_c_clang_getArgType_wrap,
         _dart_clang_getArgType_wrap>('clang_getArgType_wrap');
-    return _clang_getArgType_wrap(
+    return _clang_getArgType_wrap!(
       cxtype,
       i,
     );
   }
 
-  _dart_clang_getArgType_wrap _clang_getArgType_wrap;
+  _dart_clang_getArgType_wrap? _clang_getArgType_wrap;
 
   int clang_getEnumConstantDeclValue_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -567,12 +567,12 @@
             _c_clang_getEnumConstantDeclValue_wrap,
             _dart_clang_getEnumConstantDeclValue_wrap>(
         'clang_getEnumConstantDeclValue_wrap');
-    return _clang_getEnumConstantDeclValue_wrap(
+    return _clang_getEnumConstantDeclValue_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_getEnumConstantDeclValue_wrap
+  _dart_clang_getEnumConstantDeclValue_wrap?
       _clang_getEnumConstantDeclValue_wrap;
 
   /// Returns non-zero if the ranges are the same, zero if they differ.
@@ -582,13 +582,13 @@
   ) {
     _clang_equalRanges_wrap ??= _dylib.lookupFunction<_c_clang_equalRanges_wrap,
         _dart_clang_equalRanges_wrap>('clang_equalRanges_wrap');
-    return _clang_equalRanges_wrap(
+    return _clang_equalRanges_wrap!(
       c1,
       c2,
     );
   }
 
-  _dart_clang_equalRanges_wrap _clang_equalRanges_wrap;
+  _dart_clang_equalRanges_wrap? _clang_equalRanges_wrap;
 
   /// Returns the comment range.
   ffi.Pointer<CXSourceRange> clang_Cursor_getCommentRange_wrap(
@@ -598,12 +598,12 @@
             _c_clang_Cursor_getCommentRange_wrap,
             _dart_clang_Cursor_getCommentRange_wrap>(
         'clang_Cursor_getCommentRange_wrap');
-    return _clang_Cursor_getCommentRange_wrap(
+    return _clang_Cursor_getCommentRange_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_getCommentRange_wrap _clang_Cursor_getCommentRange_wrap;
+  _dart_clang_Cursor_getCommentRange_wrap? _clang_Cursor_getCommentRange_wrap;
 
   /// Returns the raw comment.
   ffi.Pointer<CXString> clang_Cursor_getRawCommentText_wrap(
@@ -613,12 +613,12 @@
             _c_clang_Cursor_getRawCommentText_wrap,
             _dart_clang_Cursor_getRawCommentText_wrap>(
         'clang_Cursor_getRawCommentText_wrap');
-    return _clang_Cursor_getRawCommentText_wrap(
+    return _clang_Cursor_getRawCommentText_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_getRawCommentText_wrap
+  _dart_clang_Cursor_getRawCommentText_wrap?
       _clang_Cursor_getRawCommentText_wrap;
 
   /// Returns the first paragraph of doxygen doc comment.
@@ -629,12 +629,12 @@
             _c_clang_Cursor_getBriefCommentText_wrap,
             _dart_clang_Cursor_getBriefCommentText_wrap>(
         'clang_Cursor_getBriefCommentText_wrap');
-    return _clang_Cursor_getBriefCommentText_wrap(
+    return _clang_Cursor_getBriefCommentText_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_getBriefCommentText_wrap
+  _dart_clang_Cursor_getBriefCommentText_wrap?
       _clang_Cursor_getBriefCommentText_wrap;
 
   ffi.Pointer<CXSourceLocation> clang_getCursorLocation_wrap(
@@ -643,12 +643,12 @@
     _clang_getCursorLocation_wrap ??= _dylib.lookupFunction<
         _c_clang_getCursorLocation_wrap,
         _dart_clang_getCursorLocation_wrap>('clang_getCursorLocation_wrap');
-    return _clang_getCursorLocation_wrap(
+    return _clang_getCursorLocation_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_getCursorLocation_wrap _clang_getCursorLocation_wrap;
+  _dart_clang_getCursorLocation_wrap? _clang_getCursorLocation_wrap;
 
   void clang_getFileLocation_wrap(
     ffi.Pointer<CXSourceLocation> location,
@@ -660,7 +660,7 @@
     _clang_getFileLocation_wrap ??= _dylib.lookupFunction<
         _c_clang_getFileLocation_wrap,
         _dart_clang_getFileLocation_wrap>('clang_getFileLocation_wrap');
-    return _clang_getFileLocation_wrap(
+    return _clang_getFileLocation_wrap!(
       location,
       file,
       line,
@@ -669,19 +669,19 @@
     );
   }
 
-  _dart_clang_getFileLocation_wrap _clang_getFileLocation_wrap;
+  _dart_clang_getFileLocation_wrap? _clang_getFileLocation_wrap;
 
   ffi.Pointer<CXString> clang_getFileName_wrap(
     ffi.Pointer<ffi.Void> SFile,
   ) {
     _clang_getFileName_wrap ??= _dylib.lookupFunction<_c_clang_getFileName_wrap,
         _dart_clang_getFileName_wrap>('clang_getFileName_wrap');
-    return _clang_getFileName_wrap(
+    return _clang_getFileName_wrap!(
       SFile,
     );
   }
 
-  _dart_clang_getFileName_wrap _clang_getFileName_wrap;
+  _dart_clang_getFileName_wrap? _clang_getFileName_wrap;
 
   int clang_getNumElements_wrap(
     ffi.Pointer<CXType> cxtype,
@@ -689,12 +689,12 @@
     _clang_getNumElements_wrap ??= _dylib.lookupFunction<
         _c_clang_getNumElements_wrap,
         _dart_clang_getNumElements_wrap>('clang_getNumElements_wrap');
-    return _clang_getNumElements_wrap(
+    return _clang_getNumElements_wrap!(
       cxtype,
     );
   }
 
-  _dart_clang_getNumElements_wrap _clang_getNumElements_wrap;
+  _dart_clang_getNumElements_wrap? _clang_getNumElements_wrap;
 
   ffi.Pointer<CXType> clang_getArrayElementType_wrap(
     ffi.Pointer<CXType> cxtype,
@@ -702,12 +702,12 @@
     _clang_getArrayElementType_wrap ??= _dylib.lookupFunction<
         _c_clang_getArrayElementType_wrap,
         _dart_clang_getArrayElementType_wrap>('clang_getArrayElementType_wrap');
-    return _clang_getArrayElementType_wrap(
+    return _clang_getArrayElementType_wrap!(
       cxtype,
     );
   }
 
-  _dart_clang_getArrayElementType_wrap _clang_getArrayElementType_wrap;
+  _dart_clang_getArrayElementType_wrap? _clang_getArrayElementType_wrap;
 
   int clang_Cursor_isMacroFunctionLike_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -716,12 +716,12 @@
             _c_clang_Cursor_isMacroFunctionLike_wrap,
             _dart_clang_Cursor_isMacroFunctionLike_wrap>(
         'clang_Cursor_isMacroFunctionLike_wrap');
-    return _clang_Cursor_isMacroFunctionLike_wrap(
+    return _clang_Cursor_isMacroFunctionLike_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_isMacroFunctionLike_wrap
+  _dart_clang_Cursor_isMacroFunctionLike_wrap?
       _clang_Cursor_isMacroFunctionLike_wrap;
 
   int clang_Cursor_isMacroBuiltin_wrap(
@@ -731,12 +731,12 @@
             _c_clang_Cursor_isMacroBuiltin_wrap,
             _dart_clang_Cursor_isMacroBuiltin_wrap>(
         'clang_Cursor_isMacroBuiltin_wrap');
-    return _clang_Cursor_isMacroBuiltin_wrap(
+    return _clang_Cursor_isMacroBuiltin_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_isMacroBuiltin_wrap _clang_Cursor_isMacroBuiltin_wrap;
+  _dart_clang_Cursor_isMacroBuiltin_wrap? _clang_Cursor_isMacroBuiltin_wrap;
 
   ffi.Pointer<ffi.Void> clang_Cursor_Evaluate_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -744,12 +744,12 @@
     _clang_Cursor_Evaluate_wrap ??= _dylib.lookupFunction<
         _c_clang_Cursor_Evaluate_wrap,
         _dart_clang_Cursor_Evaluate_wrap>('clang_Cursor_Evaluate_wrap');
-    return _clang_Cursor_Evaluate_wrap(
+    return _clang_Cursor_Evaluate_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_Evaluate_wrap _clang_Cursor_Evaluate_wrap;
+  _dart_clang_Cursor_Evaluate_wrap? _clang_Cursor_Evaluate_wrap;
 
   int clang_Cursor_isAnonymous_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -757,12 +757,12 @@
     _clang_Cursor_isAnonymous_wrap ??= _dylib.lookupFunction<
         _c_clang_Cursor_isAnonymous_wrap,
         _dart_clang_Cursor_isAnonymous_wrap>('clang_Cursor_isAnonymous_wrap');
-    return _clang_Cursor_isAnonymous_wrap(
+    return _clang_Cursor_isAnonymous_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_isAnonymous_wrap _clang_Cursor_isAnonymous_wrap;
+  _dart_clang_Cursor_isAnonymous_wrap? _clang_Cursor_isAnonymous_wrap;
 
   int clang_Cursor_isAnonymousRecordDecl_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -771,12 +771,12 @@
             _c_clang_Cursor_isAnonymousRecordDecl_wrap,
             _dart_clang_Cursor_isAnonymousRecordDecl_wrap>(
         'clang_Cursor_isAnonymousRecordDecl_wrap');
-    return _clang_Cursor_isAnonymousRecordDecl_wrap(
+    return _clang_Cursor_isAnonymousRecordDecl_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_Cursor_isAnonymousRecordDecl_wrap
+  _dart_clang_Cursor_isAnonymousRecordDecl_wrap?
       _clang_Cursor_isAnonymousRecordDecl_wrap;
 
   ffi.Pointer<CXString> clang_getCursorUSR_wrap(
@@ -785,12 +785,12 @@
     _clang_getCursorUSR_wrap ??= _dylib.lookupFunction<
         _c_clang_getCursorUSR_wrap,
         _dart_clang_getCursorUSR_wrap>('clang_getCursorUSR_wrap');
-    return _clang_getCursorUSR_wrap(
+    return _clang_getCursorUSR_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_getCursorUSR_wrap _clang_getCursorUSR_wrap;
+  _dart_clang_getCursorUSR_wrap? _clang_getCursorUSR_wrap;
 
   int clang_getFieldDeclBitWidth_wrap(
     ffi.Pointer<CXCursor> cursor,
@@ -799,12 +799,12 @@
             _c_clang_getFieldDeclBitWidth_wrap,
             _dart_clang_getFieldDeclBitWidth_wrap>(
         'clang_getFieldDeclBitWidth_wrap');
-    return _clang_getFieldDeclBitWidth_wrap(
+    return _clang_getFieldDeclBitWidth_wrap!(
       cursor,
     );
   }
 
-  _dart_clang_getFieldDeclBitWidth_wrap _clang_getFieldDeclBitWidth_wrap;
+  _dart_clang_getFieldDeclBitWidth_wrap? _clang_getFieldDeclBitWidth_wrap;
 }
 
 /// A character string.
@@ -814,10 +814,10 @@
 /// Use \c clang_getCString() to retrieve the string data and, once finished
 /// with the string data, call \c clang_disposeString() to free the string.
 class CXString extends ffi.Struct {
-  ffi.Pointer<ffi.Void> data;
+  ffi.Pointer<ffi.Void>? data;
 
   @ffi.Uint32()
-  int private_flags;
+  int? private_flags;
 }
 
 class CXTranslationUnitImpl extends ffi.Struct {}
@@ -831,14 +831,14 @@
   /// The file whose contents have not yet been saved.
   ///
   /// This file must already exist in the file system.
-  ffi.Pointer<ffi.Int8> Filename;
+  ffi.Pointer<ffi.Int8>? Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  ffi.Pointer<ffi.Int8> Contents;
+  ffi.Pointer<ffi.Int8>? Contents;
 
   /// The length of the unsaved contents of this buffer.
   @ffi.Uint64()
-  int Length;
+  int? Length;
 }
 
 /// Identifies a specific source location within a translation
@@ -847,14 +847,14 @@
 /// Use clang_getExpansionLocation() or clang_getSpellingLocation()
 /// to map a source location to a particular file, line, and column.
 class CXSourceLocation extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  ffi.Pointer<ffi.Void>? _unique_ptr_data_item_0;
+  ffi.Pointer<ffi.Void>? _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceLocation_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXSourceLocation_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int int_data;
+  int? int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXSourceLocation`.
@@ -873,7 +873,7 @@
     }
   }
 
-  ffi.Pointer<ffi.Void> operator [](int index) {
+  ffi.Pointer<ffi.Void>? operator [](int index) {
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
@@ -905,17 +905,17 @@
 /// Use clang_getRangeStart() and clang_getRangeEnd() to retrieve the
 /// starting and end locations from a source range, respectively.
 class CXSourceRange extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  ffi.Pointer<ffi.Void>? _unique_ptr_data_item_0;
+  ffi.Pointer<ffi.Void>? _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceRange_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXSourceRange_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int begin_int_data;
+  int? begin_int_data;
 
   @ffi.Uint32()
-  int end_int_data;
+  int? end_int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXSourceRange`.
@@ -934,7 +934,7 @@
     }
   }
 
-  ffi.Pointer<ffi.Void> operator [](int index) {
+  ffi.Pointer<ffi.Void>? operator [](int index) {
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
@@ -1939,14 +1939,14 @@
 /// source code into the AST.
 class CXCursor extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  int? kind;
 
   @ffi.Int32()
-  int xdata;
+  int? xdata;
 
-  ffi.Pointer<ffi.Void> _unique_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_data_item_1;
-  ffi.Pointer<ffi.Void> _unique_data_item_2;
+  ffi.Pointer<ffi.Void>? _unique_data_item_0;
+  ffi.Pointer<ffi.Void>? _unique_data_item_1;
+  ffi.Pointer<ffi.Void>? _unique_data_item_2;
 
   /// Helper for array `data`.
   ArrayHelper_CXCursor_data_level0 get data =>
@@ -1969,7 +1969,7 @@
     }
   }
 
-  ffi.Pointer<ffi.Void> operator [](int index) {
+  ffi.Pointer<ffi.Void>? operator [](int index) {
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
@@ -2134,10 +2134,10 @@
 /// The type of an element in the abstract syntax tree.
 class CXType extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  int? kind;
 
-  ffi.Pointer<ffi.Void> _unique_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_data_item_1;
+  ffi.Pointer<ffi.Void>? _unique_data_item_0;
+  ffi.Pointer<ffi.Void>? _unique_data_item_1;
 
   /// Helper for array `data`.
   ArrayHelper_CXType_data_level0 get data =>
@@ -2160,7 +2160,7 @@
     }
   }
 
-  ffi.Pointer<ffi.Void> operator [](int index) {
+  ffi.Pointer<ffi.Void>? operator [](int index) {
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
@@ -2398,7 +2398,7 @@
 );
 
 typedef _dart_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  int typeKind,
+  int? typeKind,
 );
 
 typedef _c_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
diff --git a/lib/src/header_parser/data.dart b/lib/src/header_parser/data.dart
index c307a26..462f069 100644
--- a/lib/src/header_parser/data.dart
+++ b/lib/src/header_parser/data.dart
@@ -7,7 +7,6 @@
 
 import 'package:ffigen/src/code_generator.dart' show Constant;
 import 'package:ffigen/src/config_provider.dart' show Config;
-import 'package:meta/meta.dart';
 import 'clang_bindings/clang_bindings.dart' show Clang;
 
 import 'utils.dart';
@@ -16,19 +15,19 @@
 
 /// Holds configurations.
 Config get config => _config;
-Config _config;
+late Config _config;
 
 /// Holds clang functions.
 Clang get clang => _clang;
-Clang _clang;
+late Clang _clang;
 
 // Tracks seen status for bindings
 BindingsIndex get bindingsIndex => _bindingsIndex;
-BindingsIndex _bindingsIndex;
+BindingsIndex _bindingsIndex = BindingsIndex();
 
 /// Used for naming typedefs.
 IncrementalNamer get incrementalNamer => _incrementalNamer;
-IncrementalNamer _incrementalNamer;
+IncrementalNamer _incrementalNamer = IncrementalNamer();
 
 /// Holds the unique id refering to this isolate.
 ///
@@ -38,13 +37,13 @@
 
 /// Saved macros, Key: prefixedName, Value originalName.
 Map<String, Macro> get savedMacros => _savedMacros;
-Map<String, Macro> _savedMacros;
+Map<String, Macro> _savedMacros = {};
 
 /// Saved unnamed EnumConstants.
 List<Constant> get unnamedEnumConstants => _unnamedEnumConstants;
-List<Constant> _unnamedEnumConstants;
+List<Constant> _unnamedEnumConstants = [];
 
-void initializeGlobals({@required Config config, @required Clang clang}) {
+void initializeGlobals({required Config config, required Clang clang}) {
   _config = config;
   _clang = clang;
   _incrementalNamer = IncrementalNamer();
diff --git a/lib/src/header_parser/includer.dart b/lib/src/header_parser/includer.dart
index 5c8775b..67efefc 100644
--- a/lib/src/header_parser/includer.dart
+++ b/lib/src/header_parser/includer.dart
@@ -10,8 +10,7 @@
 bool shouldIncludeStruct(String usr, String name) {
   if (bindingsIndex.isSeenStruct(usr) || name == '') {
     return false;
-  } else if (config.structDecl == null ||
-      config.structDecl.shouldInclude(name)) {
+  } else if (config.structDecl.shouldInclude(name)) {
     return true;
   } else {
     return false;
@@ -21,8 +20,7 @@
 bool shouldIncludeFunc(String usr, String name) {
   if (bindingsIndex.isSeenFunc(usr) || name == '') {
     return false;
-  } else if (config.functionDecl == null ||
-      config.functionDecl.shouldInclude(name)) {
+  } else if (config.functionDecl.shouldInclude(name)) {
     return true;
   } else {
     return false;
@@ -32,8 +30,7 @@
 bool shouldIncludeEnumClass(String usr, String name) {
   if (bindingsIndex.isSeenEnumClass(usr) || name == '') {
     return false;
-  } else if (config.enumClassDecl == null ||
-      config.enumClassDecl.shouldInclude(name)) {
+  } else if (config.enumClassDecl.shouldInclude(name)) {
     return true;
   } else {
     return false;
@@ -43,8 +40,7 @@
 bool shouldIncludeUnnamedEnumConstant(String usr, String name) {
   if (bindingsIndex.isSeenUnnamedEnumConstant(usr) || name == '') {
     return false;
-  } else if (config.unnamedEnumConstants == null ||
-      config.unnamedEnumConstants.shouldInclude(name)) {
+  } else if (config.unnamedEnumConstants.shouldInclude(name)) {
     return true;
   } else {
     return false;
@@ -54,7 +50,7 @@
 bool shouldIncludeMacro(String usr, String name) {
   if (bindingsIndex.isSeenMacro(usr) || name == '') {
     return false;
-  } else if (config.macroDecl == null || config.macroDecl.shouldInclude(name)) {
+  } else if (config.macroDecl.shouldInclude(name)) {
     return true;
   } else {
     return false;
@@ -66,7 +62,7 @@
 
 /// True if a cursor should be included based on headers config, used on root
 /// declarations.
-bool shouldIncludeRootCursor(String sourceFile) {
+bool shouldIncludeRootCursor(String? sourceFile) {
   // Handle null in case of system headers or macros.
   if (sourceFile == null) {
     return false;
@@ -78,5 +74,5 @@
         config.headers.includeFilter.shouldInclude(sourceFile);
   }
 
-  return _headerCache[sourceFile];
+  return _headerCache[sourceFile]!;
 }
diff --git a/lib/src/header_parser/parser.dart b/lib/src/header_parser/parser.dart
index 0cbe3c8..7ce92fe 100644
--- a/lib/src/header_parser/parser.dart
+++ b/lib/src/header_parser/parser.dart
@@ -48,11 +48,12 @@
 /// Initializes parser, clears any previous values.
 void initParser(Config c) {
   // Find full path of dynamic library and initialize bindings.
-  if (findDotDartTool() == null) {
+  final ddt = findDotDartTool();
+  if (ddt == null) {
     throw Exception('Unable to find .dart_tool.');
   } else {
     final fullDylibPath = path.join(
-      findDotDartTool().toFilePath(),
+      ddt.toFilePath(),
       strings.ffigenFolderName,
       strings.dylibFileName,
     );
@@ -78,10 +79,8 @@
     config.compilerOpts.add(strings.fparseAllComments);
   }
 
-  if (config.compilerOpts != null) {
-    clangCmdArgs = createDynamicStringArray(config.compilerOpts);
-    cmdLen = config.compilerOpts.length;
-  }
+  clangCmdArgs = createDynamicStringArray(config.compilerOpts);
+  cmdLen = config.compilerOpts.length;
 
   // Contains all bindings. A set ensures we never have duplicates.
   final bindings = <Binding>{};
@@ -114,7 +113,7 @@
     logTuDiagnostics(tu, _logger, headerLocation);
     final rootCursor = clang.clang_getTranslationUnitCursor_wrap(tu);
 
-    bindings.addAll(parseTranslationUnit(rootCursor));
+    bindings.addAll(parseTranslationUnit(rootCursor)!);
 
     // Cleanup.
     rootCursor.dispose();
@@ -125,11 +124,9 @@
   bindings.addAll(unnamedEnumConstants);
 
   // Parse all saved macros.
-  bindings.addAll(parseSavedMacros());
+  bindings.addAll(parseSavedMacros()!);
 
-  if (config.compilerOpts != null) {
-    clangCmdArgs.dispose(config.compilerOpts.length);
-  }
+  clangCmdArgs.dispose(config.compilerOpts.length);
   clang.clang_disposeIndex(index);
   return bindings.toList();
 }
diff --git a/lib/src/header_parser/sub_parsers/enumdecl_parser.dart b/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
index 06ce225..1097372 100644
--- a/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
@@ -18,18 +18,18 @@
 
 /// Holds temporary information regarding [EnumClass] while parsing.
 class _ParsedEnum {
-  EnumClass enumClass;
+  EnumClass? enumClass;
   _ParsedEnum();
 }
 
 final _stack = Stack<_ParsedEnum>();
 
 /// Parses a function declaration.
-EnumClass parseEnumDeclaration(
+EnumClass? parseEnumDeclaration(
   Pointer<clang_types.CXCursor> cursor, {
 
   /// Optionally provide name to use (useful in case enum is inside a typedef).
-  String name,
+  String? name,
 }) {
   _stack.push(_ParsedEnum());
   final enumUsr = cursor.usr();
@@ -50,14 +50,14 @@
       originalName: enumName,
       name: config.enumClassDecl.renameUsingConfig(enumName),
     );
-    bindingsIndex.addEnumClassToSeen(enumUsr, _stack.top.enumClass);
+    bindingsIndex.addEnumClassToSeen(enumUsr, _stack.top.enumClass!);
     _addEnumConstant(cursor);
   }
   if (bindingsIndex.isSeenEnumClass(enumUsr)) {
     _stack.top.enumClass = bindingsIndex.getSeenEnumClass(enumUsr);
 
     // If enum is seen, update it's name.
-    _stack.top.enumClass.name =
+    _stack.top.enumClass!.name =
         config.enumClassDecl.renameUsingConfig(enumName);
   }
 
@@ -102,7 +102,7 @@
 
 /// Adds the parameter to func in [functiondecl_parser.dart].
 void _addEnumConstantToEnumClass(Pointer<clang_types.CXCursor> cursor) {
-  _stack.top.enumClass.enumConstants.add(
+  _stack.top.enumClass!.enumConstants.add(
     EnumConstant(
         dartDoc: getCursorDocComment(
           cursor,
@@ -110,7 +110,7 @@
         ),
         originalName: cursor.spelling(),
         name: config.enumClassDecl.renameMemberUsingConfig(
-          _stack.top.enumClass.originalName,
+          _stack.top.enumClass!.originalName,
           cursor.spelling(),
         ),
         value: clang.clang_getEnumConstantDeclValue_wrap(cursor)),
diff --git a/lib/src/header_parser/sub_parsers/functiondecl_parser.dart b/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
index 3be5c1e..2b005d8 100644
--- a/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
@@ -17,7 +17,7 @@
 
 /// Holds temporary information regarding [Func] while parsing.
 class _ParserFunc {
-  Func func;
+  Func? func;
   bool structByValueParameter = false;
   bool unimplementedParameterType = false;
   _ParserFunc();
@@ -26,7 +26,7 @@
 final _stack = Stack<_ParserFunc>();
 
 /// Parses a function declaration.
-Func parseFunctionDeclaration(Pointer<clang_types.CXCursor> cursor) {
+Func? parseFunctionDeclaration(Pointer<clang_types.CXCursor> cursor) {
   _stack.push(_ParserFunc());
   _stack.top.structByValueParameter = false;
   _stack.top.unimplementedParameterType = false;
@@ -72,7 +72,7 @@
       returnType: rt,
       parameters: parameters,
     );
-    bindingsIndex.addFuncToSeen(funcUsr, _stack.top.func);
+    bindingsIndex.addFuncToSeen(funcUsr, _stack.top.func!);
   } else if (bindingsIndex.isSeenFunc(funcUsr)) {
     _stack.top.func = bindingsIndex.getSeenFunc(funcUsr);
   }
diff --git a/lib/src/header_parser/sub_parsers/macro_parser.dart b/lib/src/header_parser/sub_parsers/macro_parser.dart
index 6c13ada..704eade 100644
--- a/lib/src/header_parser/sub_parsers/macro_parser.dart
+++ b/lib/src/header_parser/sub_parsers/macro_parser.dart
@@ -43,12 +43,12 @@
   savedMacros[name] = Macro(usr, originalName);
 }
 
-List<Constant> _bindings;
+List<Constant>? _bindings;
 
 /// Macros cannot be parsed directly, so we create a new `.hpp` file in which
 /// they are assigned to a variable after which their value can be determined
 /// by evaluating the value of the variable.
-List<Constant> parseSavedMacros() {
+List<Constant>? parseSavedMacros() {
   _bindings = [];
 
   if (savedMacros.keys.isEmpty) {
@@ -102,7 +102,7 @@
 /// Child visitor invoked on translationUnitCursor for parsing macroVariables.
 int _macroVariablevisitor(Pointer<clang_types.CXCursor> cursor,
     Pointer<clang_types.CXCursor> parent, Pointer<Void> clientData) {
-  Constant constant;
+  Constant? constant;
   try {
     if (isFromGeneratedFile(cursor) &&
         _macroVarNames.contains(cursor.spelling()) &&
@@ -116,8 +116,8 @@
       switch (k) {
         case clang_types.CXEvalResultKind.CXEval_Int:
           constant = Constant(
-            usr: savedMacros[macroName].usr,
-            originalName: savedMacros[macroName].originalName,
+            usr: savedMacros[macroName]!.usr,
+            originalName: savedMacros[macroName]!.originalName,
             name: macroName,
             rawType: 'int',
             rawValue: clang.clang_EvalResult_getAsLongLong(e).toString(),
@@ -125,8 +125,8 @@
           break;
         case clang_types.CXEvalResultKind.CXEval_Float:
           constant = Constant(
-            usr: savedMacros[macroName].usr,
-            originalName: savedMacros[macroName].originalName,
+            usr: savedMacros[macroName]!.usr,
+            originalName: savedMacros[macroName]!.originalName,
             name: macroName,
             rawType: 'double',
             rawValue:
@@ -139,8 +139,8 @@
             clang.clang_EvalResult_getAsStr(e),
           );
           constant = Constant(
-            usr: savedMacros[macroName].usr,
-            originalName: savedMacros[macroName].originalName,
+            usr: savedMacros[macroName]!.usr,
+            originalName: savedMacros[macroName]!.originalName,
             name: macroName,
             rawType: 'String',
             rawValue: "'${rawValue}'",
@@ -150,7 +150,7 @@
       clang.clang_EvalResult_dispose(e);
 
       if (constant != null) {
-        _bindings.add(constant);
+        _bindings!.add(constant);
       }
     }
     cursor.dispose();
@@ -174,12 +174,12 @@
 }
 
 /// Base name of generated file.
-String _generatedFileBaseName;
+String? _generatedFileBaseName;
 
 /// Generated macro variable names.
 ///
 /// Used to determine if macro should be included in bindings or not.
-Set<String> _macroVarNames;
+late Set<String> _macroVarNames;
 
 /// Creates a temporary file for parsing macros in current directory.
 File createFileForMacros() {
@@ -210,7 +210,7 @@
     // Write macro.
     final macroVarName = MacroVariableString.encode(prefixedMacroName);
     sb.writeln(
-        'auto ${macroVarName} = ${savedMacros[prefixedMacroName].originalName};');
+        'auto ${macroVarName} = ${savedMacros[prefixedMacroName]!.originalName};');
     // Add to _macroVarNames.
     _macroVarNames.add(macroVarName);
   }
@@ -235,7 +235,7 @@
     // Remove underscore.
     s = s.substring(1);
     final intReg = RegExp('[0-9]+');
-    final lengthEnd = intReg.matchAsPrefix(s).end;
+    final lengthEnd = intReg.matchAsPrefix(s)!.end;
     final len = int.parse(s.substring(0, lengthEnd));
 
     // Name starts after an unerscore.
diff --git a/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
index 334349c..bce2eb4 100644
--- a/lib/src/header_parser/sub_parsers/structdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
@@ -16,7 +16,7 @@
 
 /// Holds temporary information regarding [struc] while parsing.
 class _ParsedStruc {
-  Struc struc;
+  Struc? struc;
   bool nestedStructMember = false;
   bool unimplementedMemberType = false;
   bool flexibleArrayMember = false;
@@ -29,11 +29,11 @@
 final _stack = Stack<_ParsedStruc>();
 
 /// Parses a struct declaration.
-Struc parseStructDeclaration(
+Struc? parseStructDeclaration(
   Pointer<clang_types.CXCursor> cursor, {
 
   /// Optionally provide name (useful in case struct is inside a typedef).
-  String name,
+  String? name,
 
   /// Option to ignore struct filter (Useful in case of extracting structs
   /// when they are passed/returned by an included function.)
@@ -58,7 +58,7 @@
     );
     // Adding to seen here to stop recursion if a struct has itself as a
     // member, members are updated later.
-    bindingsIndex.addStructToSeen(structUsr, _stack.top.struc);
+    bindingsIndex.addStructToSeen(structUsr, _stack.top.struc!);
     _setStructMembers(cursor);
   }
 
@@ -66,7 +66,7 @@
     _stack.top.struc = bindingsIndex.getSeenStruct(structUsr);
 
     // If struct is seen, update it's name.
-    _stack.top.struc.name = config.structDecl.renameUsingConfig(structName);
+    _stack.top.struc!.name = config.structDecl.renameUsingConfig(structName);
   }
   return _stack.pop().struc;
 }
@@ -90,38 +90,38 @@
     _logger.fine(
         '---- Removed Struct members, reason: struct has array members ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All Struct Members from: ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Array members not supported');
-    return _stack.top.struc.members.clear();
+        'Removed All Struct Members from: ${_stack.top.struc!.name}(${_stack.top.struc!.originalName}), Array members not supported');
+    return _stack.top.struc!.members.clear();
   } else if (_stack.top.nestedStructMember) {
     _logger.fine(
         '---- Removed Struct members, reason: struct has struct members ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Nested Structures not supported.');
-    return _stack.top.struc.members.clear();
+        'Removed All Struct Members from ${_stack.top.struc!.name}(${_stack.top.struc!.originalName}), Nested Structures not supported.');
+    return _stack.top.struc!.members.clear();
   } else if (_stack.top.unimplementedMemberType) {
     _logger.fine(
         '---- Removed Struct members, reason: member with unimplementedtype ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), struct member has an unsupported type.');
-    return _stack.top.struc.members.clear();
+        'Removed All Struct Members from ${_stack.top.struc!.name}(${_stack.top.struc!.originalName}), struct member has an unsupported type.');
+    return _stack.top.struc!.members.clear();
   } else if (_stack.top.flexibleArrayMember) {
     _logger.fine(
         '---- Removed Struct members, reason: incomplete array member ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Flexible array members not supported.');
-    return _stack.top.struc.members.clear();
+        'Removed All Struct Members from ${_stack.top.struc!.name}(${_stack.top.struc!.originalName}), Flexible array members not supported.');
+    return _stack.top.struc!.members.clear();
   } else if (_stack.top.bitFieldMember) {
     _logger.fine(
         '---- Removed Struct members, reason: bitfield members ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Bit Field members not supported.');
-    return _stack.top.struc.members.clear();
+        'Removed All Struct Members from ${_stack.top.struc!.name}(${_stack.top.struc!.originalName}), Bit Field members not supported.');
+    return _stack.top.struc!.members.clear();
   } else if (_stack.top.dartHandleMember) {
     _logger.fine(
         '---- Removed Struct members, reason: Dart_Handle member. ${cursor.completeStringRepr()}');
     _logger.warning(
-        'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Dart_Handle member not supported.');
-    return _stack.top.struc.members.clear();
+        'Removed All Struct Members from ${_stack.top.struc!.name}(${_stack.top.struc!.originalName}), Dart_Handle member not supported.');
+    return _stack.top.struc!.members.clear();
   }
 }
 
@@ -142,7 +142,7 @@
         _stack.top.nestedStructMember = true;
       } else if (mt.broadType == BroadType.ConstantArray) {
         _stack.top.arrayMember = true;
-        if (mt.child.broadType == BroadType.Struct) {
+        if (mt.child!.broadType == BroadType.Struct) {
           // Setting this flag will exclude adding members for this struct's
           // bindings.
           _stack.top.nestedStructMember = true;
@@ -161,7 +161,7 @@
         _stack.top.unimplementedMemberType = true;
       }
 
-      _stack.top.struc.members.add(
+      _stack.top.struc!.members.add(
         Member(
           dartDoc: getCursorDocComment(
             cursor,
@@ -169,7 +169,7 @@
           ),
           originalName: cursor.spelling(),
           name: config.structDecl.renameMemberUsingConfig(
-            _stack.top.struc.originalName,
+            _stack.top.struc!.originalName,
             cursor.spelling(),
           ),
           type: mt,
diff --git a/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart b/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
index 3801dde..de39f20 100644
--- a/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
@@ -18,15 +18,15 @@
 /// Holds temporary information regarding a typedef referenced [Binding]
 /// while parsing.
 class _ParsedTypedef {
-  Binding binding;
-  String typedefName;
+  Binding? binding;
+  String? typedefName;
   _ParsedTypedef();
 }
 
 final _stack = Stack<_ParsedTypedef>();
 
 /// Parses a typedef declaration.
-Binding parseTypedefDeclaration(Pointer<clang_types.CXCursor> cursor) {
+Binding? parseTypedefDeclaration(Pointer<clang_types.CXCursor> cursor) {
   _stack.push(_ParsedTypedef());
   // Name of typedef.
   _stack.top.typedefName = cursor.spelling();
diff --git a/lib/src/header_parser/translation_unit_parser.dart b/lib/src/header_parser/translation_unit_parser.dart
index 5ca8997..c4ad7e9 100644
--- a/lib/src/header_parser/translation_unit_parser.dart
+++ b/lib/src/header_parser/translation_unit_parser.dart
@@ -19,10 +19,10 @@
 
 final _logger = Logger('ffigen.header_parser.translation_unit_parser');
 
-Set<Binding> _bindings;
+Set<Binding>? _bindings;
 
 /// Parses the translation unit and returns the generated bindings.
-Set<Binding> parseTranslationUnit(
+Set<Binding>? parseTranslationUnit(
     Pointer<clang_types.CXCursor> translationUnitCursor) {
   _bindings = {};
   final resultCode = clang.clang_visitChildren_wrap(
@@ -78,9 +78,9 @@
 }
 
 /// Adds to binding if unseen and not null.
-void addToBindings(Binding b) {
+void addToBindings(Binding? b) {
   if (b != null) {
     // This is a set, and hence will not have duplicates.
-    _bindings.add(b);
+    _bindings!.add(b);
   }
 }
diff --git a/lib/src/header_parser/type_extractor/cxtypekindmap.dart b/lib/src/header_parser/type_extractor/cxtypekindmap.dart
index 6dd175f..1ecfdb3 100644
--- a/lib/src/header_parser/type_extractor/cxtypekindmap.dart
+++ b/lib/src/header_parser/type_extractor/cxtypekindmap.dart
@@ -27,7 +27,7 @@
   clang.CXTypeKind.CXType_Enum: SupportedNativeType.Int32,
 };
 
-SupportedNativeType get enumNativeType =>
+SupportedNativeType? get enumNativeType =>
     cxTypeKindToSupportedNativeTypes[clang.CXTypeKind.CXType_Enum];
 
 var suportedTypedefToSuportedNativeType = <String, SupportedNativeType>{
diff --git a/lib/src/header_parser/type_extractor/extractor.dart b/lib/src/header_parser/type_extractor/extractor.dart
index 4137e77..2c77030 100644
--- a/lib/src/header_parser/type_extractor/extractor.dart
+++ b/lib/src/header_parser/type_extractor/extractor.dart
@@ -20,7 +20,7 @@
 const _padding = '  ';
 
 /// Converts cxtype to a typestring code_generator can accept.
-Type getCodeGenType(Pointer<clang_types.CXType> cxtype, {String parentName}) {
+Type getCodeGenType(Pointer<clang_types.CXType> cxtype, {String? parentName}) {
   _logger.fine('${_padding}getCodeGenType ${cxtype.completeStringRepr()}');
   final kind = cxtype.kind();
 
@@ -33,7 +33,7 @@
       // Replace Pointer<_Dart_Handle> with Handle.
       if (config.useDartHandle &&
           s.broadType == BroadType.Struct &&
-          s.struc.usr == strings.dartHandleUsr) {
+          s.struc!.usr == strings.dartHandleUsr) {
         return Type.handle();
       }
       return Type.pointer(s);
@@ -41,13 +41,14 @@
       final spelling = cxtype.spelling();
       if (config.typedefNativeTypeMappings.containsKey(spelling)) {
         _logger.fine('  Type Mapped from typedef-map');
-        return Type.nativeType(config.typedefNativeTypeMappings[spelling]);
+        return Type.nativeType(config.typedefNativeTypeMappings[spelling!]);
       }
       // Get name from supported typedef name if config allows.
       if (config.useSupportedTypedefs) {
         if (suportedTypedefToSuportedNativeType.containsKey(spelling)) {
           _logger.fine('  Type Mapped from supported typedef');
-          return Type.nativeType(suportedTypedefToSuportedNativeType[spelling]);
+          return Type.nativeType(
+              suportedTypedefToSuportedNativeType[spelling!]);
         }
       }
 
@@ -91,7 +92,7 @@
     default:
       if (cxTypeKindToSupportedNativeTypes.containsKey(kind)) {
         return Type.nativeType(
-          cxTypeKindToSupportedNativeTypes[kind],
+          cxTypeKindToSupportedNativeTypes[kind!],
         );
       } else {
         _logger.fine(
@@ -102,7 +103,8 @@
   }
 }
 
-Type _extractfromRecord(Pointer<clang_types.CXType> cxtype, String parentName) {
+Type _extractfromRecord(
+    Pointer<clang_types.CXType> cxtype, String? parentName) {
   Type type;
 
   final cursor = clang.clang_getTypeDeclaration_wrap(cxtype);
@@ -145,7 +147,7 @@
 
 // Used for function pointer arguments.
 Type _extractFromFunctionProto(
-    Pointer<clang_types.CXType> cxtype, String parentName) {
+    Pointer<clang_types.CXType> cxtype, String? parentName) {
   var name = parentName;
 
   // An empty name means the function prototype was declared in-place, instead
@@ -168,7 +170,7 @@
     );
   }
 
-  Typedef typedefC;
+  Typedef? typedefC;
   if (bindingsIndex.isSeenFunctionTypedef(name)) {
     typedefC = bindingsIndex.getSeenFunctionTypedef(name);
   } else {
diff --git a/lib/src/header_parser/utils.dart b/lib/src/header_parser/utils.dart
index df41d6f..ca7f0cf 100644
--- a/lib/src/header_parser/utils.dart
+++ b/lib/src/header_parser/utils.dart
@@ -45,7 +45,7 @@
           clang_types
               .CXDiagnosticDisplayOptions.CXDiagnostic_DisplayCategoryName,
     );
-    logger.severe('    ' + cxstring.toStringAndDispose());
+    logger.severe('    ' + cxstring.toStringAndDispose()!);
     clang.clang_disposeDiagnostic(diag);
   }
 }
@@ -58,7 +58,7 @@
 
 extension CXCursorExt on Pointer<clang_types.CXCursor> {
   String usr() {
-    return clang.clang_getCursorUSR_wrap(this).toStringAndDispose();
+    return clang.clang_getCursorUSR_wrap(this).toStringAndDispose()!;
   }
 
   /// Returns the kind int from [clang_types.CXCursorKind].
@@ -68,14 +68,14 @@
 
   /// Name of the cursor (E.g function name, Struct name, Parameter name).
   String spelling() {
-    return clang.clang_getCursorSpelling_wrap(this).toStringAndDispose();
+    return clang.clang_getCursorSpelling_wrap(this).toStringAndDispose()!;
   }
 
   /// Spelling for a [clang_types.CXCursorKind], useful for debug purposes.
   String kindSpelling() {
     return clang
         .clang_getCursorKindSpelling_wrap(clang.clang_getCursorKind_wrap(this))
-        .toStringAndDispose();
+        .toStringAndDispose()!;
   }
 
   /// for debug: returns [spelling] [kind] [kindSpelling] [type] [typeSpelling].
@@ -102,7 +102,7 @@
     return r;
   }
 
-  String sourceFileName() {
+  String? sourceFileName() {
     final cxsource = clang.clang_getCursorLocation_wrap(this);
     final cxfilePtr = allocate<Pointer<Void>>();
     final line = allocate<Uint32>();
@@ -137,9 +137,9 @@
 /// The given string is wrapped at line width = 80 - [indent]. The [indent] is
 /// [commentPrefix.dimensions] by default because a comment starts with
 /// [commentPrefix].
-String getCursorDocComment(Pointer<clang_types.CXCursor> cursor,
+String? getCursorDocComment(Pointer<clang_types.CXCursor> cursor,
     [int indent = commentPrefix.length]) {
-  String formattedDocComment;
+  String? formattedDocComment;
   final currentCommentRange = clang.clang_Cursor_getCommentRange_wrap(cursor);
 
   // See if this comment and the last comment both point to the same source
@@ -176,7 +176,7 @@
 ///
 /// Wrapping will work properly only when String has no new lines
 /// characters(\n).
-String _wrapNoNewLineString(String string, int lineWidth) {
+String? _wrapNoNewLineString(String? string, int lineWidth) {
   if (string == null || string.isEmpty) {
     return null;
   }
@@ -202,7 +202,7 @@
 }
 
 /// Removes /*, */ and any *'s in the beginning of a line.
-String removeRawCommentMarkups(String string) {
+String? removeRawCommentMarkups(String? string) {
   if (string == null || string.isEmpty) {
     return null;
   }
@@ -234,16 +234,16 @@
   }
 
   /// Spelling for a [clang_types.CXTypeKind], useful for debug purposes.
-  String spelling() {
+  String? spelling() {
     return clang.clang_getTypeSpelling_wrap(this).toStringAndDispose();
   }
 
   /// Returns the typeKind int from [clang_types.CXTypeKind].
-  int kind() {
+  int? kind() {
     return ref.kind;
   }
 
-  String kindSpelling() {
+  String? kindSpelling() {
     return clang.clang_getTypeKindSpelling_wrap(kind()).toStringAndDispose();
   }
 
@@ -264,8 +264,8 @@
   ///
   /// Make sure to dispose CXstring using dispose method, or use the
   /// [toStringAndDispose] method.
-  String string() {
-    String s;
+  String? string() {
+    String? s;
     final cstring = clang.clang_getCString_wrap(this);
     if (cstring != nullptr) {
       s = Utf8.fromUtf8(cstring.cast());
@@ -274,7 +274,7 @@
   }
 
   /// Converts CXString to dart string and disposes CXString.
-  String toStringAndDispose() {
+  String? toStringAndDispose() {
     // Note: clang_getCString_wrap returns a const char *, calling free will result in error.
     final s = string();
     clang.clang_disposeString_wrap(this);
@@ -329,7 +329,7 @@
 
 class Macro {
   final String usr;
-  final String originalName;
+  final String? originalName;
 
   Macro(this.usr, this.originalName);
 }
@@ -353,7 +353,7 @@
     _structs[usr] = struc;
   }
 
-  Struc getSeenStruct(String usr) {
+  Struc? getSeenStruct(String usr) {
     return _structs[usr];
   }
 
@@ -365,7 +365,7 @@
     _functions[usr] = func;
   }
 
-  Func getSeenFunc(String usr) {
+  Func? getSeenFunc(String usr) {
     return _functions[usr];
   }
 
@@ -377,7 +377,7 @@
     _enumClass[usr] = enumClass;
   }
 
-  EnumClass getSeenEnumClass(String usr) {
+  EnumClass? getSeenEnumClass(String usr) {
     return _enumClass[usr];
   }
 
@@ -389,7 +389,7 @@
     _unnamedEnumConstants[usr] = enumConstant;
   }
 
-  Constant getSeenUnnamedEnumConstant(String usr) {
+  Constant? getSeenUnnamedEnumConstant(String usr) {
     return _unnamedEnumConstants[usr];
   }
 
@@ -401,7 +401,7 @@
     _macros[usr] = macro;
   }
 
-  String getSeenMacro(String usr) {
+  String? getSeenMacro(String usr) {
     return _macros[usr];
   }
 
@@ -413,7 +413,7 @@
     _functionTypedefs[originalName] = t;
   }
 
-  Typedef getSeenFunctionTypedef(String originalName) {
+  Typedef? getSeenFunctionTypedef(String originalName) {
     return _functionTypedefs[originalName];
   }
 }
diff --git a/lib/src/strings.dart b/lib/src/strings.dart
index 74dc0fa..0abc9de 100644
--- a/lib/src/strings.dart
+++ b/lib/src/strings.dart
@@ -8,7 +8,7 @@
 import 'package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart'
     as clang;
 
-String get dylibVersion => ffigenVersion;
+String? get dylibVersion => ffigenVersion;
 
 /// Name of the dynamic library file according to current platform.
 String get dylibFileName {
diff --git a/pubspec.yaml b/pubspec.yaml
index 80feda7..2a07001 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,25 +3,24 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 1.2.0
+version: 2.0.0-nullsafety.0
 homepage: https://github.com/dart-lang/ffigen
 description: Experimental generator for FFI bindings, using LibClang to parse C header files.
 
 environment:
-  sdk: '>=2.7.0 <3.0.0'
+  sdk: '>=2.12.0-29.10.beta <3.0.0'
 
 dependencies:
-  ffi: ^0.1.3
-  yaml: ^2.2.1
-  meta: ^1.1.8
-  args: ^1.6.0
-  logging: ^0.11.4
-  cli_util: ^0.2.0
-  glob: ^1.2.0
-  path: ^1.7.0
-  quiver: ^2.1.3
-  pub_semver: ^1.4.4
+  ffi: ^0.2.0-nullsafety.1
+  yaml: ^3.0.0-nullsafety.0
+  path: ^1.8.0-nullsafety.3
+  quiver: ^3.0.0-nullsafety.2
+  args: ^1.6.0        # Not available
+  logging: ^0.11.4    # test->coverage->logging
+  cli_util: ^0.2.0    # test->analyzer->cli_util
+  glob: ^1.0.3        # test->analyzer->glob
+  pub_semver: ^1.4.4  # test->analyzer->pub_semver
 
 dev_dependencies:
-  pedantic: ^1.9.2
-  test: ^1.15.3
+  pedantic: ^1.10.0-nullsafety.3
+  test: ^1.16.0-nullsafety.13
diff --git a/test/code_generator_test.dart b/test/code_generator_test.dart
index 05dceb1..ea6393b 100644
--- a/test/code_generator_test.dart
+++ b/test/code_generator_test.dart
@@ -94,35 +94,32 @@
 /// heres another line
 int noParam(
 ) {
-_noParam ??= _dylib.lookupFunction<_c_noParam,_dart_noParam>('noParam');
-  return _noParam(
+return (_noParam ??= _dylib.lookupFunction<_c_noParam,_dart_noParam>('noParam'))(
   );
 }
-_dart_noParam _noParam;
+_dart_noParam? _noParam;
 
 int withPrimitiveParam(
   int a,
   int b,
 ) {
-_withPrimitiveParam ??= _dylib.lookupFunction<_c_withPrimitiveParam,_dart_withPrimitiveParam>('withPrimitiveParam');
-  return _withPrimitiveParam(
+return (_withPrimitiveParam ??= _dylib.lookupFunction<_c_withPrimitiveParam,_dart_withPrimitiveParam>('withPrimitiveParam'))(
     a,
     b,
   );
 }
-_dart_withPrimitiveParam _withPrimitiveParam;
+_dart_withPrimitiveParam? _withPrimitiveParam;
 
 ffi.Pointer<ffi.Double> withPointerParam(
   ffi.Pointer<ffi.Int32> a,
   ffi.Pointer<ffi.Pointer<ffi.Uint8>> b,
 ) {
-_withPointerParam ??= _dylib.lookupFunction<_c_withPointerParam,_dart_withPointerParam>('withPointerParam');
-  return _withPointerParam(
+return (_withPointerParam ??= _dylib.lookupFunction<_c_withPointerParam,_dart_withPointerParam>('withPointerParam'))(
     a,
     b,
   );
 }
-_dart_withPointerParam _withPointerParam;
+_dart_withPointerParam? _withPointerParam;
 
 }
 
@@ -158,7 +155,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
@@ -244,23 +241,23 @@
 
 class WithPrimitiveMember extends ffi.Struct{
   @ffi.Int32()
-  int a;
+  external int a;
 
   @ffi.Double()
-  double b;
+  external double b;
 
   @ffi.Uint8()
-  int c;
+  external int c;
 
 }
 
 class WithPointerMember extends ffi.Struct{
-  ffi.Pointer<ffi.Int32> a;
+  external ffi.Pointer<ffi.Int32> a;
 
-  ffi.Pointer<ffi.Pointer<ffi.Double>> b;
+  external ffi.Pointer<ffi.Pointer<ffi.Double>> b;
 
   @ffi.Uint8()
-  int c;
+  external int c;
 
 }
 
@@ -270,7 +267,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
@@ -348,24 +345,23 @@
 ffi.Pointer<SomeStruc> someFunc(
   ffi.Pointer<ffi.Pointer<SomeStruc>> some,
 ) {
-_someFunc ??= _dylib.lookupFunction<_c_someFunc,_dart_someFunc>('someFunc');
-  return _someFunc(
+return (_someFunc ??= _dylib.lookupFunction<_c_someFunc,_dart_someFunc>('someFunc'))(
     some,
   );
 }
-_dart_someFunc _someFunc;
+_dart_someFunc? _someFunc;
 
 }
 
 class SomeStruc extends ffi.Struct{
   @ffi.Int32()
-  int a;
+  external int a;
 
   @ffi.Double()
-  double b;
+  external double b;
 
   @ffi.Uint8()
-  int c;
+  external int c;
 
 }
 
@@ -383,7 +379,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
@@ -460,7 +456,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
@@ -504,7 +500,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
@@ -553,7 +549,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
@@ -622,51 +618,46 @@
 
 void test(
 ) {
-_test_1 ??= _dylib.lookupFunction<_c_test1,_dart_test1>('test');
-  return _test_1(
+return (_test_1 ??= _dylib.lookupFunction<_c_test1,_dart_test1>('test'))(
   );
 }
-_dart_test1 _test_1;
+_dart_test1? _test_1;
 
 void _test(
 ) {
-__test ??= _dylib.lookupFunction<_c__test,_dart__test>('_test');
-  return __test(
+return (__test ??= _dylib.lookupFunction<_c__test,_dart__test>('_test'))(
   );
 }
-_dart__test __test;
+_dart__test? __test;
 
 void _c_test(
 ) {
-__c_test ??= _dylib.lookupFunction<_c__c_test,_dart__c_test>('_c_test');
-  return __c_test(
+return (__c_test ??= _dylib.lookupFunction<_c__c_test,_dart__c_test>('_c_test'))(
   );
 }
-_dart__c_test __c_test;
+_dart__c_test? __c_test;
 
 void _dart_test(
 ) {
-__dart_test ??= _dylib.lookupFunction<_c__dart_test,_dart__dart_test>('_dart_test');
-  return __dart_test(
+return (__dart_test ??= _dylib.lookupFunction<_c__dart_test,_dart__dart_test>('_dart_test'))(
   );
 }
-_dart__dart_test __dart_test;
+_dart__dart_test? __dart_test;
 
 void Test(
 ) {
-_Test ??= _dylib.lookupFunction<_c_Test1,_dart_Test>('Test');
-  return _Test(
+return (_Test ??= _dylib.lookupFunction<_c_Test1,_dart_Test>('Test'))(
   );
 }
-_dart_Test _Test;
+_dart_Test? _Test;
 
 }
 
 class _Test extends ffi.Struct{
   @ffi.Int8()
-  int _unique_array_item_0;
+  external int _unique_array_item_0;
   @ffi.Int8()
-  int _unique_array_item_1;
+  external int _unique_array_item_1;
 /// Helper for array `array`.
 ArrayHelper1__Test_array_level0 get array => ArrayHelper1__Test_array_level0(this, [2], 0, 0);
 }
@@ -753,7 +744,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
@@ -803,19 +794,18 @@
   bool a,
   ffi.Pointer<ffi.Uint8> b,
 ) {
-_test1 ??= _dylib.lookupFunction<_c_test1,_dart_test1>('test1');
-  return _test1(
+return (_test1 ??= _dylib.lookupFunction<_c_test1,_dart_test1>('test1'))(
     a?1:0,
     b,
   )!=0;
 }
-_dart_test1 _test1;
+_dart_test1? _test1;
 
 }
 
 class test2 extends ffi.Struct{
   @ffi.Uint8()
-  int a;
+  external int a;
 
 }
 
@@ -835,7 +825,7 @@
       }
     } catch (e) {
       file.writeAsStringSync(gen);
-      print('Failed test, Debug output: ${file.absolute?.path}');
+      print('Failed test, Debug output: ${file.absolute.path}');
       rethrow;
     }
   });
@@ -884,19 +874,18 @@
   int a,
   ffi.Pointer<ffi.Uint8> b,
 ) {
-_test1 ??= _dylib.lookupFunction<_c_test1,_dart_test1>('test1');
-  return _test1(
+return (_test1 ??= _dylib.lookupFunction<_c_test1,_dart_test1>('test1'))(
     a,
     b,
   );
 }
-_dart_test1 _test1;
+_dart_test1? _test1;
 
 }
 
 class test2 extends ffi.Struct{
   @ffi.Uint8()
-  int a;
+  external int a;
 
 }
 
@@ -916,7 +905,7 @@
       }
     } catch (e) {
       file.writeAsStringSync(gen);
-      print('Failed test, Debug output: ${file.absolute?.path}');
+      print('Failed test, Debug output: ${file.absolute.path}');
       rethrow;
     }
   });
diff --git a/test/header_parser_tests/dart_handle_test.dart b/test/header_parser_tests/dart_handle_test.dart
index 3fdc12c..16387ff 100644
--- a/test/header_parser_tests/dart_handle_test.dart
+++ b/test/header_parser_tests/dart_handle_test.dart
@@ -13,7 +13,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 
 void main() {
   group('dart_handle_test', () {
diff --git a/test/header_parser_tests/function_n_struct_test.dart b/test/header_parser_tests/function_n_struct_test.dart
index 909c13a..9c3107c 100644
--- a/test/header_parser_tests/function_n_struct_test.dart
+++ b/test/header_parser_tests/function_n_struct_test.dart
@@ -12,7 +12,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 
 void main() {
   group('function_n_struct_test', () {
diff --git a/test/header_parser_tests/functions_test.dart b/test/header_parser_tests/functions_test.dart
index 2c898bc..31e0506 100644
--- a/test/header_parser_tests/functions_test.dart
+++ b/test/header_parser_tests/functions_test.dart
@@ -11,7 +11,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 
 void main() {
   group('functions_test', () {
diff --git a/test/header_parser_tests/macros_test.dart b/test/header_parser_tests/macros_test.dart
index 6ad5090..2611940 100644
--- a/test/header_parser_tests/macros_test.dart
+++ b/test/header_parser_tests/macros_test.dart
@@ -12,7 +12,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 
 void main() {
   group('macros_test', () {
diff --git a/test/header_parser_tests/native_func_typedef_test.dart b/test/header_parser_tests/native_func_typedef_test.dart
index c1f2d37..54ef290 100644
--- a/test/header_parser_tests/native_func_typedef_test.dart
+++ b/test/header_parser_tests/native_func_typedef_test.dart
@@ -14,7 +14,7 @@
 
 import '../test_utils.dart';
 
-Library actual;
+late Library actual;
 void main() {
   group('unnamed_enums_test', () {
     setUpAll(() {
@@ -59,27 +59,25 @@
 void func(
   ffi.Pointer<ffi.NativeFunction<_typedefC_4>> unnamed1,
 ) {
-_func ??= _dylib.lookupFunction<_c_func,_dart_func>('func');
-  return _func(
+return (_func ??= _dylib.lookupFunction<_c_func,_dart_func>('func'))(
     unnamed1,
   );
 }
-_dart_func _func;
+_dart_func? _func;
 
 void funcWithNativeFunc(
   ffi.Pointer<ffi.NativeFunction<withTypedefReturnType>> named,
 ) {
-_funcWithNativeFunc ??= _dylib.lookupFunction<_c_funcWithNativeFunc,_dart_funcWithNativeFunc>('funcWithNativeFunc');
-  return _funcWithNativeFunc(
+return (_funcWithNativeFunc ??= _dylib.lookupFunction<_c_funcWithNativeFunc,_dart_funcWithNativeFunc>('funcWithNativeFunc'))(
     named,
   );
 }
-_dart_funcWithNativeFunc _funcWithNativeFunc;
+_dart_funcWithNativeFunc? _funcWithNativeFunc;
 
 }
 
 class struc extends ffi.Struct{
-  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> unnamed1;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> unnamed1;
 
 }
 
@@ -125,7 +123,7 @@
         }
       } catch (e) {
         file.writeAsStringSync(gen);
-        print('Failed test, Debug output: ${file.absolute?.path}');
+        print('Failed test, Debug output: ${file.absolute.path}');
         rethrow;
       }
     });
diff --git a/test/header_parser_tests/nested_parsing_test.dart b/test/header_parser_tests/nested_parsing_test.dart
index c4c01a7..40937c8 100644
--- a/test/header_parser_tests/nested_parsing_test.dart
+++ b/test/header_parser_tests/nested_parsing_test.dart
@@ -11,7 +11,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 
 void main() {
   group('nested_parsing_test', () {
diff --git a/test/header_parser_tests/typedef_test.dart b/test/header_parser_tests/typedef_test.dart
index eeeb37c..182b622 100644
--- a/test/header_parser_tests/typedef_test.dart
+++ b/test/header_parser_tests/typedef_test.dart
@@ -12,7 +12,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 
 void main() {
   group('typedef_test', () {
diff --git a/test/header_parser_tests/unnamed_enums_test.dart b/test/header_parser_tests/unnamed_enums_test.dart
index fa75392..02994af 100644
--- a/test/header_parser_tests/unnamed_enums_test.dart
+++ b/test/header_parser_tests/unnamed_enums_test.dart
@@ -11,7 +11,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 
 void main() {
   group('unnamed_enums_test', () {
diff --git a/test/large_integration_tests/_expected_cjson_bindings.dart b/test/large_integration_tests/_expected_cjson_bindings.dart
index a22dd73..c9820d2 100644
--- a/test/large_integration_tests/_expected_cjson_bindings.dart
+++ b/test/large_integration_tests/_expected_cjson_bindings.dart
@@ -12,93 +12,90 @@
   CJson(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
 
   ffi.Pointer<ffi.Int8> cJSON_Version() {
-    _cJSON_Version ??= _dylib
-        .lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>('cJSON_Version');
-    return _cJSON_Version();
+    return (_cJSON_Version ??=
+        _dylib.lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>(
+            'cJSON_Version'))();
   }
 
-  _dart_cJSON_Version _cJSON_Version;
+  _dart_cJSON_Version? _cJSON_Version;
 
   void cJSON_InitHooks(
     ffi.Pointer<cJSON_Hooks> hooks,
   ) {
-    _cJSON_InitHooks ??=
+    return (_cJSON_InitHooks ??=
         _dylib.lookupFunction<_c_cJSON_InitHooks, _dart_cJSON_InitHooks>(
-            'cJSON_InitHooks');
-    return _cJSON_InitHooks(
+            'cJSON_InitHooks'))(
       hooks,
     );
   }
 
-  _dart_cJSON_InitHooks _cJSON_InitHooks;
+  _dart_cJSON_InitHooks? _cJSON_InitHooks;
 
   ffi.Pointer<cJSON> cJSON_Parse(
     ffi.Pointer<ffi.Int8> value,
   ) {
-    _cJSON_Parse ??=
-        _dylib.lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse');
-    return _cJSON_Parse(
+    return (_cJSON_Parse ??= _dylib
+        .lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse'))(
       value,
     );
   }
 
-  _dart_cJSON_Parse _cJSON_Parse;
+  _dart_cJSON_Parse? _cJSON_Parse;
 
   ffi.Pointer<cJSON> cJSON_ParseWithOpts(
     ffi.Pointer<ffi.Int8> value,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
     int require_null_terminated,
   ) {
-    _cJSON_ParseWithOpts ??= _dylib.lookupFunction<_c_cJSON_ParseWithOpts,
-        _dart_cJSON_ParseWithOpts>('cJSON_ParseWithOpts');
-    return _cJSON_ParseWithOpts(
+    return (_cJSON_ParseWithOpts ??= _dylib.lookupFunction<
+        _c_cJSON_ParseWithOpts,
+        _dart_cJSON_ParseWithOpts>('cJSON_ParseWithOpts'))(
       value,
       return_parse_end,
       require_null_terminated,
     );
   }
 
-  _dart_cJSON_ParseWithOpts _cJSON_ParseWithOpts;
+  _dart_cJSON_ParseWithOpts? _cJSON_ParseWithOpts;
 
   ffi.Pointer<ffi.Int8> cJSON_Print(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_Print ??=
-        _dylib.lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print');
-    return _cJSON_Print(
+    return (_cJSON_Print ??= _dylib
+        .lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print'))(
       item,
     );
   }
 
-  _dart_cJSON_Print _cJSON_Print;
+  _dart_cJSON_Print? _cJSON_Print;
 
   ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_PrintUnformatted ??= _dylib.lookupFunction<_c_cJSON_PrintUnformatted,
-        _dart_cJSON_PrintUnformatted>('cJSON_PrintUnformatted');
-    return _cJSON_PrintUnformatted(
+    return (_cJSON_PrintUnformatted ??= _dylib.lookupFunction<
+        _c_cJSON_PrintUnformatted,
+        _dart_cJSON_PrintUnformatted>('cJSON_PrintUnformatted'))(
       item,
     );
   }
 
-  _dart_cJSON_PrintUnformatted _cJSON_PrintUnformatted;
+  _dart_cJSON_PrintUnformatted? _cJSON_PrintUnformatted;
 
   ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
     ffi.Pointer<cJSON> item,
     int prebuffer,
     int fmt,
   ) {
-    _cJSON_PrintBuffered ??= _dylib.lookupFunction<_c_cJSON_PrintBuffered,
-        _dart_cJSON_PrintBuffered>('cJSON_PrintBuffered');
-    return _cJSON_PrintBuffered(
+    return (_cJSON_PrintBuffered ??= _dylib.lookupFunction<
+        _c_cJSON_PrintBuffered,
+        _dart_cJSON_PrintBuffered>('cJSON_PrintBuffered'))(
       item,
       prebuffer,
       fmt,
     );
   }
 
-  _dart_cJSON_PrintBuffered _cJSON_PrintBuffered;
+  _dart_cJSON_PrintBuffered? _cJSON_PrintBuffered;
 
   int cJSON_PrintPreallocated(
     ffi.Pointer<cJSON> item,
@@ -106,10 +103,9 @@
     int length,
     int format,
   ) {
-    _cJSON_PrintPreallocated ??= _dylib.lookupFunction<
+    return (_cJSON_PrintPreallocated ??= _dylib.lookupFunction<
         _c_cJSON_PrintPreallocated,
-        _dart_cJSON_PrintPreallocated>('cJSON_PrintPreallocated');
-    return _cJSON_PrintPreallocated(
+        _dart_cJSON_PrintPreallocated>('cJSON_PrintPreallocated'))(
       item,
       buffer,
       length,
@@ -117,617 +113,581 @@
     );
   }
 
-  _dart_cJSON_PrintPreallocated _cJSON_PrintPreallocated;
+  _dart_cJSON_PrintPreallocated? _cJSON_PrintPreallocated;
 
   void cJSON_Delete(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_Delete ??= _dylib
-        .lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete');
-    return _cJSON_Delete(
+    return (_cJSON_Delete ??= _dylib
+        .lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete'))(
       item,
     );
   }
 
-  _dart_cJSON_Delete _cJSON_Delete;
+  _dart_cJSON_Delete? _cJSON_Delete;
 
   int cJSON_GetArraySize(
     ffi.Pointer<cJSON> array,
   ) {
-    _cJSON_GetArraySize ??=
+    return (_cJSON_GetArraySize ??=
         _dylib.lookupFunction<_c_cJSON_GetArraySize, _dart_cJSON_GetArraySize>(
-            'cJSON_GetArraySize');
-    return _cJSON_GetArraySize(
+            'cJSON_GetArraySize'))(
       array,
     );
   }
 
-  _dart_cJSON_GetArraySize _cJSON_GetArraySize;
+  _dart_cJSON_GetArraySize? _cJSON_GetArraySize;
 
   ffi.Pointer<cJSON> cJSON_GetArrayItem(
     ffi.Pointer<cJSON> array,
     int index,
   ) {
-    _cJSON_GetArrayItem ??=
+    return (_cJSON_GetArrayItem ??=
         _dylib.lookupFunction<_c_cJSON_GetArrayItem, _dart_cJSON_GetArrayItem>(
-            'cJSON_GetArrayItem');
-    return _cJSON_GetArrayItem(
+            'cJSON_GetArrayItem'))(
       array,
       index,
     );
   }
 
-  _dart_cJSON_GetArrayItem _cJSON_GetArrayItem;
+  _dart_cJSON_GetArrayItem? _cJSON_GetArrayItem;
 
   ffi.Pointer<cJSON> cJSON_GetObjectItem(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_GetObjectItem ??= _dylib.lookupFunction<_c_cJSON_GetObjectItem,
-        _dart_cJSON_GetObjectItem>('cJSON_GetObjectItem');
-    return _cJSON_GetObjectItem(
+    return (_cJSON_GetObjectItem ??= _dylib.lookupFunction<
+        _c_cJSON_GetObjectItem,
+        _dart_cJSON_GetObjectItem>('cJSON_GetObjectItem'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_GetObjectItem _cJSON_GetObjectItem;
+  _dart_cJSON_GetObjectItem? _cJSON_GetObjectItem;
 
   ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_GetObjectItemCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_GetObjectItemCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_GetObjectItemCaseSensitive,
             _dart_cJSON_GetObjectItemCaseSensitive>(
-        'cJSON_GetObjectItemCaseSensitive');
-    return _cJSON_GetObjectItemCaseSensitive(
+        'cJSON_GetObjectItemCaseSensitive'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_GetObjectItemCaseSensitive _cJSON_GetObjectItemCaseSensitive;
+  _dart_cJSON_GetObjectItemCaseSensitive? _cJSON_GetObjectItemCaseSensitive;
 
   int cJSON_HasObjectItem(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_HasObjectItem ??= _dylib.lookupFunction<_c_cJSON_HasObjectItem,
-        _dart_cJSON_HasObjectItem>('cJSON_HasObjectItem');
-    return _cJSON_HasObjectItem(
+    return (_cJSON_HasObjectItem ??= _dylib.lookupFunction<
+        _c_cJSON_HasObjectItem,
+        _dart_cJSON_HasObjectItem>('cJSON_HasObjectItem'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_HasObjectItem _cJSON_HasObjectItem;
+  _dart_cJSON_HasObjectItem? _cJSON_HasObjectItem;
 
   ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
-    _cJSON_GetErrorPtr ??=
+    return (_cJSON_GetErrorPtr ??=
         _dylib.lookupFunction<_c_cJSON_GetErrorPtr, _dart_cJSON_GetErrorPtr>(
-            'cJSON_GetErrorPtr');
-    return _cJSON_GetErrorPtr();
+            'cJSON_GetErrorPtr'))();
   }
 
-  _dart_cJSON_GetErrorPtr _cJSON_GetErrorPtr;
+  _dart_cJSON_GetErrorPtr? _cJSON_GetErrorPtr;
 
   ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_GetStringValue ??= _dylib.lookupFunction<_c_cJSON_GetStringValue,
-        _dart_cJSON_GetStringValue>('cJSON_GetStringValue');
-    return _cJSON_GetStringValue(
+    return (_cJSON_GetStringValue ??= _dylib.lookupFunction<
+        _c_cJSON_GetStringValue,
+        _dart_cJSON_GetStringValue>('cJSON_GetStringValue'))(
       item,
     );
   }
 
-  _dart_cJSON_GetStringValue _cJSON_GetStringValue;
+  _dart_cJSON_GetStringValue? _cJSON_GetStringValue;
 
   int cJSON_IsInvalid(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsInvalid ??=
+    return (_cJSON_IsInvalid ??=
         _dylib.lookupFunction<_c_cJSON_IsInvalid, _dart_cJSON_IsInvalid>(
-            'cJSON_IsInvalid');
-    return _cJSON_IsInvalid(
+            'cJSON_IsInvalid'))(
       item,
     );
   }
 
-  _dart_cJSON_IsInvalid _cJSON_IsInvalid;
+  _dart_cJSON_IsInvalid? _cJSON_IsInvalid;
 
   int cJSON_IsFalse(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsFalse ??= _dylib
-        .lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>('cJSON_IsFalse');
-    return _cJSON_IsFalse(
+    return (_cJSON_IsFalse ??=
+        _dylib.lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>(
+            'cJSON_IsFalse'))(
       item,
     );
   }
 
-  _dart_cJSON_IsFalse _cJSON_IsFalse;
+  _dart_cJSON_IsFalse? _cJSON_IsFalse;
 
   int cJSON_IsTrue(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsTrue ??= _dylib
-        .lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue');
-    return _cJSON_IsTrue(
+    return (_cJSON_IsTrue ??= _dylib
+        .lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue'))(
       item,
     );
   }
 
-  _dart_cJSON_IsTrue _cJSON_IsTrue;
+  _dart_cJSON_IsTrue? _cJSON_IsTrue;
 
   int cJSON_IsBool(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsBool ??= _dylib
-        .lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool');
-    return _cJSON_IsBool(
+    return (_cJSON_IsBool ??= _dylib
+        .lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool'))(
       item,
     );
   }
 
-  _dart_cJSON_IsBool _cJSON_IsBool;
+  _dart_cJSON_IsBool? _cJSON_IsBool;
 
   int cJSON_IsNull(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsNull ??= _dylib
-        .lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull');
-    return _cJSON_IsNull(
+    return (_cJSON_IsNull ??= _dylib
+        .lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull'))(
       item,
     );
   }
 
-  _dart_cJSON_IsNull _cJSON_IsNull;
+  _dart_cJSON_IsNull? _cJSON_IsNull;
 
   int cJSON_IsNumber(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsNumber ??=
+    return (_cJSON_IsNumber ??=
         _dylib.lookupFunction<_c_cJSON_IsNumber, _dart_cJSON_IsNumber>(
-            'cJSON_IsNumber');
-    return _cJSON_IsNumber(
+            'cJSON_IsNumber'))(
       item,
     );
   }
 
-  _dart_cJSON_IsNumber _cJSON_IsNumber;
+  _dart_cJSON_IsNumber? _cJSON_IsNumber;
 
   int cJSON_IsString(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsString ??=
+    return (_cJSON_IsString ??=
         _dylib.lookupFunction<_c_cJSON_IsString, _dart_cJSON_IsString>(
-            'cJSON_IsString');
-    return _cJSON_IsString(
+            'cJSON_IsString'))(
       item,
     );
   }
 
-  _dart_cJSON_IsString _cJSON_IsString;
+  _dart_cJSON_IsString? _cJSON_IsString;
 
   int cJSON_IsArray(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsArray ??= _dylib
-        .lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>('cJSON_IsArray');
-    return _cJSON_IsArray(
+    return (_cJSON_IsArray ??=
+        _dylib.lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>(
+            'cJSON_IsArray'))(
       item,
     );
   }
 
-  _dart_cJSON_IsArray _cJSON_IsArray;
+  _dart_cJSON_IsArray? _cJSON_IsArray;
 
   int cJSON_IsObject(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsObject ??=
+    return (_cJSON_IsObject ??=
         _dylib.lookupFunction<_c_cJSON_IsObject, _dart_cJSON_IsObject>(
-            'cJSON_IsObject');
-    return _cJSON_IsObject(
+            'cJSON_IsObject'))(
       item,
     );
   }
 
-  _dart_cJSON_IsObject _cJSON_IsObject;
+  _dart_cJSON_IsObject? _cJSON_IsObject;
 
   int cJSON_IsRaw(
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_IsRaw ??=
-        _dylib.lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw');
-    return _cJSON_IsRaw(
+    return (_cJSON_IsRaw ??= _dylib
+        .lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw'))(
       item,
     );
   }
 
-  _dart_cJSON_IsRaw _cJSON_IsRaw;
+  _dart_cJSON_IsRaw? _cJSON_IsRaw;
 
   ffi.Pointer<cJSON> cJSON_CreateNull() {
-    _cJSON_CreateNull ??=
+    return (_cJSON_CreateNull ??=
         _dylib.lookupFunction<_c_cJSON_CreateNull, _dart_cJSON_CreateNull>(
-            'cJSON_CreateNull');
-    return _cJSON_CreateNull();
+            'cJSON_CreateNull'))();
   }
 
-  _dart_cJSON_CreateNull _cJSON_CreateNull;
+  _dart_cJSON_CreateNull? _cJSON_CreateNull;
 
   ffi.Pointer<cJSON> cJSON_CreateTrue() {
-    _cJSON_CreateTrue ??=
+    return (_cJSON_CreateTrue ??=
         _dylib.lookupFunction<_c_cJSON_CreateTrue, _dart_cJSON_CreateTrue>(
-            'cJSON_CreateTrue');
-    return _cJSON_CreateTrue();
+            'cJSON_CreateTrue'))();
   }
 
-  _dart_cJSON_CreateTrue _cJSON_CreateTrue;
+  _dart_cJSON_CreateTrue? _cJSON_CreateTrue;
 
   ffi.Pointer<cJSON> cJSON_CreateFalse() {
-    _cJSON_CreateFalse ??=
+    return (_cJSON_CreateFalse ??=
         _dylib.lookupFunction<_c_cJSON_CreateFalse, _dart_cJSON_CreateFalse>(
-            'cJSON_CreateFalse');
-    return _cJSON_CreateFalse();
+            'cJSON_CreateFalse'))();
   }
 
-  _dart_cJSON_CreateFalse _cJSON_CreateFalse;
+  _dart_cJSON_CreateFalse? _cJSON_CreateFalse;
 
   ffi.Pointer<cJSON> cJSON_CreateBool(
     int boolean,
   ) {
-    _cJSON_CreateBool ??=
+    return (_cJSON_CreateBool ??=
         _dylib.lookupFunction<_c_cJSON_CreateBool, _dart_cJSON_CreateBool>(
-            'cJSON_CreateBool');
-    return _cJSON_CreateBool(
+            'cJSON_CreateBool'))(
       boolean,
     );
   }
 
-  _dart_cJSON_CreateBool _cJSON_CreateBool;
+  _dart_cJSON_CreateBool? _cJSON_CreateBool;
 
   ffi.Pointer<cJSON> cJSON_CreateNumber(
     double num,
   ) {
-    _cJSON_CreateNumber ??=
+    return (_cJSON_CreateNumber ??=
         _dylib.lookupFunction<_c_cJSON_CreateNumber, _dart_cJSON_CreateNumber>(
-            'cJSON_CreateNumber');
-    return _cJSON_CreateNumber(
+            'cJSON_CreateNumber'))(
       num,
     );
   }
 
-  _dart_cJSON_CreateNumber _cJSON_CreateNumber;
+  _dart_cJSON_CreateNumber? _cJSON_CreateNumber;
 
   ffi.Pointer<cJSON> cJSON_CreateString(
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_CreateString ??=
+    return (_cJSON_CreateString ??=
         _dylib.lookupFunction<_c_cJSON_CreateString, _dart_cJSON_CreateString>(
-            'cJSON_CreateString');
-    return _cJSON_CreateString(
+            'cJSON_CreateString'))(
       string,
     );
   }
 
-  _dart_cJSON_CreateString _cJSON_CreateString;
+  _dart_cJSON_CreateString? _cJSON_CreateString;
 
   ffi.Pointer<cJSON> cJSON_CreateRaw(
     ffi.Pointer<ffi.Int8> raw,
   ) {
-    _cJSON_CreateRaw ??=
+    return (_cJSON_CreateRaw ??=
         _dylib.lookupFunction<_c_cJSON_CreateRaw, _dart_cJSON_CreateRaw>(
-            'cJSON_CreateRaw');
-    return _cJSON_CreateRaw(
+            'cJSON_CreateRaw'))(
       raw,
     );
   }
 
-  _dart_cJSON_CreateRaw _cJSON_CreateRaw;
+  _dart_cJSON_CreateRaw? _cJSON_CreateRaw;
 
   ffi.Pointer<cJSON> cJSON_CreateArray() {
-    _cJSON_CreateArray ??=
+    return (_cJSON_CreateArray ??=
         _dylib.lookupFunction<_c_cJSON_CreateArray, _dart_cJSON_CreateArray>(
-            'cJSON_CreateArray');
-    return _cJSON_CreateArray();
+            'cJSON_CreateArray'))();
   }
 
-  _dart_cJSON_CreateArray _cJSON_CreateArray;
+  _dart_cJSON_CreateArray? _cJSON_CreateArray;
 
   ffi.Pointer<cJSON> cJSON_CreateObject() {
-    _cJSON_CreateObject ??=
+    return (_cJSON_CreateObject ??=
         _dylib.lookupFunction<_c_cJSON_CreateObject, _dart_cJSON_CreateObject>(
-            'cJSON_CreateObject');
-    return _cJSON_CreateObject();
+            'cJSON_CreateObject'))();
   }
 
-  _dart_cJSON_CreateObject _cJSON_CreateObject;
+  _dart_cJSON_CreateObject? _cJSON_CreateObject;
 
   ffi.Pointer<cJSON> cJSON_CreateStringReference(
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_CreateStringReference ??= _dylib.lookupFunction<
+    return (_cJSON_CreateStringReference ??= _dylib.lookupFunction<
         _c_cJSON_CreateStringReference,
-        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference');
-    return _cJSON_CreateStringReference(
+        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference'))(
       string,
     );
   }
 
-  _dart_cJSON_CreateStringReference _cJSON_CreateStringReference;
+  _dart_cJSON_CreateStringReference? _cJSON_CreateStringReference;
 
   ffi.Pointer<cJSON> cJSON_CreateObjectReference(
     ffi.Pointer<cJSON> child,
   ) {
-    _cJSON_CreateObjectReference ??= _dylib.lookupFunction<
+    return (_cJSON_CreateObjectReference ??= _dylib.lookupFunction<
         _c_cJSON_CreateObjectReference,
-        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference');
-    return _cJSON_CreateObjectReference(
+        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference'))(
       child,
     );
   }
 
-  _dart_cJSON_CreateObjectReference _cJSON_CreateObjectReference;
+  _dart_cJSON_CreateObjectReference? _cJSON_CreateObjectReference;
 
   ffi.Pointer<cJSON> cJSON_CreateArrayReference(
     ffi.Pointer<cJSON> child,
   ) {
-    _cJSON_CreateArrayReference ??= _dylib.lookupFunction<
+    return (_cJSON_CreateArrayReference ??= _dylib.lookupFunction<
         _c_cJSON_CreateArrayReference,
-        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference');
-    return _cJSON_CreateArrayReference(
+        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference'))(
       child,
     );
   }
 
-  _dart_cJSON_CreateArrayReference _cJSON_CreateArrayReference;
+  _dart_cJSON_CreateArrayReference? _cJSON_CreateArrayReference;
 
   ffi.Pointer<cJSON> cJSON_CreateIntArray(
     ffi.Pointer<ffi.Int32> numbers,
     int count,
   ) {
-    _cJSON_CreateIntArray ??= _dylib.lookupFunction<_c_cJSON_CreateIntArray,
-        _dart_cJSON_CreateIntArray>('cJSON_CreateIntArray');
-    return _cJSON_CreateIntArray(
+    return (_cJSON_CreateIntArray ??= _dylib.lookupFunction<
+        _c_cJSON_CreateIntArray,
+        _dart_cJSON_CreateIntArray>('cJSON_CreateIntArray'))(
       numbers,
       count,
     );
   }
 
-  _dart_cJSON_CreateIntArray _cJSON_CreateIntArray;
+  _dart_cJSON_CreateIntArray? _cJSON_CreateIntArray;
 
   ffi.Pointer<cJSON> cJSON_CreateFloatArray(
     ffi.Pointer<ffi.Float> numbers,
     int count,
   ) {
-    _cJSON_CreateFloatArray ??= _dylib.lookupFunction<_c_cJSON_CreateFloatArray,
-        _dart_cJSON_CreateFloatArray>('cJSON_CreateFloatArray');
-    return _cJSON_CreateFloatArray(
+    return (_cJSON_CreateFloatArray ??= _dylib.lookupFunction<
+        _c_cJSON_CreateFloatArray,
+        _dart_cJSON_CreateFloatArray>('cJSON_CreateFloatArray'))(
       numbers,
       count,
     );
   }
 
-  _dart_cJSON_CreateFloatArray _cJSON_CreateFloatArray;
+  _dart_cJSON_CreateFloatArray? _cJSON_CreateFloatArray;
 
   ffi.Pointer<cJSON> cJSON_CreateDoubleArray(
     ffi.Pointer<ffi.Double> numbers,
     int count,
   ) {
-    _cJSON_CreateDoubleArray ??= _dylib.lookupFunction<
+    return (_cJSON_CreateDoubleArray ??= _dylib.lookupFunction<
         _c_cJSON_CreateDoubleArray,
-        _dart_cJSON_CreateDoubleArray>('cJSON_CreateDoubleArray');
-    return _cJSON_CreateDoubleArray(
+        _dart_cJSON_CreateDoubleArray>('cJSON_CreateDoubleArray'))(
       numbers,
       count,
     );
   }
 
-  _dart_cJSON_CreateDoubleArray _cJSON_CreateDoubleArray;
+  _dart_cJSON_CreateDoubleArray? _cJSON_CreateDoubleArray;
 
   ffi.Pointer<cJSON> cJSON_CreateStringArray(
     ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
     int count,
   ) {
-    _cJSON_CreateStringArray ??= _dylib.lookupFunction<
+    return (_cJSON_CreateStringArray ??= _dylib.lookupFunction<
         _c_cJSON_CreateStringArray,
-        _dart_cJSON_CreateStringArray>('cJSON_CreateStringArray');
-    return _cJSON_CreateStringArray(
+        _dart_cJSON_CreateStringArray>('cJSON_CreateStringArray'))(
       strings,
       count,
     );
   }
 
-  _dart_cJSON_CreateStringArray _cJSON_CreateStringArray;
+  _dart_cJSON_CreateStringArray? _cJSON_CreateStringArray;
 
   void cJSON_AddItemToArray(
     ffi.Pointer<cJSON> array,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemToArray ??= _dylib.lookupFunction<_c_cJSON_AddItemToArray,
-        _dart_cJSON_AddItemToArray>('cJSON_AddItemToArray');
-    return _cJSON_AddItemToArray(
+    return (_cJSON_AddItemToArray ??= _dylib.lookupFunction<
+        _c_cJSON_AddItemToArray,
+        _dart_cJSON_AddItemToArray>('cJSON_AddItemToArray'))(
       array,
       item,
     );
   }
 
-  _dart_cJSON_AddItemToArray _cJSON_AddItemToArray;
+  _dart_cJSON_AddItemToArray? _cJSON_AddItemToArray;
 
   void cJSON_AddItemToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemToObject ??= _dylib.lookupFunction<_c_cJSON_AddItemToObject,
-        _dart_cJSON_AddItemToObject>('cJSON_AddItemToObject');
-    return _cJSON_AddItemToObject(
+    return (_cJSON_AddItemToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddItemToObject,
+        _dart_cJSON_AddItemToObject>('cJSON_AddItemToObject'))(
       object,
       string,
       item,
     );
   }
 
-  _dart_cJSON_AddItemToObject _cJSON_AddItemToObject;
+  _dart_cJSON_AddItemToObject? _cJSON_AddItemToObject;
 
   void cJSON_AddItemToObjectCS(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemToObjectCS ??= _dylib.lookupFunction<
+    return (_cJSON_AddItemToObjectCS ??= _dylib.lookupFunction<
         _c_cJSON_AddItemToObjectCS,
-        _dart_cJSON_AddItemToObjectCS>('cJSON_AddItemToObjectCS');
-    return _cJSON_AddItemToObjectCS(
+        _dart_cJSON_AddItemToObjectCS>('cJSON_AddItemToObjectCS'))(
       object,
       string,
       item,
     );
   }
 
-  _dart_cJSON_AddItemToObjectCS _cJSON_AddItemToObjectCS;
+  _dart_cJSON_AddItemToObjectCS? _cJSON_AddItemToObjectCS;
 
   void cJSON_AddItemReferenceToArray(
     ffi.Pointer<cJSON> array,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemReferenceToArray ??= _dylib.lookupFunction<
+    return (_cJSON_AddItemReferenceToArray ??= _dylib.lookupFunction<
         _c_cJSON_AddItemReferenceToArray,
-        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray');
-    return _cJSON_AddItemReferenceToArray(
+        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray'))(
       array,
       item,
     );
   }
 
-  _dart_cJSON_AddItemReferenceToArray _cJSON_AddItemReferenceToArray;
+  _dart_cJSON_AddItemReferenceToArray? _cJSON_AddItemReferenceToArray;
 
   void cJSON_AddItemReferenceToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_AddItemReferenceToObject ??= _dylib.lookupFunction<
-        _c_cJSON_AddItemReferenceToObject,
-        _dart_cJSON_AddItemReferenceToObject>('cJSON_AddItemReferenceToObject');
-    return _cJSON_AddItemReferenceToObject(
+    return (_cJSON_AddItemReferenceToObject ??= _dylib.lookupFunction<
+            _c_cJSON_AddItemReferenceToObject,
+            _dart_cJSON_AddItemReferenceToObject>(
+        'cJSON_AddItemReferenceToObject'))(
       object,
       string,
       item,
     );
   }
 
-  _dart_cJSON_AddItemReferenceToObject _cJSON_AddItemReferenceToObject;
+  _dart_cJSON_AddItemReferenceToObject? _cJSON_AddItemReferenceToObject;
 
   ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
     ffi.Pointer<cJSON> parent,
     ffi.Pointer<cJSON> item,
   ) {
-    _cJSON_DetachItemViaPointer ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemViaPointer ??= _dylib.lookupFunction<
         _c_cJSON_DetachItemViaPointer,
-        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer');
-    return _cJSON_DetachItemViaPointer(
+        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer'))(
       parent,
       item,
     );
   }
 
-  _dart_cJSON_DetachItemViaPointer _cJSON_DetachItemViaPointer;
+  _dart_cJSON_DetachItemViaPointer? _cJSON_DetachItemViaPointer;
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromArray(
     ffi.Pointer<cJSON> array,
     int which,
   ) {
-    _cJSON_DetachItemFromArray ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemFromArray ??= _dylib.lookupFunction<
         _c_cJSON_DetachItemFromArray,
-        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray');
-    return _cJSON_DetachItemFromArray(
+        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray'))(
       array,
       which,
     );
   }
 
-  _dart_cJSON_DetachItemFromArray _cJSON_DetachItemFromArray;
+  _dart_cJSON_DetachItemFromArray? _cJSON_DetachItemFromArray;
 
   void cJSON_DeleteItemFromArray(
     ffi.Pointer<cJSON> array,
     int which,
   ) {
-    _cJSON_DeleteItemFromArray ??= _dylib.lookupFunction<
+    return (_cJSON_DeleteItemFromArray ??= _dylib.lookupFunction<
         _c_cJSON_DeleteItemFromArray,
-        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray');
-    return _cJSON_DeleteItemFromArray(
+        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray'))(
       array,
       which,
     );
   }
 
-  _dart_cJSON_DeleteItemFromArray _cJSON_DeleteItemFromArray;
+  _dart_cJSON_DeleteItemFromArray? _cJSON_DeleteItemFromArray;
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DetachItemFromObject ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemFromObject ??= _dylib.lookupFunction<
         _c_cJSON_DetachItemFromObject,
-        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject');
-    return _cJSON_DetachItemFromObject(
+        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DetachItemFromObject _cJSON_DetachItemFromObject;
+  _dart_cJSON_DetachItemFromObject? _cJSON_DetachItemFromObject;
 
   ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DetachItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_DetachItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_DetachItemFromObjectCaseSensitive,
             _dart_cJSON_DetachItemFromObjectCaseSensitive>(
-        'cJSON_DetachItemFromObjectCaseSensitive');
-    return _cJSON_DetachItemFromObjectCaseSensitive(
+        'cJSON_DetachItemFromObjectCaseSensitive'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DetachItemFromObjectCaseSensitive
+  _dart_cJSON_DetachItemFromObjectCaseSensitive?
       _cJSON_DetachItemFromObjectCaseSensitive;
 
   void cJSON_DeleteItemFromObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DeleteItemFromObject ??= _dylib.lookupFunction<
+    return (_cJSON_DeleteItemFromObject ??= _dylib.lookupFunction<
         _c_cJSON_DeleteItemFromObject,
-        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject');
-    return _cJSON_DeleteItemFromObject(
+        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DeleteItemFromObject _cJSON_DeleteItemFromObject;
+  _dart_cJSON_DeleteItemFromObject? _cJSON_DeleteItemFromObject;
 
   void cJSON_DeleteItemFromObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_DeleteItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_DeleteItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_DeleteItemFromObjectCaseSensitive,
             _dart_cJSON_DeleteItemFromObjectCaseSensitive>(
-        'cJSON_DeleteItemFromObjectCaseSensitive');
-    return _cJSON_DeleteItemFromObjectCaseSensitive(
+        'cJSON_DeleteItemFromObjectCaseSensitive'))(
       object,
       string,
     );
   }
 
-  _dart_cJSON_DeleteItemFromObjectCaseSensitive
+  _dart_cJSON_DeleteItemFromObjectCaseSensitive?
       _cJSON_DeleteItemFromObjectCaseSensitive;
 
   void cJSON_InsertItemInArray(
@@ -735,332 +695,320 @@
     int which,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_InsertItemInArray ??= _dylib.lookupFunction<
+    return (_cJSON_InsertItemInArray ??= _dylib.lookupFunction<
         _c_cJSON_InsertItemInArray,
-        _dart_cJSON_InsertItemInArray>('cJSON_InsertItemInArray');
-    return _cJSON_InsertItemInArray(
+        _dart_cJSON_InsertItemInArray>('cJSON_InsertItemInArray'))(
       array,
       which,
       newitem,
     );
   }
 
-  _dart_cJSON_InsertItemInArray _cJSON_InsertItemInArray;
+  _dart_cJSON_InsertItemInArray? _cJSON_InsertItemInArray;
 
   int cJSON_ReplaceItemViaPointer(
     ffi.Pointer<cJSON> parent,
     ffi.Pointer<cJSON> item,
     ffi.Pointer<cJSON> replacement,
   ) {
-    _cJSON_ReplaceItemViaPointer ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemViaPointer ??= _dylib.lookupFunction<
         _c_cJSON_ReplaceItemViaPointer,
-        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer');
-    return _cJSON_ReplaceItemViaPointer(
+        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer'))(
       parent,
       item,
       replacement,
     );
   }
 
-  _dart_cJSON_ReplaceItemViaPointer _cJSON_ReplaceItemViaPointer;
+  _dart_cJSON_ReplaceItemViaPointer? _cJSON_ReplaceItemViaPointer;
 
   void cJSON_ReplaceItemInArray(
     ffi.Pointer<cJSON> array,
     int which,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_ReplaceItemInArray ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemInArray ??= _dylib.lookupFunction<
         _c_cJSON_ReplaceItemInArray,
-        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray');
-    return _cJSON_ReplaceItemInArray(
+        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray'))(
       array,
       which,
       newitem,
     );
   }
 
-  _dart_cJSON_ReplaceItemInArray _cJSON_ReplaceItemInArray;
+  _dart_cJSON_ReplaceItemInArray? _cJSON_ReplaceItemInArray;
 
   void cJSON_ReplaceItemInObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_ReplaceItemInObject ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemInObject ??= _dylib.lookupFunction<
         _c_cJSON_ReplaceItemInObject,
-        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject');
-    return _cJSON_ReplaceItemInObject(
+        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject'))(
       object,
       string,
       newitem,
     );
   }
 
-  _dart_cJSON_ReplaceItemInObject _cJSON_ReplaceItemInObject;
+  _dart_cJSON_ReplaceItemInObject? _cJSON_ReplaceItemInObject;
 
   void cJSON_ReplaceItemInObjectCaseSensitive(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> string,
     ffi.Pointer<cJSON> newitem,
   ) {
-    _cJSON_ReplaceItemInObjectCaseSensitive ??= _dylib.lookupFunction<
+    return (_cJSON_ReplaceItemInObjectCaseSensitive ??= _dylib.lookupFunction<
             _c_cJSON_ReplaceItemInObjectCaseSensitive,
             _dart_cJSON_ReplaceItemInObjectCaseSensitive>(
-        'cJSON_ReplaceItemInObjectCaseSensitive');
-    return _cJSON_ReplaceItemInObjectCaseSensitive(
+        'cJSON_ReplaceItemInObjectCaseSensitive'))(
       object,
       string,
       newitem,
     );
   }
 
-  _dart_cJSON_ReplaceItemInObjectCaseSensitive
+  _dart_cJSON_ReplaceItemInObjectCaseSensitive?
       _cJSON_ReplaceItemInObjectCaseSensitive;
 
   ffi.Pointer<cJSON> cJSON_Duplicate(
     ffi.Pointer<cJSON> item,
     int recurse,
   ) {
-    _cJSON_Duplicate ??=
+    return (_cJSON_Duplicate ??=
         _dylib.lookupFunction<_c_cJSON_Duplicate, _dart_cJSON_Duplicate>(
-            'cJSON_Duplicate');
-    return _cJSON_Duplicate(
+            'cJSON_Duplicate'))(
       item,
       recurse,
     );
   }
 
-  _dart_cJSON_Duplicate _cJSON_Duplicate;
+  _dart_cJSON_Duplicate? _cJSON_Duplicate;
 
   int cJSON_Compare(
     ffi.Pointer<cJSON> a,
     ffi.Pointer<cJSON> b,
     int case_sensitive,
   ) {
-    _cJSON_Compare ??= _dylib
-        .lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>('cJSON_Compare');
-    return _cJSON_Compare(
+    return (_cJSON_Compare ??=
+        _dylib.lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>(
+            'cJSON_Compare'))(
       a,
       b,
       case_sensitive,
     );
   }
 
-  _dart_cJSON_Compare _cJSON_Compare;
+  _dart_cJSON_Compare? _cJSON_Compare;
 
   void cJSON_Minify(
     ffi.Pointer<ffi.Int8> json,
   ) {
-    _cJSON_Minify ??= _dylib
-        .lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify');
-    return _cJSON_Minify(
+    return (_cJSON_Minify ??= _dylib
+        .lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify'))(
       json,
     );
   }
 
-  _dart_cJSON_Minify _cJSON_Minify;
+  _dart_cJSON_Minify? _cJSON_Minify;
 
   ffi.Pointer<cJSON> cJSON_AddNullToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddNullToObject ??= _dylib.lookupFunction<_c_cJSON_AddNullToObject,
-        _dart_cJSON_AddNullToObject>('cJSON_AddNullToObject');
-    return _cJSON_AddNullToObject(
+    return (_cJSON_AddNullToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddNullToObject,
+        _dart_cJSON_AddNullToObject>('cJSON_AddNullToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddNullToObject _cJSON_AddNullToObject;
+  _dart_cJSON_AddNullToObject? _cJSON_AddNullToObject;
 
   ffi.Pointer<cJSON> cJSON_AddTrueToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddTrueToObject ??= _dylib.lookupFunction<_c_cJSON_AddTrueToObject,
-        _dart_cJSON_AddTrueToObject>('cJSON_AddTrueToObject');
-    return _cJSON_AddTrueToObject(
+    return (_cJSON_AddTrueToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddTrueToObject,
+        _dart_cJSON_AddTrueToObject>('cJSON_AddTrueToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddTrueToObject _cJSON_AddTrueToObject;
+  _dart_cJSON_AddTrueToObject? _cJSON_AddTrueToObject;
 
   ffi.Pointer<cJSON> cJSON_AddFalseToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddFalseToObject ??= _dylib.lookupFunction<_c_cJSON_AddFalseToObject,
-        _dart_cJSON_AddFalseToObject>('cJSON_AddFalseToObject');
-    return _cJSON_AddFalseToObject(
+    return (_cJSON_AddFalseToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddFalseToObject,
+        _dart_cJSON_AddFalseToObject>('cJSON_AddFalseToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddFalseToObject _cJSON_AddFalseToObject;
+  _dart_cJSON_AddFalseToObject? _cJSON_AddFalseToObject;
 
   ffi.Pointer<cJSON> cJSON_AddBoolToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     int boolean,
   ) {
-    _cJSON_AddBoolToObject ??= _dylib.lookupFunction<_c_cJSON_AddBoolToObject,
-        _dart_cJSON_AddBoolToObject>('cJSON_AddBoolToObject');
-    return _cJSON_AddBoolToObject(
+    return (_cJSON_AddBoolToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddBoolToObject,
+        _dart_cJSON_AddBoolToObject>('cJSON_AddBoolToObject'))(
       object,
       name,
       boolean,
     );
   }
 
-  _dart_cJSON_AddBoolToObject _cJSON_AddBoolToObject;
+  _dart_cJSON_AddBoolToObject? _cJSON_AddBoolToObject;
 
   ffi.Pointer<cJSON> cJSON_AddNumberToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     double number,
   ) {
-    _cJSON_AddNumberToObject ??= _dylib.lookupFunction<
+    return (_cJSON_AddNumberToObject ??= _dylib.lookupFunction<
         _c_cJSON_AddNumberToObject,
-        _dart_cJSON_AddNumberToObject>('cJSON_AddNumberToObject');
-    return _cJSON_AddNumberToObject(
+        _dart_cJSON_AddNumberToObject>('cJSON_AddNumberToObject'))(
       object,
       name,
       number,
     );
   }
 
-  _dart_cJSON_AddNumberToObject _cJSON_AddNumberToObject;
+  _dart_cJSON_AddNumberToObject? _cJSON_AddNumberToObject;
 
   ffi.Pointer<cJSON> cJSON_AddStringToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     ffi.Pointer<ffi.Int8> string,
   ) {
-    _cJSON_AddStringToObject ??= _dylib.lookupFunction<
+    return (_cJSON_AddStringToObject ??= _dylib.lookupFunction<
         _c_cJSON_AddStringToObject,
-        _dart_cJSON_AddStringToObject>('cJSON_AddStringToObject');
-    return _cJSON_AddStringToObject(
+        _dart_cJSON_AddStringToObject>('cJSON_AddStringToObject'))(
       object,
       name,
       string,
     );
   }
 
-  _dart_cJSON_AddStringToObject _cJSON_AddStringToObject;
+  _dart_cJSON_AddStringToObject? _cJSON_AddStringToObject;
 
   ffi.Pointer<cJSON> cJSON_AddRawToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
     ffi.Pointer<ffi.Int8> raw,
   ) {
-    _cJSON_AddRawToObject ??= _dylib.lookupFunction<_c_cJSON_AddRawToObject,
-        _dart_cJSON_AddRawToObject>('cJSON_AddRawToObject');
-    return _cJSON_AddRawToObject(
+    return (_cJSON_AddRawToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddRawToObject,
+        _dart_cJSON_AddRawToObject>('cJSON_AddRawToObject'))(
       object,
       name,
       raw,
     );
   }
 
-  _dart_cJSON_AddRawToObject _cJSON_AddRawToObject;
+  _dart_cJSON_AddRawToObject? _cJSON_AddRawToObject;
 
   ffi.Pointer<cJSON> cJSON_AddObjectToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddObjectToObject ??= _dylib.lookupFunction<
+    return (_cJSON_AddObjectToObject ??= _dylib.lookupFunction<
         _c_cJSON_AddObjectToObject,
-        _dart_cJSON_AddObjectToObject>('cJSON_AddObjectToObject');
-    return _cJSON_AddObjectToObject(
+        _dart_cJSON_AddObjectToObject>('cJSON_AddObjectToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddObjectToObject _cJSON_AddObjectToObject;
+  _dart_cJSON_AddObjectToObject? _cJSON_AddObjectToObject;
 
   ffi.Pointer<cJSON> cJSON_AddArrayToObject(
     ffi.Pointer<cJSON> object,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _cJSON_AddArrayToObject ??= _dylib.lookupFunction<_c_cJSON_AddArrayToObject,
-        _dart_cJSON_AddArrayToObject>('cJSON_AddArrayToObject');
-    return _cJSON_AddArrayToObject(
+    return (_cJSON_AddArrayToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddArrayToObject,
+        _dart_cJSON_AddArrayToObject>('cJSON_AddArrayToObject'))(
       object,
       name,
     );
   }
 
-  _dart_cJSON_AddArrayToObject _cJSON_AddArrayToObject;
+  _dart_cJSON_AddArrayToObject? _cJSON_AddArrayToObject;
 
   double cJSON_SetNumberHelper(
     ffi.Pointer<cJSON> object,
     double number,
   ) {
-    _cJSON_SetNumberHelper ??= _dylib.lookupFunction<_c_cJSON_SetNumberHelper,
-        _dart_cJSON_SetNumberHelper>('cJSON_SetNumberHelper');
-    return _cJSON_SetNumberHelper(
+    return (_cJSON_SetNumberHelper ??= _dylib.lookupFunction<
+        _c_cJSON_SetNumberHelper,
+        _dart_cJSON_SetNumberHelper>('cJSON_SetNumberHelper'))(
       object,
       number,
     );
   }
 
-  _dart_cJSON_SetNumberHelper _cJSON_SetNumberHelper;
+  _dart_cJSON_SetNumberHelper? _cJSON_SetNumberHelper;
 
   ffi.Pointer<ffi.Void> cJSON_malloc(
     int size,
   ) {
-    _cJSON_malloc ??= _dylib
-        .lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc');
-    return _cJSON_malloc(
+    return (_cJSON_malloc ??= _dylib
+        .lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc'))(
       size,
     );
   }
 
-  _dart_cJSON_malloc _cJSON_malloc;
+  _dart_cJSON_malloc? _cJSON_malloc;
 
   void cJSON_free(
     ffi.Pointer<ffi.Void> object,
   ) {
-    _cJSON_free ??=
-        _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free');
-    return _cJSON_free(
+    return (_cJSON_free ??=
+        _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free'))(
       object,
     );
   }
 
-  _dart_cJSON_free _cJSON_free;
+  _dart_cJSON_free? _cJSON_free;
 }
 
 class cJSON extends ffi.Struct {
-  ffi.Pointer<cJSON> next;
+  external ffi.Pointer<cJSON> next;
 
-  ffi.Pointer<cJSON> prev;
+  external ffi.Pointer<cJSON> prev;
 
-  ffi.Pointer<cJSON> child;
+  external ffi.Pointer<cJSON> child;
 
   @ffi.Int32()
-  int type;
+  external int type;
 
-  ffi.Pointer<ffi.Int8> valuestring;
+  external ffi.Pointer<ffi.Int8> valuestring;
 
   @ffi.Int32()
-  int valueint;
+  external int valueint;
 
   @ffi.Double()
-  double valuedouble;
+  external double valuedouble;
 
-  ffi.Pointer<ffi.Int8> string;
+  external ffi.Pointer<ffi.Int8> string;
 }
 
 class cJSON_Hooks extends ffi.Struct {
-  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> malloc_fn;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_1>> malloc_fn;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> free_fn;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> free_fn;
 }
 
 const int CJSON_VERSION_MAJOR = 1;
diff --git a/test/large_integration_tests/_expected_libclang_bindings.dart b/test/large_integration_tests/_expected_libclang_bindings.dart
index 4b6325b..e6cc63e 100644
--- a/test/large_integration_tests/_expected_libclang_bindings.dart
+++ b/test/large_integration_tests/_expected_libclang_bindings.dart
@@ -15,41 +15,40 @@
   void clang_disposeStringSet(
     ffi.Pointer<CXStringSet> set_1,
   ) {
-    _clang_disposeStringSet ??= _dylib.lookupFunction<_c_clang_disposeStringSet,
-        _dart_clang_disposeStringSet>('clang_disposeStringSet');
-    return _clang_disposeStringSet(
+    return (_clang_disposeStringSet ??= _dylib.lookupFunction<
+        _c_clang_disposeStringSet,
+        _dart_clang_disposeStringSet>('clang_disposeStringSet'))(
       set_1,
     );
   }
 
-  _dart_clang_disposeStringSet _clang_disposeStringSet;
+  _dart_clang_disposeStringSet? _clang_disposeStringSet;
 
   /// Return the timestamp for use with Clang's -fbuild-session-timestamp=
   /// option.
   int clang_getBuildSessionTimestamp() {
-    _clang_getBuildSessionTimestamp ??= _dylib.lookupFunction<
-        _c_clang_getBuildSessionTimestamp,
-        _dart_clang_getBuildSessionTimestamp>('clang_getBuildSessionTimestamp');
-    return _clang_getBuildSessionTimestamp();
+    return (_clang_getBuildSessionTimestamp ??= _dylib.lookupFunction<
+            _c_clang_getBuildSessionTimestamp,
+            _dart_clang_getBuildSessionTimestamp>(
+        'clang_getBuildSessionTimestamp'))();
   }
 
-  _dart_clang_getBuildSessionTimestamp _clang_getBuildSessionTimestamp;
+  _dart_clang_getBuildSessionTimestamp? _clang_getBuildSessionTimestamp;
 
   /// Create a CXVirtualFileOverlay object. Must be disposed with
   /// clang_VirtualFileOverlay_dispose().
   ffi.Pointer<CXVirtualFileOverlayImpl> clang_VirtualFileOverlay_create(
     int options,
   ) {
-    _clang_VirtualFileOverlay_create ??= _dylib.lookupFunction<
+    return (_clang_VirtualFileOverlay_create ??= _dylib.lookupFunction<
             _c_clang_VirtualFileOverlay_create,
             _dart_clang_VirtualFileOverlay_create>(
-        'clang_VirtualFileOverlay_create');
-    return _clang_VirtualFileOverlay_create(
+        'clang_VirtualFileOverlay_create'))(
       options,
     );
   }
 
-  _dart_clang_VirtualFileOverlay_create _clang_VirtualFileOverlay_create;
+  _dart_clang_VirtualFileOverlay_create? _clang_VirtualFileOverlay_create;
 
   /// Map an absolute virtual file path to an absolute real one. The virtual
   /// path must be canonicalized (not contain "."/"..").
@@ -58,18 +57,17 @@
     ffi.Pointer<ffi.Int8> virtualPath,
     ffi.Pointer<ffi.Int8> realPath,
   ) {
-    _clang_VirtualFileOverlay_addFileMapping ??= _dylib.lookupFunction<
+    return (_clang_VirtualFileOverlay_addFileMapping ??= _dylib.lookupFunction<
             _c_clang_VirtualFileOverlay_addFileMapping,
             _dart_clang_VirtualFileOverlay_addFileMapping>(
-        'clang_VirtualFileOverlay_addFileMapping');
-    return _clang_VirtualFileOverlay_addFileMapping(
+        'clang_VirtualFileOverlay_addFileMapping'))(
       arg0,
       virtualPath,
       realPath,
     );
   }
 
-  _dart_clang_VirtualFileOverlay_addFileMapping
+  _dart_clang_VirtualFileOverlay_addFileMapping?
       _clang_VirtualFileOverlay_addFileMapping;
 
   /// Set the case sensitivity for the CXVirtualFileOverlay object. The
@@ -79,17 +77,16 @@
     ffi.Pointer<CXVirtualFileOverlayImpl> arg0,
     int caseSensitive,
   ) {
-    _clang_VirtualFileOverlay_setCaseSensitivity ??= _dylib.lookupFunction<
-            _c_clang_VirtualFileOverlay_setCaseSensitivity,
-            _dart_clang_VirtualFileOverlay_setCaseSensitivity>(
-        'clang_VirtualFileOverlay_setCaseSensitivity');
-    return _clang_VirtualFileOverlay_setCaseSensitivity(
+    return (_clang_VirtualFileOverlay_setCaseSensitivity ??=
+        _dylib.lookupFunction<_c_clang_VirtualFileOverlay_setCaseSensitivity,
+                _dart_clang_VirtualFileOverlay_setCaseSensitivity>(
+            'clang_VirtualFileOverlay_setCaseSensitivity'))(
       arg0,
       caseSensitive,
     );
   }
 
-  _dart_clang_VirtualFileOverlay_setCaseSensitivity
+  _dart_clang_VirtualFileOverlay_setCaseSensitivity?
       _clang_VirtualFileOverlay_setCaseSensitivity;
 
   /// Write out the CXVirtualFileOverlay object to a char buffer.
@@ -99,11 +96,10 @@
     ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
     ffi.Pointer<ffi.Uint32> out_buffer_size,
   ) {
-    _clang_VirtualFileOverlay_writeToBuffer ??= _dylib.lookupFunction<
+    return (_clang_VirtualFileOverlay_writeToBuffer ??= _dylib.lookupFunction<
             _c_clang_VirtualFileOverlay_writeToBuffer,
             _dart_clang_VirtualFileOverlay_writeToBuffer>(
-        'clang_VirtualFileOverlay_writeToBuffer');
-    return _clang_VirtualFileOverlay_writeToBuffer(
+        'clang_VirtualFileOverlay_writeToBuffer'))(
       arg0,
       options,
       out_buffer_ptr,
@@ -111,7 +107,7 @@
     );
   }
 
-  _dart_clang_VirtualFileOverlay_writeToBuffer
+  _dart_clang_VirtualFileOverlay_writeToBuffer?
       _clang_VirtualFileOverlay_writeToBuffer;
 
   /// free memory allocated by libclang, such as the buffer returned by
@@ -119,62 +115,59 @@
   void clang_free(
     ffi.Pointer<ffi.Void> buffer,
   ) {
-    _clang_free ??=
-        _dylib.lookupFunction<_c_clang_free, _dart_clang_free>('clang_free');
-    return _clang_free(
+    return (_clang_free ??=
+        _dylib.lookupFunction<_c_clang_free, _dart_clang_free>('clang_free'))(
       buffer,
     );
   }
 
-  _dart_clang_free _clang_free;
+  _dart_clang_free? _clang_free;
 
   /// Dispose a CXVirtualFileOverlay object.
   void clang_VirtualFileOverlay_dispose(
     ffi.Pointer<CXVirtualFileOverlayImpl> arg0,
   ) {
-    _clang_VirtualFileOverlay_dispose ??= _dylib.lookupFunction<
+    return (_clang_VirtualFileOverlay_dispose ??= _dylib.lookupFunction<
             _c_clang_VirtualFileOverlay_dispose,
             _dart_clang_VirtualFileOverlay_dispose>(
-        'clang_VirtualFileOverlay_dispose');
-    return _clang_VirtualFileOverlay_dispose(
+        'clang_VirtualFileOverlay_dispose'))(
       arg0,
     );
   }
 
-  _dart_clang_VirtualFileOverlay_dispose _clang_VirtualFileOverlay_dispose;
+  _dart_clang_VirtualFileOverlay_dispose? _clang_VirtualFileOverlay_dispose;
 
   /// Create a CXModuleMapDescriptor object. Must be disposed with
   /// clang_ModuleMapDescriptor_dispose().
   ffi.Pointer<CXModuleMapDescriptorImpl> clang_ModuleMapDescriptor_create(
     int options,
   ) {
-    _clang_ModuleMapDescriptor_create ??= _dylib.lookupFunction<
+    return (_clang_ModuleMapDescriptor_create ??= _dylib.lookupFunction<
             _c_clang_ModuleMapDescriptor_create,
             _dart_clang_ModuleMapDescriptor_create>(
-        'clang_ModuleMapDescriptor_create');
-    return _clang_ModuleMapDescriptor_create(
+        'clang_ModuleMapDescriptor_create'))(
       options,
     );
   }
 
-  _dart_clang_ModuleMapDescriptor_create _clang_ModuleMapDescriptor_create;
+  _dart_clang_ModuleMapDescriptor_create? _clang_ModuleMapDescriptor_create;
 
   /// Sets the framework module name that the module.map describes.
   int clang_ModuleMapDescriptor_setFrameworkModuleName(
     ffi.Pointer<CXModuleMapDescriptorImpl> arg0,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _clang_ModuleMapDescriptor_setFrameworkModuleName ??= _dylib.lookupFunction<
-            _c_clang_ModuleMapDescriptor_setFrameworkModuleName,
-            _dart_clang_ModuleMapDescriptor_setFrameworkModuleName>(
-        'clang_ModuleMapDescriptor_setFrameworkModuleName');
-    return _clang_ModuleMapDescriptor_setFrameworkModuleName(
+    return (_clang_ModuleMapDescriptor_setFrameworkModuleName ??=
+        _dylib.lookupFunction<
+                _c_clang_ModuleMapDescriptor_setFrameworkModuleName,
+                _dart_clang_ModuleMapDescriptor_setFrameworkModuleName>(
+            'clang_ModuleMapDescriptor_setFrameworkModuleName'))(
       arg0,
       name,
     );
   }
 
-  _dart_clang_ModuleMapDescriptor_setFrameworkModuleName
+  _dart_clang_ModuleMapDescriptor_setFrameworkModuleName?
       _clang_ModuleMapDescriptor_setFrameworkModuleName;
 
   /// Sets the umbrealla header name that the module.map describes.
@@ -182,17 +175,16 @@
     ffi.Pointer<CXModuleMapDescriptorImpl> arg0,
     ffi.Pointer<ffi.Int8> name,
   ) {
-    _clang_ModuleMapDescriptor_setUmbrellaHeader ??= _dylib.lookupFunction<
-            _c_clang_ModuleMapDescriptor_setUmbrellaHeader,
-            _dart_clang_ModuleMapDescriptor_setUmbrellaHeader>(
-        'clang_ModuleMapDescriptor_setUmbrellaHeader');
-    return _clang_ModuleMapDescriptor_setUmbrellaHeader(
+    return (_clang_ModuleMapDescriptor_setUmbrellaHeader ??=
+        _dylib.lookupFunction<_c_clang_ModuleMapDescriptor_setUmbrellaHeader,
+                _dart_clang_ModuleMapDescriptor_setUmbrellaHeader>(
+            'clang_ModuleMapDescriptor_setUmbrellaHeader'))(
       arg0,
       name,
     );
   }
 
-  _dart_clang_ModuleMapDescriptor_setUmbrellaHeader
+  _dart_clang_ModuleMapDescriptor_setUmbrellaHeader?
       _clang_ModuleMapDescriptor_setUmbrellaHeader;
 
   /// Write out the CXModuleMapDescriptor object to a char buffer.
@@ -202,11 +194,10 @@
     ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
     ffi.Pointer<ffi.Uint32> out_buffer_size,
   ) {
-    _clang_ModuleMapDescriptor_writeToBuffer ??= _dylib.lookupFunction<
+    return (_clang_ModuleMapDescriptor_writeToBuffer ??= _dylib.lookupFunction<
             _c_clang_ModuleMapDescriptor_writeToBuffer,
             _dart_clang_ModuleMapDescriptor_writeToBuffer>(
-        'clang_ModuleMapDescriptor_writeToBuffer');
-    return _clang_ModuleMapDescriptor_writeToBuffer(
+        'clang_ModuleMapDescriptor_writeToBuffer'))(
       arg0,
       options,
       out_buffer_ptr,
@@ -214,130 +205,125 @@
     );
   }
 
-  _dart_clang_ModuleMapDescriptor_writeToBuffer
+  _dart_clang_ModuleMapDescriptor_writeToBuffer?
       _clang_ModuleMapDescriptor_writeToBuffer;
 
   /// Dispose a CXModuleMapDescriptor object.
   void clang_ModuleMapDescriptor_dispose(
     ffi.Pointer<CXModuleMapDescriptorImpl> arg0,
   ) {
-    _clang_ModuleMapDescriptor_dispose ??= _dylib.lookupFunction<
+    return (_clang_ModuleMapDescriptor_dispose ??= _dylib.lookupFunction<
             _c_clang_ModuleMapDescriptor_dispose,
             _dart_clang_ModuleMapDescriptor_dispose>(
-        'clang_ModuleMapDescriptor_dispose');
-    return _clang_ModuleMapDescriptor_dispose(
+        'clang_ModuleMapDescriptor_dispose'))(
       arg0,
     );
   }
 
-  _dart_clang_ModuleMapDescriptor_dispose _clang_ModuleMapDescriptor_dispose;
+  _dart_clang_ModuleMapDescriptor_dispose? _clang_ModuleMapDescriptor_dispose;
 
   /// Provides a shared context for creating translation units.
   ffi.Pointer<ffi.Void> clang_createIndex(
     int excludeDeclarationsFromPCH,
     int displayDiagnostics,
   ) {
-    _clang_createIndex ??=
+    return (_clang_createIndex ??=
         _dylib.lookupFunction<_c_clang_createIndex, _dart_clang_createIndex>(
-            'clang_createIndex');
-    return _clang_createIndex(
+            'clang_createIndex'))(
       excludeDeclarationsFromPCH,
       displayDiagnostics,
     );
   }
 
-  _dart_clang_createIndex _clang_createIndex;
+  _dart_clang_createIndex? _clang_createIndex;
 
   /// Destroy the given index.
   void clang_disposeIndex(
     ffi.Pointer<ffi.Void> index,
   ) {
-    _clang_disposeIndex ??=
+    return (_clang_disposeIndex ??=
         _dylib.lookupFunction<_c_clang_disposeIndex, _dart_clang_disposeIndex>(
-            'clang_disposeIndex');
-    return _clang_disposeIndex(
+            'clang_disposeIndex'))(
       index,
     );
   }
 
-  _dart_clang_disposeIndex _clang_disposeIndex;
+  _dart_clang_disposeIndex? _clang_disposeIndex;
 
   /// Sets general options associated with a CXIndex.
   void clang_CXIndex_setGlobalOptions(
     ffi.Pointer<ffi.Void> arg0,
     int options,
   ) {
-    _clang_CXIndex_setGlobalOptions ??= _dylib.lookupFunction<
-        _c_clang_CXIndex_setGlobalOptions,
-        _dart_clang_CXIndex_setGlobalOptions>('clang_CXIndex_setGlobalOptions');
-    return _clang_CXIndex_setGlobalOptions(
+    return (_clang_CXIndex_setGlobalOptions ??= _dylib.lookupFunction<
+            _c_clang_CXIndex_setGlobalOptions,
+            _dart_clang_CXIndex_setGlobalOptions>(
+        'clang_CXIndex_setGlobalOptions'))(
       arg0,
       options,
     );
   }
 
-  _dart_clang_CXIndex_setGlobalOptions _clang_CXIndex_setGlobalOptions;
+  _dart_clang_CXIndex_setGlobalOptions? _clang_CXIndex_setGlobalOptions;
 
   /// Gets the general options associated with a CXIndex.
   int clang_CXIndex_getGlobalOptions(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_CXIndex_getGlobalOptions ??= _dylib.lookupFunction<
-        _c_clang_CXIndex_getGlobalOptions,
-        _dart_clang_CXIndex_getGlobalOptions>('clang_CXIndex_getGlobalOptions');
-    return _clang_CXIndex_getGlobalOptions(
+    return (_clang_CXIndex_getGlobalOptions ??= _dylib.lookupFunction<
+            _c_clang_CXIndex_getGlobalOptions,
+            _dart_clang_CXIndex_getGlobalOptions>(
+        'clang_CXIndex_getGlobalOptions'))(
       arg0,
     );
   }
 
-  _dart_clang_CXIndex_getGlobalOptions _clang_CXIndex_getGlobalOptions;
+  _dart_clang_CXIndex_getGlobalOptions? _clang_CXIndex_getGlobalOptions;
 
   /// Sets the invocation emission path option in a CXIndex.
   void clang_CXIndex_setInvocationEmissionPathOption(
     ffi.Pointer<ffi.Void> arg0,
     ffi.Pointer<ffi.Int8> Path,
   ) {
-    _clang_CXIndex_setInvocationEmissionPathOption ??= _dylib.lookupFunction<
-            _c_clang_CXIndex_setInvocationEmissionPathOption,
-            _dart_clang_CXIndex_setInvocationEmissionPathOption>(
-        'clang_CXIndex_setInvocationEmissionPathOption');
-    return _clang_CXIndex_setInvocationEmissionPathOption(
+    return (_clang_CXIndex_setInvocationEmissionPathOption ??=
+        _dylib.lookupFunction<_c_clang_CXIndex_setInvocationEmissionPathOption,
+                _dart_clang_CXIndex_setInvocationEmissionPathOption>(
+            'clang_CXIndex_setInvocationEmissionPathOption'))(
       arg0,
       Path,
     );
   }
 
-  _dart_clang_CXIndex_setInvocationEmissionPathOption
+  _dart_clang_CXIndex_setInvocationEmissionPathOption?
       _clang_CXIndex_setInvocationEmissionPathOption;
 
   /// Retrieve the last modification time of the given file.
   int clang_getFileTime(
     ffi.Pointer<ffi.Void> SFile,
   ) {
-    _clang_getFileTime ??=
+    return (_clang_getFileTime ??=
         _dylib.lookupFunction<_c_clang_getFileTime, _dart_clang_getFileTime>(
-            'clang_getFileTime');
-    return _clang_getFileTime(
+            'clang_getFileTime'))(
       SFile,
     );
   }
 
-  _dart_clang_getFileTime _clang_getFileTime;
+  _dart_clang_getFileTime? _clang_getFileTime;
 
   /// Retrieve the unique ID for the given file.
   int clang_getFileUniqueID(
     ffi.Pointer<ffi.Void> file,
     ffi.Pointer<CXFileUniqueID> outID,
   ) {
-    _clang_getFileUniqueID ??= _dylib.lookupFunction<_c_clang_getFileUniqueID,
-        _dart_clang_getFileUniqueID>('clang_getFileUniqueID');
-    return _clang_getFileUniqueID(
+    return (_clang_getFileUniqueID ??= _dylib.lookupFunction<
+        _c_clang_getFileUniqueID,
+        _dart_clang_getFileUniqueID>('clang_getFileUniqueID'))(
       file,
       outID,
     );
   }
 
-  _dart_clang_getFileUniqueID _clang_getFileUniqueID;
+  _dart_clang_getFileUniqueID? _clang_getFileUniqueID;
 
   /// Determine whether the given header is guarded against multiple inclusions,
   /// either with the conventional #ifndef/#define/#endif macro guards or with
@@ -346,32 +332,31 @@
     ffi.Pointer<CXTranslationUnitImpl> tu,
     ffi.Pointer<ffi.Void> file,
   ) {
-    _clang_isFileMultipleIncludeGuarded ??= _dylib.lookupFunction<
+    return (_clang_isFileMultipleIncludeGuarded ??= _dylib.lookupFunction<
             _c_clang_isFileMultipleIncludeGuarded,
             _dart_clang_isFileMultipleIncludeGuarded>(
-        'clang_isFileMultipleIncludeGuarded');
-    return _clang_isFileMultipleIncludeGuarded(
+        'clang_isFileMultipleIncludeGuarded'))(
       tu,
       file,
     );
   }
 
-  _dart_clang_isFileMultipleIncludeGuarded _clang_isFileMultipleIncludeGuarded;
+  _dart_clang_isFileMultipleIncludeGuarded? _clang_isFileMultipleIncludeGuarded;
 
   /// Retrieve a file handle within the given translation unit.
   ffi.Pointer<ffi.Void> clang_getFile(
     ffi.Pointer<CXTranslationUnitImpl> tu,
     ffi.Pointer<ffi.Int8> file_name,
   ) {
-    _clang_getFile ??= _dylib
-        .lookupFunction<_c_clang_getFile, _dart_clang_getFile>('clang_getFile');
-    return _clang_getFile(
+    return (_clang_getFile ??=
+        _dylib.lookupFunction<_c_clang_getFile, _dart_clang_getFile>(
+            'clang_getFile'))(
       tu,
       file_name,
     );
   }
 
-  _dart_clang_getFile _clang_getFile;
+  _dart_clang_getFile? _clang_getFile;
 
   /// Retrieve the buffer associated with the given file.
   ffi.Pointer<ffi.Int8> clang_getFileContents(
@@ -379,16 +364,16 @@
     ffi.Pointer<ffi.Void> file,
     ffi.Pointer<ffi.Uint64> size,
   ) {
-    _clang_getFileContents ??= _dylib.lookupFunction<_c_clang_getFileContents,
-        _dart_clang_getFileContents>('clang_getFileContents');
-    return _clang_getFileContents(
+    return (_clang_getFileContents ??= _dylib.lookupFunction<
+        _c_clang_getFileContents,
+        _dart_clang_getFileContents>('clang_getFileContents'))(
       tu,
       file,
       size,
     );
   }
 
-  _dart_clang_getFileContents _clang_getFileContents;
+  _dart_clang_getFileContents? _clang_getFileContents;
 
   /// Returns non-zero if the file1 and file2 point to the same file, or they
   /// are both NULL.
@@ -396,89 +381,84 @@
     ffi.Pointer<ffi.Void> file1,
     ffi.Pointer<ffi.Void> file2,
   ) {
-    _clang_File_isEqual ??=
+    return (_clang_File_isEqual ??=
         _dylib.lookupFunction<_c_clang_File_isEqual, _dart_clang_File_isEqual>(
-            'clang_File_isEqual');
-    return _clang_File_isEqual(
+            'clang_File_isEqual'))(
       file1,
       file2,
     );
   }
 
-  _dart_clang_File_isEqual _clang_File_isEqual;
+  _dart_clang_File_isEqual? _clang_File_isEqual;
 
   /// Retrieve all ranges that were skipped by the preprocessor.
   ffi.Pointer<CXSourceRangeList> clang_getSkippedRanges(
     ffi.Pointer<CXTranslationUnitImpl> tu,
     ffi.Pointer<ffi.Void> file,
   ) {
-    _clang_getSkippedRanges ??= _dylib.lookupFunction<_c_clang_getSkippedRanges,
-        _dart_clang_getSkippedRanges>('clang_getSkippedRanges');
-    return _clang_getSkippedRanges(
+    return (_clang_getSkippedRanges ??= _dylib.lookupFunction<
+        _c_clang_getSkippedRanges,
+        _dart_clang_getSkippedRanges>('clang_getSkippedRanges'))(
       tu,
       file,
     );
   }
 
-  _dart_clang_getSkippedRanges _clang_getSkippedRanges;
+  _dart_clang_getSkippedRanges? _clang_getSkippedRanges;
 
   /// Retrieve all ranges from all files that were skipped by the preprocessor.
   ffi.Pointer<CXSourceRangeList> clang_getAllSkippedRanges(
     ffi.Pointer<CXTranslationUnitImpl> tu,
   ) {
-    _clang_getAllSkippedRanges ??= _dylib.lookupFunction<
+    return (_clang_getAllSkippedRanges ??= _dylib.lookupFunction<
         _c_clang_getAllSkippedRanges,
-        _dart_clang_getAllSkippedRanges>('clang_getAllSkippedRanges');
-    return _clang_getAllSkippedRanges(
+        _dart_clang_getAllSkippedRanges>('clang_getAllSkippedRanges'))(
       tu,
     );
   }
 
-  _dart_clang_getAllSkippedRanges _clang_getAllSkippedRanges;
+  _dart_clang_getAllSkippedRanges? _clang_getAllSkippedRanges;
 
   /// Destroy the given CXSourceRangeList.
   void clang_disposeSourceRangeList(
     ffi.Pointer<CXSourceRangeList> ranges,
   ) {
-    _clang_disposeSourceRangeList ??= _dylib.lookupFunction<
+    return (_clang_disposeSourceRangeList ??= _dylib.lookupFunction<
         _c_clang_disposeSourceRangeList,
-        _dart_clang_disposeSourceRangeList>('clang_disposeSourceRangeList');
-    return _clang_disposeSourceRangeList(
+        _dart_clang_disposeSourceRangeList>('clang_disposeSourceRangeList'))(
       ranges,
     );
   }
 
-  _dart_clang_disposeSourceRangeList _clang_disposeSourceRangeList;
+  _dart_clang_disposeSourceRangeList? _clang_disposeSourceRangeList;
 
   /// Determine the number of diagnostics in a CXDiagnosticSet.
   int clang_getNumDiagnosticsInSet(
     ffi.Pointer<ffi.Void> Diags,
   ) {
-    _clang_getNumDiagnosticsInSet ??= _dylib.lookupFunction<
+    return (_clang_getNumDiagnosticsInSet ??= _dylib.lookupFunction<
         _c_clang_getNumDiagnosticsInSet,
-        _dart_clang_getNumDiagnosticsInSet>('clang_getNumDiagnosticsInSet');
-    return _clang_getNumDiagnosticsInSet(
+        _dart_clang_getNumDiagnosticsInSet>('clang_getNumDiagnosticsInSet'))(
       Diags,
     );
   }
 
-  _dart_clang_getNumDiagnosticsInSet _clang_getNumDiagnosticsInSet;
+  _dart_clang_getNumDiagnosticsInSet? _clang_getNumDiagnosticsInSet;
 
   /// Retrieve a diagnostic associated with the given CXDiagnosticSet.
   ffi.Pointer<ffi.Void> clang_getDiagnosticInSet(
     ffi.Pointer<ffi.Void> Diags,
     int Index,
   ) {
-    _clang_getDiagnosticInSet ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticInSet ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticInSet,
-        _dart_clang_getDiagnosticInSet>('clang_getDiagnosticInSet');
-    return _clang_getDiagnosticInSet(
+        _dart_clang_getDiagnosticInSet>('clang_getDiagnosticInSet'))(
       Diags,
       Index,
     );
   }
 
-  _dart_clang_getDiagnosticInSet _clang_getDiagnosticInSet;
+  _dart_clang_getDiagnosticInSet? _clang_getDiagnosticInSet;
 
   /// Deserialize a set of diagnostics from a Clang diagnostics bitcode file.
   ffi.Pointer<ffi.Void> clang_loadDiagnostics(
@@ -486,173 +466,163 @@
     ffi.Pointer<ffi.Int32> error,
     ffi.Pointer<CXString> errorString,
   ) {
-    _clang_loadDiagnostics ??= _dylib.lookupFunction<_c_clang_loadDiagnostics,
-        _dart_clang_loadDiagnostics>('clang_loadDiagnostics');
-    return _clang_loadDiagnostics(
+    return (_clang_loadDiagnostics ??= _dylib.lookupFunction<
+        _c_clang_loadDiagnostics,
+        _dart_clang_loadDiagnostics>('clang_loadDiagnostics'))(
       file,
       error,
       errorString,
     );
   }
 
-  _dart_clang_loadDiagnostics _clang_loadDiagnostics;
+  _dart_clang_loadDiagnostics? _clang_loadDiagnostics;
 
   /// Release a CXDiagnosticSet and all of its contained diagnostics.
   void clang_disposeDiagnosticSet(
     ffi.Pointer<ffi.Void> Diags,
   ) {
-    _clang_disposeDiagnosticSet ??= _dylib.lookupFunction<
+    return (_clang_disposeDiagnosticSet ??= _dylib.lookupFunction<
         _c_clang_disposeDiagnosticSet,
-        _dart_clang_disposeDiagnosticSet>('clang_disposeDiagnosticSet');
-    return _clang_disposeDiagnosticSet(
+        _dart_clang_disposeDiagnosticSet>('clang_disposeDiagnosticSet'))(
       Diags,
     );
   }
 
-  _dart_clang_disposeDiagnosticSet _clang_disposeDiagnosticSet;
+  _dart_clang_disposeDiagnosticSet? _clang_disposeDiagnosticSet;
 
   /// Retrieve the child diagnostics of a CXDiagnostic.
   ffi.Pointer<ffi.Void> clang_getChildDiagnostics(
     ffi.Pointer<ffi.Void> D,
   ) {
-    _clang_getChildDiagnostics ??= _dylib.lookupFunction<
+    return (_clang_getChildDiagnostics ??= _dylib.lookupFunction<
         _c_clang_getChildDiagnostics,
-        _dart_clang_getChildDiagnostics>('clang_getChildDiagnostics');
-    return _clang_getChildDiagnostics(
+        _dart_clang_getChildDiagnostics>('clang_getChildDiagnostics'))(
       D,
     );
   }
 
-  _dart_clang_getChildDiagnostics _clang_getChildDiagnostics;
+  _dart_clang_getChildDiagnostics? _clang_getChildDiagnostics;
 
   /// Determine the number of diagnostics produced for the given translation
   /// unit.
   int clang_getNumDiagnostics(
     ffi.Pointer<CXTranslationUnitImpl> Unit,
   ) {
-    _clang_getNumDiagnostics ??= _dylib.lookupFunction<
+    return (_clang_getNumDiagnostics ??= _dylib.lookupFunction<
         _c_clang_getNumDiagnostics,
-        _dart_clang_getNumDiagnostics>('clang_getNumDiagnostics');
-    return _clang_getNumDiagnostics(
+        _dart_clang_getNumDiagnostics>('clang_getNumDiagnostics'))(
       Unit,
     );
   }
 
-  _dart_clang_getNumDiagnostics _clang_getNumDiagnostics;
+  _dart_clang_getNumDiagnostics? _clang_getNumDiagnostics;
 
   /// Retrieve a diagnostic associated with the given translation unit.
   ffi.Pointer<ffi.Void> clang_getDiagnostic(
     ffi.Pointer<CXTranslationUnitImpl> Unit,
     int Index,
   ) {
-    _clang_getDiagnostic ??= _dylib.lookupFunction<_c_clang_getDiagnostic,
-        _dart_clang_getDiagnostic>('clang_getDiagnostic');
-    return _clang_getDiagnostic(
+    return (_clang_getDiagnostic ??= _dylib.lookupFunction<
+        _c_clang_getDiagnostic,
+        _dart_clang_getDiagnostic>('clang_getDiagnostic'))(
       Unit,
       Index,
     );
   }
 
-  _dart_clang_getDiagnostic _clang_getDiagnostic;
+  _dart_clang_getDiagnostic? _clang_getDiagnostic;
 
   /// Retrieve the complete set of diagnostics associated with a translation
   /// unit.
   ffi.Pointer<ffi.Void> clang_getDiagnosticSetFromTU(
     ffi.Pointer<CXTranslationUnitImpl> Unit,
   ) {
-    _clang_getDiagnosticSetFromTU ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticSetFromTU ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticSetFromTU,
-        _dart_clang_getDiagnosticSetFromTU>('clang_getDiagnosticSetFromTU');
-    return _clang_getDiagnosticSetFromTU(
+        _dart_clang_getDiagnosticSetFromTU>('clang_getDiagnosticSetFromTU'))(
       Unit,
     );
   }
 
-  _dart_clang_getDiagnosticSetFromTU _clang_getDiagnosticSetFromTU;
+  _dart_clang_getDiagnosticSetFromTU? _clang_getDiagnosticSetFromTU;
 
   /// Destroy a diagnostic.
   void clang_disposeDiagnostic(
     ffi.Pointer<ffi.Void> Diagnostic,
   ) {
-    _clang_disposeDiagnostic ??= _dylib.lookupFunction<
+    return (_clang_disposeDiagnostic ??= _dylib.lookupFunction<
         _c_clang_disposeDiagnostic,
-        _dart_clang_disposeDiagnostic>('clang_disposeDiagnostic');
-    return _clang_disposeDiagnostic(
+        _dart_clang_disposeDiagnostic>('clang_disposeDiagnostic'))(
       Diagnostic,
     );
   }
 
-  _dart_clang_disposeDiagnostic _clang_disposeDiagnostic;
+  _dart_clang_disposeDiagnostic? _clang_disposeDiagnostic;
 
   /// Retrieve the set of display options most similar to the default behavior
   /// of the clang compiler.
   int clang_defaultDiagnosticDisplayOptions() {
-    _clang_defaultDiagnosticDisplayOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultDiagnosticDisplayOptions ??= _dylib.lookupFunction<
             _c_clang_defaultDiagnosticDisplayOptions,
             _dart_clang_defaultDiagnosticDisplayOptions>(
-        'clang_defaultDiagnosticDisplayOptions');
-    return _clang_defaultDiagnosticDisplayOptions();
+        'clang_defaultDiagnosticDisplayOptions'))();
   }
 
-  _dart_clang_defaultDiagnosticDisplayOptions
+  _dart_clang_defaultDiagnosticDisplayOptions?
       _clang_defaultDiagnosticDisplayOptions;
 
   /// Determine the severity of the given diagnostic.
   int clang_getDiagnosticSeverity(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_getDiagnosticSeverity ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticSeverity ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticSeverity,
-        _dart_clang_getDiagnosticSeverity>('clang_getDiagnosticSeverity');
-    return _clang_getDiagnosticSeverity(
+        _dart_clang_getDiagnosticSeverity>('clang_getDiagnosticSeverity'))(
       arg0,
     );
   }
 
-  _dart_clang_getDiagnosticSeverity _clang_getDiagnosticSeverity;
+  _dart_clang_getDiagnosticSeverity? _clang_getDiagnosticSeverity;
 
   /// Retrieve the category number for this diagnostic.
   int clang_getDiagnosticCategory(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_getDiagnosticCategory ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticCategory ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticCategory,
-        _dart_clang_getDiagnosticCategory>('clang_getDiagnosticCategory');
-    return _clang_getDiagnosticCategory(
+        _dart_clang_getDiagnosticCategory>('clang_getDiagnosticCategory'))(
       arg0,
     );
   }
 
-  _dart_clang_getDiagnosticCategory _clang_getDiagnosticCategory;
+  _dart_clang_getDiagnosticCategory? _clang_getDiagnosticCategory;
 
   /// Determine the number of source ranges associated with the given
   /// diagnostic.
   int clang_getDiagnosticNumRanges(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_getDiagnosticNumRanges ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticNumRanges ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticNumRanges,
-        _dart_clang_getDiagnosticNumRanges>('clang_getDiagnosticNumRanges');
-    return _clang_getDiagnosticNumRanges(
+        _dart_clang_getDiagnosticNumRanges>('clang_getDiagnosticNumRanges'))(
       arg0,
     );
   }
 
-  _dart_clang_getDiagnosticNumRanges _clang_getDiagnosticNumRanges;
+  _dart_clang_getDiagnosticNumRanges? _clang_getDiagnosticNumRanges;
 
   /// Determine the number of fix-it hints associated with the given diagnostic.
   int clang_getDiagnosticNumFixIts(
     ffi.Pointer<ffi.Void> Diagnostic,
   ) {
-    _clang_getDiagnosticNumFixIts ??= _dylib.lookupFunction<
+    return (_clang_getDiagnosticNumFixIts ??= _dylib.lookupFunction<
         _c_clang_getDiagnosticNumFixIts,
-        _dart_clang_getDiagnosticNumFixIts>('clang_getDiagnosticNumFixIts');
-    return _clang_getDiagnosticNumFixIts(
+        _dart_clang_getDiagnosticNumFixIts>('clang_getDiagnosticNumFixIts'))(
       Diagnostic,
     );
   }
 
-  _dart_clang_getDiagnosticNumFixIts _clang_getDiagnosticNumFixIts;
+  _dart_clang_getDiagnosticNumFixIts? _clang_getDiagnosticNumFixIts;
 
   /// Return the CXTranslationUnit for a given source file and the provided
   /// command line arguments one would pass to the compiler.
@@ -664,11 +634,10 @@
     int num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
   ) {
-    _clang_createTranslationUnitFromSourceFile ??= _dylib.lookupFunction<
-            _c_clang_createTranslationUnitFromSourceFile,
-            _dart_clang_createTranslationUnitFromSourceFile>(
-        'clang_createTranslationUnitFromSourceFile');
-    return _clang_createTranslationUnitFromSourceFile(
+    return (_clang_createTranslationUnitFromSourceFile ??=
+        _dylib.lookupFunction<_c_clang_createTranslationUnitFromSourceFile,
+                _dart_clang_createTranslationUnitFromSourceFile>(
+            'clang_createTranslationUnitFromSourceFile'))(
       CIdx,
       source_filename,
       num_clang_command_line_args,
@@ -678,7 +647,7 @@
     );
   }
 
-  _dart_clang_createTranslationUnitFromSourceFile
+  _dart_clang_createTranslationUnitFromSourceFile?
       _clang_createTranslationUnitFromSourceFile;
 
   /// Same as clang_createTranslationUnit2, but returns the CXTranslationUnit
@@ -688,16 +657,15 @@
     ffi.Pointer<ffi.Void> CIdx,
     ffi.Pointer<ffi.Int8> ast_filename,
   ) {
-    _clang_createTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_createTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_createTranslationUnit,
-        _dart_clang_createTranslationUnit>('clang_createTranslationUnit');
-    return _clang_createTranslationUnit(
+        _dart_clang_createTranslationUnit>('clang_createTranslationUnit'))(
       CIdx,
       ast_filename,
     );
   }
 
-  _dart_clang_createTranslationUnit _clang_createTranslationUnit;
+  _dart_clang_createTranslationUnit? _clang_createTranslationUnit;
 
   /// Create a translation unit from an AST file ( -emit-ast).
   int clang_createTranslationUnit2(
@@ -705,29 +673,27 @@
     ffi.Pointer<ffi.Int8> ast_filename,
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
   ) {
-    _clang_createTranslationUnit2 ??= _dylib.lookupFunction<
+    return (_clang_createTranslationUnit2 ??= _dylib.lookupFunction<
         _c_clang_createTranslationUnit2,
-        _dart_clang_createTranslationUnit2>('clang_createTranslationUnit2');
-    return _clang_createTranslationUnit2(
+        _dart_clang_createTranslationUnit2>('clang_createTranslationUnit2'))(
       CIdx,
       ast_filename,
       out_TU,
     );
   }
 
-  _dart_clang_createTranslationUnit2 _clang_createTranslationUnit2;
+  _dart_clang_createTranslationUnit2? _clang_createTranslationUnit2;
 
   /// Returns the set of flags that is suitable for parsing a translation unit
   /// that is being edited.
   int clang_defaultEditingTranslationUnitOptions() {
-    _clang_defaultEditingTranslationUnitOptions ??= _dylib.lookupFunction<
-            _c_clang_defaultEditingTranslationUnitOptions,
-            _dart_clang_defaultEditingTranslationUnitOptions>(
-        'clang_defaultEditingTranslationUnitOptions');
-    return _clang_defaultEditingTranslationUnitOptions();
+    return (_clang_defaultEditingTranslationUnitOptions ??=
+        _dylib.lookupFunction<_c_clang_defaultEditingTranslationUnitOptions,
+                _dart_clang_defaultEditingTranslationUnitOptions>(
+            'clang_defaultEditingTranslationUnitOptions'))();
   }
 
-  _dart_clang_defaultEditingTranslationUnitOptions
+  _dart_clang_defaultEditingTranslationUnitOptions?
       _clang_defaultEditingTranslationUnitOptions;
 
   /// Same as clang_parseTranslationUnit2, but returns the CXTranslationUnit
@@ -742,10 +708,9 @@
     int num_unsaved_files,
     int options,
   ) {
-    _clang_parseTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_parseTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_parseTranslationUnit,
-        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit');
-    return _clang_parseTranslationUnit(
+        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit'))(
       CIdx,
       source_filename,
       command_line_args,
@@ -756,7 +721,7 @@
     );
   }
 
-  _dart_clang_parseTranslationUnit _clang_parseTranslationUnit;
+  _dart_clang_parseTranslationUnit? _clang_parseTranslationUnit;
 
   /// Parse the given source file and the translation unit corresponding to that
   /// file.
@@ -770,10 +735,9 @@
     int options,
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
   ) {
-    _clang_parseTranslationUnit2 ??= _dylib.lookupFunction<
+    return (_clang_parseTranslationUnit2 ??= _dylib.lookupFunction<
         _c_clang_parseTranslationUnit2,
-        _dart_clang_parseTranslationUnit2>('clang_parseTranslationUnit2');
-    return _clang_parseTranslationUnit2(
+        _dart_clang_parseTranslationUnit2>('clang_parseTranslationUnit2'))(
       CIdx,
       source_filename,
       command_line_args,
@@ -785,7 +749,7 @@
     );
   }
 
-  _dart_clang_parseTranslationUnit2 _clang_parseTranslationUnit2;
+  _dart_clang_parseTranslationUnit2? _clang_parseTranslationUnit2;
 
   /// Same as clang_parseTranslationUnit2 but requires a full command line for
   /// command_line_args including argv[0]. This is useful if the standard
@@ -800,11 +764,10 @@
     int options,
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
   ) {
-    _clang_parseTranslationUnit2FullArgv ??= _dylib.lookupFunction<
+    return (_clang_parseTranslationUnit2FullArgv ??= _dylib.lookupFunction<
             _c_clang_parseTranslationUnit2FullArgv,
             _dart_clang_parseTranslationUnit2FullArgv>(
-        'clang_parseTranslationUnit2FullArgv');
-    return _clang_parseTranslationUnit2FullArgv(
+        'clang_parseTranslationUnit2FullArgv'))(
       CIdx,
       source_filename,
       command_line_args,
@@ -816,22 +779,21 @@
     );
   }
 
-  _dart_clang_parseTranslationUnit2FullArgv
+  _dart_clang_parseTranslationUnit2FullArgv?
       _clang_parseTranslationUnit2FullArgv;
 
   /// Returns the set of flags that is suitable for saving a translation unit.
   int clang_defaultSaveOptions(
     ffi.Pointer<CXTranslationUnitImpl> TU,
   ) {
-    _clang_defaultSaveOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultSaveOptions ??= _dylib.lookupFunction<
         _c_clang_defaultSaveOptions,
-        _dart_clang_defaultSaveOptions>('clang_defaultSaveOptions');
-    return _clang_defaultSaveOptions(
+        _dart_clang_defaultSaveOptions>('clang_defaultSaveOptions'))(
       TU,
     );
   }
 
-  _dart_clang_defaultSaveOptions _clang_defaultSaveOptions;
+  _dart_clang_defaultSaveOptions? _clang_defaultSaveOptions;
 
   /// Saves a translation unit into a serialized representation of that
   /// translation unit on disk.
@@ -840,60 +802,56 @@
     ffi.Pointer<ffi.Int8> FileName,
     int options,
   ) {
-    _clang_saveTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_saveTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_saveTranslationUnit,
-        _dart_clang_saveTranslationUnit>('clang_saveTranslationUnit');
-    return _clang_saveTranslationUnit(
+        _dart_clang_saveTranslationUnit>('clang_saveTranslationUnit'))(
       TU,
       FileName,
       options,
     );
   }
 
-  _dart_clang_saveTranslationUnit _clang_saveTranslationUnit;
+  _dart_clang_saveTranslationUnit? _clang_saveTranslationUnit;
 
   /// Suspend a translation unit in order to free memory associated with it.
   int clang_suspendTranslationUnit(
     ffi.Pointer<CXTranslationUnitImpl> arg0,
   ) {
-    _clang_suspendTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_suspendTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_suspendTranslationUnit,
-        _dart_clang_suspendTranslationUnit>('clang_suspendTranslationUnit');
-    return _clang_suspendTranslationUnit(
+        _dart_clang_suspendTranslationUnit>('clang_suspendTranslationUnit'))(
       arg0,
     );
   }
 
-  _dart_clang_suspendTranslationUnit _clang_suspendTranslationUnit;
+  _dart_clang_suspendTranslationUnit? _clang_suspendTranslationUnit;
 
   /// Destroy the specified CXTranslationUnit object.
   void clang_disposeTranslationUnit(
     ffi.Pointer<CXTranslationUnitImpl> arg0,
   ) {
-    _clang_disposeTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_disposeTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_disposeTranslationUnit,
-        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit');
-    return _clang_disposeTranslationUnit(
+        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit'))(
       arg0,
     );
   }
 
-  _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit;
+  _dart_clang_disposeTranslationUnit? _clang_disposeTranslationUnit;
 
   /// Returns the set of flags that is suitable for reparsing a translation
   /// unit.
   int clang_defaultReparseOptions(
     ffi.Pointer<CXTranslationUnitImpl> TU,
   ) {
-    _clang_defaultReparseOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultReparseOptions ??= _dylib.lookupFunction<
         _c_clang_defaultReparseOptions,
-        _dart_clang_defaultReparseOptions>('clang_defaultReparseOptions');
-    return _clang_defaultReparseOptions(
+        _dart_clang_defaultReparseOptions>('clang_defaultReparseOptions'))(
       TU,
     );
   }
 
-  _dart_clang_defaultReparseOptions _clang_defaultReparseOptions;
+  _dart_clang_defaultReparseOptions? _clang_defaultReparseOptions;
 
   /// Reparse the source files that produced this translation unit.
   int clang_reparseTranslationUnit(
@@ -902,10 +860,9 @@
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     int options,
   ) {
-    _clang_reparseTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_reparseTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_reparseTranslationUnit,
-        _dart_clang_reparseTranslationUnit>('clang_reparseTranslationUnit');
-    return _clang_reparseTranslationUnit(
+        _dart_clang_reparseTranslationUnit>('clang_reparseTranslationUnit'))(
       TU,
       num_unsaved_files,
       unsaved_files,
@@ -913,264 +870,249 @@
     );
   }
 
-  _dart_clang_reparseTranslationUnit _clang_reparseTranslationUnit;
+  _dart_clang_reparseTranslationUnit? _clang_reparseTranslationUnit;
 
   /// Returns the human-readable null-terminated C string that represents the
   /// name of the memory category. This string should never be freed.
   ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
     int kind,
   ) {
-    _clang_getTUResourceUsageName ??= _dylib.lookupFunction<
+    return (_clang_getTUResourceUsageName ??= _dylib.lookupFunction<
         _c_clang_getTUResourceUsageName,
-        _dart_clang_getTUResourceUsageName>('clang_getTUResourceUsageName');
-    return _clang_getTUResourceUsageName(
+        _dart_clang_getTUResourceUsageName>('clang_getTUResourceUsageName'))(
       kind,
     );
   }
 
-  _dart_clang_getTUResourceUsageName _clang_getTUResourceUsageName;
+  _dart_clang_getTUResourceUsageName? _clang_getTUResourceUsageName;
 
   /// Get target information for this translation unit.
   ffi.Pointer<CXTargetInfoImpl> clang_getTranslationUnitTargetInfo(
     ffi.Pointer<CXTranslationUnitImpl> CTUnit,
   ) {
-    _clang_getTranslationUnitTargetInfo ??= _dylib.lookupFunction<
+    return (_clang_getTranslationUnitTargetInfo ??= _dylib.lookupFunction<
             _c_clang_getTranslationUnitTargetInfo,
             _dart_clang_getTranslationUnitTargetInfo>(
-        'clang_getTranslationUnitTargetInfo');
-    return _clang_getTranslationUnitTargetInfo(
+        'clang_getTranslationUnitTargetInfo'))(
       CTUnit,
     );
   }
 
-  _dart_clang_getTranslationUnitTargetInfo _clang_getTranslationUnitTargetInfo;
+  _dart_clang_getTranslationUnitTargetInfo? _clang_getTranslationUnitTargetInfo;
 
   /// Destroy the CXTargetInfo object.
   void clang_TargetInfo_dispose(
     ffi.Pointer<CXTargetInfoImpl> Info,
   ) {
-    _clang_TargetInfo_dispose ??= _dylib.lookupFunction<
+    return (_clang_TargetInfo_dispose ??= _dylib.lookupFunction<
         _c_clang_TargetInfo_dispose,
-        _dart_clang_TargetInfo_dispose>('clang_TargetInfo_dispose');
-    return _clang_TargetInfo_dispose(
+        _dart_clang_TargetInfo_dispose>('clang_TargetInfo_dispose'))(
       Info,
     );
   }
 
-  _dart_clang_TargetInfo_dispose _clang_TargetInfo_dispose;
+  _dart_clang_TargetInfo_dispose? _clang_TargetInfo_dispose;
 
   /// Get the pointer width of the target in bits.
   int clang_TargetInfo_getPointerWidth(
     ffi.Pointer<CXTargetInfoImpl> Info,
   ) {
-    _clang_TargetInfo_getPointerWidth ??= _dylib.lookupFunction<
+    return (_clang_TargetInfo_getPointerWidth ??= _dylib.lookupFunction<
             _c_clang_TargetInfo_getPointerWidth,
             _dart_clang_TargetInfo_getPointerWidth>(
-        'clang_TargetInfo_getPointerWidth');
-    return _clang_TargetInfo_getPointerWidth(
+        'clang_TargetInfo_getPointerWidth'))(
       Info,
     );
   }
 
-  _dart_clang_TargetInfo_getPointerWidth _clang_TargetInfo_getPointerWidth;
+  _dart_clang_TargetInfo_getPointerWidth? _clang_TargetInfo_getPointerWidth;
 
   /// Determine whether the given cursor kind represents a declaration.
   int clang_isDeclaration(
     int arg0,
   ) {
-    _clang_isDeclaration ??= _dylib.lookupFunction<_c_clang_isDeclaration,
-        _dart_clang_isDeclaration>('clang_isDeclaration');
-    return _clang_isDeclaration(
+    return (_clang_isDeclaration ??= _dylib.lookupFunction<
+        _c_clang_isDeclaration,
+        _dart_clang_isDeclaration>('clang_isDeclaration'))(
       arg0,
     );
   }
 
-  _dart_clang_isDeclaration _clang_isDeclaration;
+  _dart_clang_isDeclaration? _clang_isDeclaration;
 
   /// Determine whether the given cursor kind represents a simple reference.
   int clang_isReference(
     int arg0,
   ) {
-    _clang_isReference ??=
+    return (_clang_isReference ??=
         _dylib.lookupFunction<_c_clang_isReference, _dart_clang_isReference>(
-            'clang_isReference');
-    return _clang_isReference(
+            'clang_isReference'))(
       arg0,
     );
   }
 
-  _dart_clang_isReference _clang_isReference;
+  _dart_clang_isReference? _clang_isReference;
 
   /// Determine whether the given cursor kind represents an expression.
   int clang_isExpression(
     int arg0,
   ) {
-    _clang_isExpression ??=
+    return (_clang_isExpression ??=
         _dylib.lookupFunction<_c_clang_isExpression, _dart_clang_isExpression>(
-            'clang_isExpression');
-    return _clang_isExpression(
+            'clang_isExpression'))(
       arg0,
     );
   }
 
-  _dart_clang_isExpression _clang_isExpression;
+  _dart_clang_isExpression? _clang_isExpression;
 
   /// Determine whether the given cursor kind represents a statement.
   int clang_isStatement(
     int arg0,
   ) {
-    _clang_isStatement ??=
+    return (_clang_isStatement ??=
         _dylib.lookupFunction<_c_clang_isStatement, _dart_clang_isStatement>(
-            'clang_isStatement');
-    return _clang_isStatement(
+            'clang_isStatement'))(
       arg0,
     );
   }
 
-  _dart_clang_isStatement _clang_isStatement;
+  _dart_clang_isStatement? _clang_isStatement;
 
   /// Determine whether the given cursor kind represents an attribute.
   int clang_isAttribute(
     int arg0,
   ) {
-    _clang_isAttribute ??=
+    return (_clang_isAttribute ??=
         _dylib.lookupFunction<_c_clang_isAttribute, _dart_clang_isAttribute>(
-            'clang_isAttribute');
-    return _clang_isAttribute(
+            'clang_isAttribute'))(
       arg0,
     );
   }
 
-  _dart_clang_isAttribute _clang_isAttribute;
+  _dart_clang_isAttribute? _clang_isAttribute;
 
   /// Determine whether the given cursor kind represents an invalid cursor.
   int clang_isInvalid(
     int arg0,
   ) {
-    _clang_isInvalid ??=
+    return (_clang_isInvalid ??=
         _dylib.lookupFunction<_c_clang_isInvalid, _dart_clang_isInvalid>(
-            'clang_isInvalid');
-    return _clang_isInvalid(
+            'clang_isInvalid'))(
       arg0,
     );
   }
 
-  _dart_clang_isInvalid _clang_isInvalid;
+  _dart_clang_isInvalid? _clang_isInvalid;
 
   /// Determine whether the given cursor kind represents a translation unit.
   int clang_isTranslationUnit(
     int arg0,
   ) {
-    _clang_isTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_isTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_isTranslationUnit,
-        _dart_clang_isTranslationUnit>('clang_isTranslationUnit');
-    return _clang_isTranslationUnit(
+        _dart_clang_isTranslationUnit>('clang_isTranslationUnit'))(
       arg0,
     );
   }
 
-  _dart_clang_isTranslationUnit _clang_isTranslationUnit;
+  _dart_clang_isTranslationUnit? _clang_isTranslationUnit;
 
   /// * Determine whether the given cursor represents a preprocessing element,
   /// such as a preprocessor directive or macro instantiation.
   int clang_isPreprocessing(
     int arg0,
   ) {
-    _clang_isPreprocessing ??= _dylib.lookupFunction<_c_clang_isPreprocessing,
-        _dart_clang_isPreprocessing>('clang_isPreprocessing');
-    return _clang_isPreprocessing(
+    return (_clang_isPreprocessing ??= _dylib.lookupFunction<
+        _c_clang_isPreprocessing,
+        _dart_clang_isPreprocessing>('clang_isPreprocessing'))(
       arg0,
     );
   }
 
-  _dart_clang_isPreprocessing _clang_isPreprocessing;
+  _dart_clang_isPreprocessing? _clang_isPreprocessing;
 
   /// * Determine whether the given cursor represents a currently unexposed
   /// piece of the AST (e.g., CXCursor_UnexposedStmt).
   int clang_isUnexposed(
     int arg0,
   ) {
-    _clang_isUnexposed ??=
+    return (_clang_isUnexposed ??=
         _dylib.lookupFunction<_c_clang_isUnexposed, _dart_clang_isUnexposed>(
-            'clang_isUnexposed');
-    return _clang_isUnexposed(
+            'clang_isUnexposed'))(
       arg0,
     );
   }
 
-  _dart_clang_isUnexposed _clang_isUnexposed;
+  _dart_clang_isUnexposed? _clang_isUnexposed;
 
   /// Free the memory associated with a CXPlatformAvailability structure.
   void clang_disposeCXPlatformAvailability(
     ffi.Pointer<CXPlatformAvailability> availability,
   ) {
-    _clang_disposeCXPlatformAvailability ??= _dylib.lookupFunction<
+    return (_clang_disposeCXPlatformAvailability ??= _dylib.lookupFunction<
             _c_clang_disposeCXPlatformAvailability,
             _dart_clang_disposeCXPlatformAvailability>(
-        'clang_disposeCXPlatformAvailability');
-    return _clang_disposeCXPlatformAvailability(
+        'clang_disposeCXPlatformAvailability'))(
       availability,
     );
   }
 
-  _dart_clang_disposeCXPlatformAvailability
+  _dart_clang_disposeCXPlatformAvailability?
       _clang_disposeCXPlatformAvailability;
 
   /// Creates an empty CXCursorSet.
   ffi.Pointer<CXCursorSetImpl> clang_createCXCursorSet() {
-    _clang_createCXCursorSet ??= _dylib.lookupFunction<
+    return (_clang_createCXCursorSet ??= _dylib.lookupFunction<
         _c_clang_createCXCursorSet,
-        _dart_clang_createCXCursorSet>('clang_createCXCursorSet');
-    return _clang_createCXCursorSet();
+        _dart_clang_createCXCursorSet>('clang_createCXCursorSet'))();
   }
 
-  _dart_clang_createCXCursorSet _clang_createCXCursorSet;
+  _dart_clang_createCXCursorSet? _clang_createCXCursorSet;
 
   /// Disposes a CXCursorSet and releases its associated memory.
   void clang_disposeCXCursorSet(
     ffi.Pointer<CXCursorSetImpl> cset,
   ) {
-    _clang_disposeCXCursorSet ??= _dylib.lookupFunction<
+    return (_clang_disposeCXCursorSet ??= _dylib.lookupFunction<
         _c_clang_disposeCXCursorSet,
-        _dart_clang_disposeCXCursorSet>('clang_disposeCXCursorSet');
-    return _clang_disposeCXCursorSet(
+        _dart_clang_disposeCXCursorSet>('clang_disposeCXCursorSet'))(
       cset,
     );
   }
 
-  _dart_clang_disposeCXCursorSet _clang_disposeCXCursorSet;
+  _dart_clang_disposeCXCursorSet? _clang_disposeCXCursorSet;
 
   /// Free the set of overridden cursors returned by
   /// clang_getOverriddenCursors().
   void clang_disposeOverriddenCursors(
     ffi.Pointer<CXCursor> overridden,
   ) {
-    _clang_disposeOverriddenCursors ??= _dylib.lookupFunction<
-        _c_clang_disposeOverriddenCursors,
-        _dart_clang_disposeOverriddenCursors>('clang_disposeOverriddenCursors');
-    return _clang_disposeOverriddenCursors(
+    return (_clang_disposeOverriddenCursors ??= _dylib.lookupFunction<
+            _c_clang_disposeOverriddenCursors,
+            _dart_clang_disposeOverriddenCursors>(
+        'clang_disposeOverriddenCursors'))(
       overridden,
     );
   }
 
-  _dart_clang_disposeOverriddenCursors _clang_disposeOverriddenCursors;
+  _dart_clang_disposeOverriddenCursors? _clang_disposeOverriddenCursors;
 
   /// Get a property value for the given printing policy.
   int clang_PrintingPolicy_getProperty(
     ffi.Pointer<ffi.Void> Policy,
     int Property,
   ) {
-    _clang_PrintingPolicy_getProperty ??= _dylib.lookupFunction<
+    return (_clang_PrintingPolicy_getProperty ??= _dylib.lookupFunction<
             _c_clang_PrintingPolicy_getProperty,
             _dart_clang_PrintingPolicy_getProperty>(
-        'clang_PrintingPolicy_getProperty');
-    return _clang_PrintingPolicy_getProperty(
+        'clang_PrintingPolicy_getProperty'))(
       Policy,
       Property,
     );
   }
 
-  _dart_clang_PrintingPolicy_getProperty _clang_PrintingPolicy_getProperty;
+  _dart_clang_PrintingPolicy_getProperty? _clang_PrintingPolicy_getProperty;
 
   /// Set a property value for the given printing policy.
   void clang_PrintingPolicy_setProperty(
@@ -1178,32 +1120,30 @@
     int Property,
     int Value,
   ) {
-    _clang_PrintingPolicy_setProperty ??= _dylib.lookupFunction<
+    return (_clang_PrintingPolicy_setProperty ??= _dylib.lookupFunction<
             _c_clang_PrintingPolicy_setProperty,
             _dart_clang_PrintingPolicy_setProperty>(
-        'clang_PrintingPolicy_setProperty');
-    return _clang_PrintingPolicy_setProperty(
+        'clang_PrintingPolicy_setProperty'))(
       Policy,
       Property,
       Value,
     );
   }
 
-  _dart_clang_PrintingPolicy_setProperty _clang_PrintingPolicy_setProperty;
+  _dart_clang_PrintingPolicy_setProperty? _clang_PrintingPolicy_setProperty;
 
   /// Release a printing policy.
   void clang_PrintingPolicy_dispose(
     ffi.Pointer<ffi.Void> Policy,
   ) {
-    _clang_PrintingPolicy_dispose ??= _dylib.lookupFunction<
+    return (_clang_PrintingPolicy_dispose ??= _dylib.lookupFunction<
         _c_clang_PrintingPolicy_dispose,
-        _dart_clang_PrintingPolicy_dispose>('clang_PrintingPolicy_dispose');
-    return _clang_PrintingPolicy_dispose(
+        _dart_clang_PrintingPolicy_dispose>('clang_PrintingPolicy_dispose'))(
       Policy,
     );
   }
 
-  _dart_clang_PrintingPolicy_dispose _clang_PrintingPolicy_dispose;
+  _dart_clang_PrintingPolicy_dispose? _clang_PrintingPolicy_dispose;
 
   /// Given a CXFile header file, return the module that contains it, if one
   /// exists.
@@ -1211,73 +1151,71 @@
     ffi.Pointer<CXTranslationUnitImpl> arg0,
     ffi.Pointer<ffi.Void> arg1,
   ) {
-    _clang_getModuleForFile ??= _dylib.lookupFunction<_c_clang_getModuleForFile,
-        _dart_clang_getModuleForFile>('clang_getModuleForFile');
-    return _clang_getModuleForFile(
+    return (_clang_getModuleForFile ??= _dylib.lookupFunction<
+        _c_clang_getModuleForFile,
+        _dart_clang_getModuleForFile>('clang_getModuleForFile'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_clang_getModuleForFile _clang_getModuleForFile;
+  _dart_clang_getModuleForFile? _clang_getModuleForFile;
 
   /// Returns the module file where the provided module object came from.
   ffi.Pointer<ffi.Void> clang_Module_getASTFile(
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_getASTFile ??= _dylib.lookupFunction<
+    return (_clang_Module_getASTFile ??= _dylib.lookupFunction<
         _c_clang_Module_getASTFile,
-        _dart_clang_Module_getASTFile>('clang_Module_getASTFile');
-    return _clang_Module_getASTFile(
+        _dart_clang_Module_getASTFile>('clang_Module_getASTFile'))(
       Module,
     );
   }
 
-  _dart_clang_Module_getASTFile _clang_Module_getASTFile;
+  _dart_clang_Module_getASTFile? _clang_Module_getASTFile;
 
   /// Returns the parent of a sub-module or NULL if the given module is
   /// top-level, e.g. for 'std.vector' it will return the 'std' module.
   ffi.Pointer<ffi.Void> clang_Module_getParent(
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_getParent ??= _dylib.lookupFunction<_c_clang_Module_getParent,
-        _dart_clang_Module_getParent>('clang_Module_getParent');
-    return _clang_Module_getParent(
+    return (_clang_Module_getParent ??= _dylib.lookupFunction<
+        _c_clang_Module_getParent,
+        _dart_clang_Module_getParent>('clang_Module_getParent'))(
       Module,
     );
   }
 
-  _dart_clang_Module_getParent _clang_Module_getParent;
+  _dart_clang_Module_getParent? _clang_Module_getParent;
 
   /// Returns non-zero if the module is a system one.
   int clang_Module_isSystem(
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_isSystem ??= _dylib.lookupFunction<_c_clang_Module_isSystem,
-        _dart_clang_Module_isSystem>('clang_Module_isSystem');
-    return _clang_Module_isSystem(
+    return (_clang_Module_isSystem ??= _dylib.lookupFunction<
+        _c_clang_Module_isSystem,
+        _dart_clang_Module_isSystem>('clang_Module_isSystem'))(
       Module,
     );
   }
 
-  _dart_clang_Module_isSystem _clang_Module_isSystem;
+  _dart_clang_Module_isSystem? _clang_Module_isSystem;
 
   /// Returns the number of top level headers associated with this module.
   int clang_Module_getNumTopLevelHeaders(
     ffi.Pointer<CXTranslationUnitImpl> arg0,
     ffi.Pointer<ffi.Void> Module,
   ) {
-    _clang_Module_getNumTopLevelHeaders ??= _dylib.lookupFunction<
+    return (_clang_Module_getNumTopLevelHeaders ??= _dylib.lookupFunction<
             _c_clang_Module_getNumTopLevelHeaders,
             _dart_clang_Module_getNumTopLevelHeaders>(
-        'clang_Module_getNumTopLevelHeaders');
-    return _clang_Module_getNumTopLevelHeaders(
+        'clang_Module_getNumTopLevelHeaders'))(
       arg0,
       Module,
     );
   }
 
-  _dart_clang_Module_getNumTopLevelHeaders _clang_Module_getNumTopLevelHeaders;
+  _dart_clang_Module_getNumTopLevelHeaders? _clang_Module_getNumTopLevelHeaders;
 
   /// Returns the specified top level header associated with the module.
   ffi.Pointer<ffi.Void> clang_Module_getTopLevelHeader(
@@ -1285,17 +1223,17 @@
     ffi.Pointer<ffi.Void> Module,
     int Index,
   ) {
-    _clang_Module_getTopLevelHeader ??= _dylib.lookupFunction<
-        _c_clang_Module_getTopLevelHeader,
-        _dart_clang_Module_getTopLevelHeader>('clang_Module_getTopLevelHeader');
-    return _clang_Module_getTopLevelHeader(
+    return (_clang_Module_getTopLevelHeader ??= _dylib.lookupFunction<
+            _c_clang_Module_getTopLevelHeader,
+            _dart_clang_Module_getTopLevelHeader>(
+        'clang_Module_getTopLevelHeader'))(
       arg0,
       Module,
       Index,
     );
   }
 
-  _dart_clang_Module_getTopLevelHeader _clang_Module_getTopLevelHeader;
+  _dart_clang_Module_getTopLevelHeader? _clang_Module_getTopLevelHeader;
 
   /// Annotate the given set of tokens by providing cursors for each token that
   /// can be mapped to a specific entity within the abstract syntax tree.
@@ -1305,9 +1243,9 @@
     int NumTokens,
     ffi.Pointer<CXCursor> Cursors,
   ) {
-    _clang_annotateTokens ??= _dylib.lookupFunction<_c_clang_annotateTokens,
-        _dart_clang_annotateTokens>('clang_annotateTokens');
-    return _clang_annotateTokens(
+    return (_clang_annotateTokens ??= _dylib.lookupFunction<
+        _c_clang_annotateTokens,
+        _dart_clang_annotateTokens>('clang_annotateTokens'))(
       TU,
       Tokens,
       NumTokens,
@@ -1315,7 +1253,7 @@
     );
   }
 
-  _dart_clang_annotateTokens _clang_annotateTokens;
+  _dart_clang_annotateTokens? _clang_annotateTokens;
 
   /// Free the given set of tokens.
   void clang_disposeTokens(
@@ -1323,57 +1261,55 @@
     ffi.Pointer<CXToken> Tokens,
     int NumTokens,
   ) {
-    _clang_disposeTokens ??= _dylib.lookupFunction<_c_clang_disposeTokens,
-        _dart_clang_disposeTokens>('clang_disposeTokens');
-    return _clang_disposeTokens(
+    return (_clang_disposeTokens ??= _dylib.lookupFunction<
+        _c_clang_disposeTokens,
+        _dart_clang_disposeTokens>('clang_disposeTokens'))(
       TU,
       Tokens,
       NumTokens,
     );
   }
 
-  _dart_clang_disposeTokens _clang_disposeTokens;
+  _dart_clang_disposeTokens? _clang_disposeTokens;
 
   void clang_enableStackTraces() {
-    _clang_enableStackTraces ??= _dylib.lookupFunction<
+    return (_clang_enableStackTraces ??= _dylib.lookupFunction<
         _c_clang_enableStackTraces,
-        _dart_clang_enableStackTraces>('clang_enableStackTraces');
-    return _clang_enableStackTraces();
+        _dart_clang_enableStackTraces>('clang_enableStackTraces'))();
   }
 
-  _dart_clang_enableStackTraces _clang_enableStackTraces;
+  _dart_clang_enableStackTraces? _clang_enableStackTraces;
 
   void clang_executeOnThread(
     ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
     ffi.Pointer<ffi.Void> user_data,
     int stack_size,
   ) {
-    _clang_executeOnThread ??= _dylib.lookupFunction<_c_clang_executeOnThread,
-        _dart_clang_executeOnThread>('clang_executeOnThread');
-    return _clang_executeOnThread(
+    return (_clang_executeOnThread ??= _dylib.lookupFunction<
+        _c_clang_executeOnThread,
+        _dart_clang_executeOnThread>('clang_executeOnThread'))(
       fn,
       user_data,
       stack_size,
     );
   }
 
-  _dart_clang_executeOnThread _clang_executeOnThread;
+  _dart_clang_executeOnThread? _clang_executeOnThread;
 
   /// Determine the kind of a particular chunk within a completion string.
   int clang_getCompletionChunkKind(
     ffi.Pointer<ffi.Void> completion_string,
     int chunk_number,
   ) {
-    _clang_getCompletionChunkKind ??= _dylib.lookupFunction<
+    return (_clang_getCompletionChunkKind ??= _dylib.lookupFunction<
         _c_clang_getCompletionChunkKind,
-        _dart_clang_getCompletionChunkKind>('clang_getCompletionChunkKind');
-    return _clang_getCompletionChunkKind(
+        _dart_clang_getCompletionChunkKind>('clang_getCompletionChunkKind'))(
       completion_string,
       chunk_number,
     );
   }
 
-  _dart_clang_getCompletionChunkKind _clang_getCompletionChunkKind;
+  _dart_clang_getCompletionChunkKind? _clang_getCompletionChunkKind;
 
   /// Retrieve the completion string associated with a particular chunk within a
   /// completion string.
@@ -1381,106 +1317,99 @@
     ffi.Pointer<ffi.Void> completion_string,
     int chunk_number,
   ) {
-    _clang_getCompletionChunkCompletionString ??= _dylib.lookupFunction<
+    return (_clang_getCompletionChunkCompletionString ??= _dylib.lookupFunction<
             _c_clang_getCompletionChunkCompletionString,
             _dart_clang_getCompletionChunkCompletionString>(
-        'clang_getCompletionChunkCompletionString');
-    return _clang_getCompletionChunkCompletionString(
+        'clang_getCompletionChunkCompletionString'))(
       completion_string,
       chunk_number,
     );
   }
 
-  _dart_clang_getCompletionChunkCompletionString
+  _dart_clang_getCompletionChunkCompletionString?
       _clang_getCompletionChunkCompletionString;
 
   /// Retrieve the number of chunks in the given code-completion string.
   int clang_getNumCompletionChunks(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getNumCompletionChunks ??= _dylib.lookupFunction<
+    return (_clang_getNumCompletionChunks ??= _dylib.lookupFunction<
         _c_clang_getNumCompletionChunks,
-        _dart_clang_getNumCompletionChunks>('clang_getNumCompletionChunks');
-    return _clang_getNumCompletionChunks(
+        _dart_clang_getNumCompletionChunks>('clang_getNumCompletionChunks'))(
       completion_string,
     );
   }
 
-  _dart_clang_getNumCompletionChunks _clang_getNumCompletionChunks;
+  _dart_clang_getNumCompletionChunks? _clang_getNumCompletionChunks;
 
   /// Determine the priority of this code completion.
   int clang_getCompletionPriority(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getCompletionPriority ??= _dylib.lookupFunction<
+    return (_clang_getCompletionPriority ??= _dylib.lookupFunction<
         _c_clang_getCompletionPriority,
-        _dart_clang_getCompletionPriority>('clang_getCompletionPriority');
-    return _clang_getCompletionPriority(
+        _dart_clang_getCompletionPriority>('clang_getCompletionPriority'))(
       completion_string,
     );
   }
 
-  _dart_clang_getCompletionPriority _clang_getCompletionPriority;
+  _dart_clang_getCompletionPriority? _clang_getCompletionPriority;
 
   /// Determine the availability of the entity that this code-completion string
   /// refers to.
   int clang_getCompletionAvailability(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getCompletionAvailability ??= _dylib.lookupFunction<
+    return (_clang_getCompletionAvailability ??= _dylib.lookupFunction<
             _c_clang_getCompletionAvailability,
             _dart_clang_getCompletionAvailability>(
-        'clang_getCompletionAvailability');
-    return _clang_getCompletionAvailability(
+        'clang_getCompletionAvailability'))(
       completion_string,
     );
   }
 
-  _dart_clang_getCompletionAvailability _clang_getCompletionAvailability;
+  _dart_clang_getCompletionAvailability? _clang_getCompletionAvailability;
 
   /// Retrieve the number of annotations associated with the given completion
   /// string.
   int clang_getCompletionNumAnnotations(
     ffi.Pointer<ffi.Void> completion_string,
   ) {
-    _clang_getCompletionNumAnnotations ??= _dylib.lookupFunction<
+    return (_clang_getCompletionNumAnnotations ??= _dylib.lookupFunction<
             _c_clang_getCompletionNumAnnotations,
             _dart_clang_getCompletionNumAnnotations>(
-        'clang_getCompletionNumAnnotations');
-    return _clang_getCompletionNumAnnotations(
+        'clang_getCompletionNumAnnotations'))(
       completion_string,
     );
   }
 
-  _dart_clang_getCompletionNumAnnotations _clang_getCompletionNumAnnotations;
+  _dart_clang_getCompletionNumAnnotations? _clang_getCompletionNumAnnotations;
 
   /// Retrieve the number of fix-its for the given completion index.
   int clang_getCompletionNumFixIts(
     ffi.Pointer<CXCodeCompleteResults> results,
     int completion_index,
   ) {
-    _clang_getCompletionNumFixIts ??= _dylib.lookupFunction<
+    return (_clang_getCompletionNumFixIts ??= _dylib.lookupFunction<
         _c_clang_getCompletionNumFixIts,
-        _dart_clang_getCompletionNumFixIts>('clang_getCompletionNumFixIts');
-    return _clang_getCompletionNumFixIts(
+        _dart_clang_getCompletionNumFixIts>('clang_getCompletionNumFixIts'))(
       results,
       completion_index,
     );
   }
 
-  _dart_clang_getCompletionNumFixIts _clang_getCompletionNumFixIts;
+  _dart_clang_getCompletionNumFixIts? _clang_getCompletionNumFixIts;
 
   /// Returns a default set of code-completion options that can be passed to
   /// clang_codeCompleteAt().
   int clang_defaultCodeCompleteOptions() {
-    _clang_defaultCodeCompleteOptions ??= _dylib.lookupFunction<
+    return (_clang_defaultCodeCompleteOptions ??= _dylib.lookupFunction<
             _c_clang_defaultCodeCompleteOptions,
             _dart_clang_defaultCodeCompleteOptions>(
-        'clang_defaultCodeCompleteOptions');
-    return _clang_defaultCodeCompleteOptions();
+        'clang_defaultCodeCompleteOptions'))();
   }
 
-  _dart_clang_defaultCodeCompleteOptions _clang_defaultCodeCompleteOptions;
+  _dart_clang_defaultCodeCompleteOptions? _clang_defaultCodeCompleteOptions;
 
   /// Perform code completion at a given location in a translation unit.
   ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
@@ -1492,9 +1421,9 @@
     int num_unsaved_files,
     int options,
   ) {
-    _clang_codeCompleteAt ??= _dylib.lookupFunction<_c_clang_codeCompleteAt,
-        _dart_clang_codeCompleteAt>('clang_codeCompleteAt');
-    return _clang_codeCompleteAt(
+    return (_clang_codeCompleteAt ??= _dylib.lookupFunction<
+        _c_clang_codeCompleteAt,
+        _dart_clang_codeCompleteAt>('clang_codeCompleteAt'))(
       TU,
       complete_filename,
       complete_line,
@@ -1505,55 +1434,52 @@
     );
   }
 
-  _dart_clang_codeCompleteAt _clang_codeCompleteAt;
+  _dart_clang_codeCompleteAt? _clang_codeCompleteAt;
 
   /// Sort the code-completion results in case-insensitive alphabetical order.
   void clang_sortCodeCompletionResults(
     ffi.Pointer<CXCompletionResult> Results,
     int NumResults,
   ) {
-    _clang_sortCodeCompletionResults ??= _dylib.lookupFunction<
+    return (_clang_sortCodeCompletionResults ??= _dylib.lookupFunction<
             _c_clang_sortCodeCompletionResults,
             _dart_clang_sortCodeCompletionResults>(
-        'clang_sortCodeCompletionResults');
-    return _clang_sortCodeCompletionResults(
+        'clang_sortCodeCompletionResults'))(
       Results,
       NumResults,
     );
   }
 
-  _dart_clang_sortCodeCompletionResults _clang_sortCodeCompletionResults;
+  _dart_clang_sortCodeCompletionResults? _clang_sortCodeCompletionResults;
 
   /// Free the given set of code-completion results.
   void clang_disposeCodeCompleteResults(
     ffi.Pointer<CXCodeCompleteResults> Results,
   ) {
-    _clang_disposeCodeCompleteResults ??= _dylib.lookupFunction<
+    return (_clang_disposeCodeCompleteResults ??= _dylib.lookupFunction<
             _c_clang_disposeCodeCompleteResults,
             _dart_clang_disposeCodeCompleteResults>(
-        'clang_disposeCodeCompleteResults');
-    return _clang_disposeCodeCompleteResults(
+        'clang_disposeCodeCompleteResults'))(
       Results,
     );
   }
 
-  _dart_clang_disposeCodeCompleteResults _clang_disposeCodeCompleteResults;
+  _dart_clang_disposeCodeCompleteResults? _clang_disposeCodeCompleteResults;
 
   /// Determine the number of diagnostics produced prior to the location where
   /// code completion was performed.
   int clang_codeCompleteGetNumDiagnostics(
     ffi.Pointer<CXCodeCompleteResults> Results,
   ) {
-    _clang_codeCompleteGetNumDiagnostics ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetNumDiagnostics ??= _dylib.lookupFunction<
             _c_clang_codeCompleteGetNumDiagnostics,
             _dart_clang_codeCompleteGetNumDiagnostics>(
-        'clang_codeCompleteGetNumDiagnostics');
-    return _clang_codeCompleteGetNumDiagnostics(
+        'clang_codeCompleteGetNumDiagnostics'))(
       Results,
     );
   }
 
-  _dart_clang_codeCompleteGetNumDiagnostics
+  _dart_clang_codeCompleteGetNumDiagnostics?
       _clang_codeCompleteGetNumDiagnostics;
 
   /// Retrieve a diagnostic associated with the given code completion.
@@ -1561,32 +1487,30 @@
     ffi.Pointer<CXCodeCompleteResults> Results,
     int Index,
   ) {
-    _clang_codeCompleteGetDiagnostic ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetDiagnostic ??= _dylib.lookupFunction<
             _c_clang_codeCompleteGetDiagnostic,
             _dart_clang_codeCompleteGetDiagnostic>(
-        'clang_codeCompleteGetDiagnostic');
-    return _clang_codeCompleteGetDiagnostic(
+        'clang_codeCompleteGetDiagnostic'))(
       Results,
       Index,
     );
   }
 
-  _dart_clang_codeCompleteGetDiagnostic _clang_codeCompleteGetDiagnostic;
+  _dart_clang_codeCompleteGetDiagnostic? _clang_codeCompleteGetDiagnostic;
 
   /// Determines what completions are appropriate for the context the given code
   /// completion.
   int clang_codeCompleteGetContexts(
     ffi.Pointer<CXCodeCompleteResults> Results,
   ) {
-    _clang_codeCompleteGetContexts ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetContexts ??= _dylib.lookupFunction<
         _c_clang_codeCompleteGetContexts,
-        _dart_clang_codeCompleteGetContexts>('clang_codeCompleteGetContexts');
-    return _clang_codeCompleteGetContexts(
+        _dart_clang_codeCompleteGetContexts>('clang_codeCompleteGetContexts'))(
       Results,
     );
   }
 
-  _dart_clang_codeCompleteGetContexts _clang_codeCompleteGetContexts;
+  _dart_clang_codeCompleteGetContexts? _clang_codeCompleteGetContexts;
 
   /// Returns the cursor kind for the container for the current code completion
   /// context. The container is only guaranteed to be set for contexts where a
@@ -1596,31 +1520,29 @@
     ffi.Pointer<CXCodeCompleteResults> Results,
     ffi.Pointer<ffi.Uint32> IsIncomplete,
   ) {
-    _clang_codeCompleteGetContainerKind ??= _dylib.lookupFunction<
+    return (_clang_codeCompleteGetContainerKind ??= _dylib.lookupFunction<
             _c_clang_codeCompleteGetContainerKind,
             _dart_clang_codeCompleteGetContainerKind>(
-        'clang_codeCompleteGetContainerKind');
-    return _clang_codeCompleteGetContainerKind(
+        'clang_codeCompleteGetContainerKind'))(
       Results,
       IsIncomplete,
     );
   }
 
-  _dart_clang_codeCompleteGetContainerKind _clang_codeCompleteGetContainerKind;
+  _dart_clang_codeCompleteGetContainerKind? _clang_codeCompleteGetContainerKind;
 
   /// Enable/disable crash recovery.
   void clang_toggleCrashRecovery(
     int isEnabled,
   ) {
-    _clang_toggleCrashRecovery ??= _dylib.lookupFunction<
+    return (_clang_toggleCrashRecovery ??= _dylib.lookupFunction<
         _c_clang_toggleCrashRecovery,
-        _dart_clang_toggleCrashRecovery>('clang_toggleCrashRecovery');
-    return _clang_toggleCrashRecovery(
+        _dart_clang_toggleCrashRecovery>('clang_toggleCrashRecovery'))(
       isEnabled,
     );
   }
 
-  _dart_clang_toggleCrashRecovery _clang_toggleCrashRecovery;
+  _dart_clang_toggleCrashRecovery? _clang_toggleCrashRecovery;
 
   /// Visit the set of preprocessor inclusions in a translation unit. The
   /// visitor function is called with the provided data for every included file.
@@ -1631,44 +1553,42 @@
     ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor>> visitor,
     ffi.Pointer<ffi.Void> client_data,
   ) {
-    _clang_getInclusions ??= _dylib.lookupFunction<_c_clang_getInclusions,
-        _dart_clang_getInclusions>('clang_getInclusions');
-    return _clang_getInclusions(
+    return (_clang_getInclusions ??= _dylib.lookupFunction<
+        _c_clang_getInclusions,
+        _dart_clang_getInclusions>('clang_getInclusions'))(
       tu,
       visitor,
       client_data,
     );
   }
 
-  _dart_clang_getInclusions _clang_getInclusions;
+  _dart_clang_getInclusions? _clang_getInclusions;
 
   /// Returns the kind of the evaluated result.
   int clang_EvalResult_getKind(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getKind ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getKind ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getKind,
-        _dart_clang_EvalResult_getKind>('clang_EvalResult_getKind');
-    return _clang_EvalResult_getKind(
+        _dart_clang_EvalResult_getKind>('clang_EvalResult_getKind'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getKind _clang_EvalResult_getKind;
+  _dart_clang_EvalResult_getKind? _clang_EvalResult_getKind;
 
   /// Returns the evaluation result as integer if the kind is Int.
   int clang_EvalResult_getAsInt(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsInt ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getAsInt ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsInt,
-        _dart_clang_EvalResult_getAsInt>('clang_EvalResult_getAsInt');
-    return _clang_EvalResult_getAsInt(
+        _dart_clang_EvalResult_getAsInt>('clang_EvalResult_getAsInt'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsInt _clang_EvalResult_getAsInt;
+  _dart_clang_EvalResult_getAsInt? _clang_EvalResult_getAsInt;
 
   /// Returns the evaluation result as a long long integer if the kind is Int.
   /// This prevents overflows that may happen if the result is returned with
@@ -1676,59 +1596,58 @@
   int clang_EvalResult_getAsLongLong(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsLongLong ??= _dylib.lookupFunction<
-        _c_clang_EvalResult_getAsLongLong,
-        _dart_clang_EvalResult_getAsLongLong>('clang_EvalResult_getAsLongLong');
-    return _clang_EvalResult_getAsLongLong(
+    return (_clang_EvalResult_getAsLongLong ??= _dylib.lookupFunction<
+            _c_clang_EvalResult_getAsLongLong,
+            _dart_clang_EvalResult_getAsLongLong>(
+        'clang_EvalResult_getAsLongLong'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsLongLong _clang_EvalResult_getAsLongLong;
+  _dart_clang_EvalResult_getAsLongLong? _clang_EvalResult_getAsLongLong;
 
   /// Returns a non-zero value if the kind is Int and the evaluation result
   /// resulted in an unsigned integer.
   int clang_EvalResult_isUnsignedInt(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_isUnsignedInt ??= _dylib.lookupFunction<
-        _c_clang_EvalResult_isUnsignedInt,
-        _dart_clang_EvalResult_isUnsignedInt>('clang_EvalResult_isUnsignedInt');
-    return _clang_EvalResult_isUnsignedInt(
+    return (_clang_EvalResult_isUnsignedInt ??= _dylib.lookupFunction<
+            _c_clang_EvalResult_isUnsignedInt,
+            _dart_clang_EvalResult_isUnsignedInt>(
+        'clang_EvalResult_isUnsignedInt'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_isUnsignedInt _clang_EvalResult_isUnsignedInt;
+  _dart_clang_EvalResult_isUnsignedInt? _clang_EvalResult_isUnsignedInt;
 
   /// Returns the evaluation result as an unsigned integer if the kind is Int
   /// and clang_EvalResult_isUnsignedInt is non-zero.
   int clang_EvalResult_getAsUnsigned(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsUnsigned ??= _dylib.lookupFunction<
-        _c_clang_EvalResult_getAsUnsigned,
-        _dart_clang_EvalResult_getAsUnsigned>('clang_EvalResult_getAsUnsigned');
-    return _clang_EvalResult_getAsUnsigned(
+    return (_clang_EvalResult_getAsUnsigned ??= _dylib.lookupFunction<
+            _c_clang_EvalResult_getAsUnsigned,
+            _dart_clang_EvalResult_getAsUnsigned>(
+        'clang_EvalResult_getAsUnsigned'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsUnsigned _clang_EvalResult_getAsUnsigned;
+  _dart_clang_EvalResult_getAsUnsigned? _clang_EvalResult_getAsUnsigned;
 
   /// Returns the evaluation result as double if the kind is double.
   double clang_EvalResult_getAsDouble(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsDouble ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getAsDouble ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsDouble,
-        _dart_clang_EvalResult_getAsDouble>('clang_EvalResult_getAsDouble');
-    return _clang_EvalResult_getAsDouble(
+        _dart_clang_EvalResult_getAsDouble>('clang_EvalResult_getAsDouble'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsDouble _clang_EvalResult_getAsDouble;
+  _dart_clang_EvalResult_getAsDouble? _clang_EvalResult_getAsDouble;
 
   /// Returns the evaluation result as a constant string if the kind is other
   /// than Int or float. User must not free this pointer, instead call
@@ -1737,73 +1656,69 @@
   ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_getAsStr ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_getAsStr ??= _dylib.lookupFunction<
         _c_clang_EvalResult_getAsStr,
-        _dart_clang_EvalResult_getAsStr>('clang_EvalResult_getAsStr');
-    return _clang_EvalResult_getAsStr(
+        _dart_clang_EvalResult_getAsStr>('clang_EvalResult_getAsStr'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_getAsStr _clang_EvalResult_getAsStr;
+  _dart_clang_EvalResult_getAsStr? _clang_EvalResult_getAsStr;
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
     ffi.Pointer<ffi.Void> E,
   ) {
-    _clang_EvalResult_dispose ??= _dylib.lookupFunction<
+    return (_clang_EvalResult_dispose ??= _dylib.lookupFunction<
         _c_clang_EvalResult_dispose,
-        _dart_clang_EvalResult_dispose>('clang_EvalResult_dispose');
-    return _clang_EvalResult_dispose(
+        _dart_clang_EvalResult_dispose>('clang_EvalResult_dispose'))(
       E,
     );
   }
 
-  _dart_clang_EvalResult_dispose _clang_EvalResult_dispose;
+  _dart_clang_EvalResult_dispose? _clang_EvalResult_dispose;
 
   /// Retrieve a remapping.
   ffi.Pointer<ffi.Void> clang_getRemappings(
     ffi.Pointer<ffi.Int8> path,
   ) {
-    _clang_getRemappings ??= _dylib.lookupFunction<_c_clang_getRemappings,
-        _dart_clang_getRemappings>('clang_getRemappings');
-    return _clang_getRemappings(
+    return (_clang_getRemappings ??= _dylib.lookupFunction<
+        _c_clang_getRemappings,
+        _dart_clang_getRemappings>('clang_getRemappings'))(
       path,
     );
   }
 
-  _dart_clang_getRemappings _clang_getRemappings;
+  _dart_clang_getRemappings? _clang_getRemappings;
 
   /// Retrieve a remapping.
   ffi.Pointer<ffi.Void> clang_getRemappingsFromFileList(
     ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
     int numFiles,
   ) {
-    _clang_getRemappingsFromFileList ??= _dylib.lookupFunction<
+    return (_clang_getRemappingsFromFileList ??= _dylib.lookupFunction<
             _c_clang_getRemappingsFromFileList,
             _dart_clang_getRemappingsFromFileList>(
-        'clang_getRemappingsFromFileList');
-    return _clang_getRemappingsFromFileList(
+        'clang_getRemappingsFromFileList'))(
       filePaths,
       numFiles,
     );
   }
 
-  _dart_clang_getRemappingsFromFileList _clang_getRemappingsFromFileList;
+  _dart_clang_getRemappingsFromFileList? _clang_getRemappingsFromFileList;
 
   /// Determine the number of remappings.
   int clang_remap_getNumFiles(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_remap_getNumFiles ??= _dylib.lookupFunction<
+    return (_clang_remap_getNumFiles ??= _dylib.lookupFunction<
         _c_clang_remap_getNumFiles,
-        _dart_clang_remap_getNumFiles>('clang_remap_getNumFiles');
-    return _clang_remap_getNumFiles(
+        _dart_clang_remap_getNumFiles>('clang_remap_getNumFiles'))(
       arg0,
     );
   }
 
-  _dart_clang_remap_getNumFiles _clang_remap_getNumFiles;
+  _dart_clang_remap_getNumFiles? _clang_remap_getNumFiles;
 
   /// Get the original and the associated filename from the remapping.
   void clang_remap_getFilenames(
@@ -1812,10 +1727,9 @@
     ffi.Pointer<CXString> original,
     ffi.Pointer<CXString> transformed,
   ) {
-    _clang_remap_getFilenames ??= _dylib.lookupFunction<
+    return (_clang_remap_getFilenames ??= _dylib.lookupFunction<
         _c_clang_remap_getFilenames,
-        _dart_clang_remap_getFilenames>('clang_remap_getFilenames');
-    return _clang_remap_getFilenames(
+        _dart_clang_remap_getFilenames>('clang_remap_getFilenames'))(
       arg0,
       index,
       original,
@@ -1823,230 +1737,218 @@
     );
   }
 
-  _dart_clang_remap_getFilenames _clang_remap_getFilenames;
+  _dart_clang_remap_getFilenames? _clang_remap_getFilenames;
 
   /// Dispose the remapping.
   void clang_remap_dispose(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_remap_dispose ??= _dylib.lookupFunction<_c_clang_remap_dispose,
-        _dart_clang_remap_dispose>('clang_remap_dispose');
-    return _clang_remap_dispose(
+    return (_clang_remap_dispose ??= _dylib.lookupFunction<
+        _c_clang_remap_dispose,
+        _dart_clang_remap_dispose>('clang_remap_dispose'))(
       arg0,
     );
   }
 
-  _dart_clang_remap_dispose _clang_remap_dispose;
+  _dart_clang_remap_dispose? _clang_remap_dispose;
 
   int clang_index_isEntityObjCContainerKind(
     int arg0,
   ) {
-    _clang_index_isEntityObjCContainerKind ??= _dylib.lookupFunction<
+    return (_clang_index_isEntityObjCContainerKind ??= _dylib.lookupFunction<
             _c_clang_index_isEntityObjCContainerKind,
             _dart_clang_index_isEntityObjCContainerKind>(
-        'clang_index_isEntityObjCContainerKind');
-    return _clang_index_isEntityObjCContainerKind(
+        'clang_index_isEntityObjCContainerKind'))(
       arg0,
     );
   }
 
-  _dart_clang_index_isEntityObjCContainerKind
+  _dart_clang_index_isEntityObjCContainerKind?
       _clang_index_isEntityObjCContainerKind;
 
   ffi.Pointer<CXIdxObjCContainerDeclInfo> clang_index_getObjCContainerDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCContainerDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCContainerDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCContainerDeclInfo,
             _dart_clang_index_getObjCContainerDeclInfo>(
-        'clang_index_getObjCContainerDeclInfo');
-    return _clang_index_getObjCContainerDeclInfo(
+        'clang_index_getObjCContainerDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCContainerDeclInfo
+  _dart_clang_index_getObjCContainerDeclInfo?
       _clang_index_getObjCContainerDeclInfo;
 
   ffi.Pointer<CXIdxObjCInterfaceDeclInfo> clang_index_getObjCInterfaceDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCInterfaceDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCInterfaceDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCInterfaceDeclInfo,
             _dart_clang_index_getObjCInterfaceDeclInfo>(
-        'clang_index_getObjCInterfaceDeclInfo');
-    return _clang_index_getObjCInterfaceDeclInfo(
+        'clang_index_getObjCInterfaceDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCInterfaceDeclInfo
+  _dart_clang_index_getObjCInterfaceDeclInfo?
       _clang_index_getObjCInterfaceDeclInfo;
 
   ffi.Pointer<CXIdxObjCCategoryDeclInfo> clang_index_getObjCCategoryDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCCategoryDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCCategoryDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCCategoryDeclInfo,
             _dart_clang_index_getObjCCategoryDeclInfo>(
-        'clang_index_getObjCCategoryDeclInfo');
-    return _clang_index_getObjCCategoryDeclInfo(
+        'clang_index_getObjCCategoryDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCCategoryDeclInfo
+  _dart_clang_index_getObjCCategoryDeclInfo?
       _clang_index_getObjCCategoryDeclInfo;
 
   ffi.Pointer<CXIdxObjCProtocolRefListInfo>
       clang_index_getObjCProtocolRefListInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCProtocolRefListInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCProtocolRefListInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCProtocolRefListInfo,
             _dart_clang_index_getObjCProtocolRefListInfo>(
-        'clang_index_getObjCProtocolRefListInfo');
-    return _clang_index_getObjCProtocolRefListInfo(
+        'clang_index_getObjCProtocolRefListInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCProtocolRefListInfo
+  _dart_clang_index_getObjCProtocolRefListInfo?
       _clang_index_getObjCProtocolRefListInfo;
 
   ffi.Pointer<CXIdxObjCPropertyDeclInfo> clang_index_getObjCPropertyDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getObjCPropertyDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getObjCPropertyDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getObjCPropertyDeclInfo,
             _dart_clang_index_getObjCPropertyDeclInfo>(
-        'clang_index_getObjCPropertyDeclInfo');
-    return _clang_index_getObjCPropertyDeclInfo(
+        'clang_index_getObjCPropertyDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getObjCPropertyDeclInfo
+  _dart_clang_index_getObjCPropertyDeclInfo?
       _clang_index_getObjCPropertyDeclInfo;
 
   ffi.Pointer<CXIdxIBOutletCollectionAttrInfo>
       clang_index_getIBOutletCollectionAttrInfo(
     ffi.Pointer<CXIdxAttrInfo> arg0,
   ) {
-    _clang_index_getIBOutletCollectionAttrInfo ??= _dylib.lookupFunction<
-            _c_clang_index_getIBOutletCollectionAttrInfo,
-            _dart_clang_index_getIBOutletCollectionAttrInfo>(
-        'clang_index_getIBOutletCollectionAttrInfo');
-    return _clang_index_getIBOutletCollectionAttrInfo(
+    return (_clang_index_getIBOutletCollectionAttrInfo ??=
+        _dylib.lookupFunction<_c_clang_index_getIBOutletCollectionAttrInfo,
+                _dart_clang_index_getIBOutletCollectionAttrInfo>(
+            'clang_index_getIBOutletCollectionAttrInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getIBOutletCollectionAttrInfo
+  _dart_clang_index_getIBOutletCollectionAttrInfo?
       _clang_index_getIBOutletCollectionAttrInfo;
 
   ffi.Pointer<CXIdxCXXClassDeclInfo> clang_index_getCXXClassDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
   ) {
-    _clang_index_getCXXClassDeclInfo ??= _dylib.lookupFunction<
+    return (_clang_index_getCXXClassDeclInfo ??= _dylib.lookupFunction<
             _c_clang_index_getCXXClassDeclInfo,
             _dart_clang_index_getCXXClassDeclInfo>(
-        'clang_index_getCXXClassDeclInfo');
-    return _clang_index_getCXXClassDeclInfo(
+        'clang_index_getCXXClassDeclInfo'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getCXXClassDeclInfo _clang_index_getCXXClassDeclInfo;
+  _dart_clang_index_getCXXClassDeclInfo? _clang_index_getCXXClassDeclInfo;
 
   /// For retrieving a custom CXIdxClientContainer attached to a container.
   ffi.Pointer<ffi.Void> clang_index_getClientContainer(
     ffi.Pointer<CXIdxContainerInfo> arg0,
   ) {
-    _clang_index_getClientContainer ??= _dylib.lookupFunction<
-        _c_clang_index_getClientContainer,
-        _dart_clang_index_getClientContainer>('clang_index_getClientContainer');
-    return _clang_index_getClientContainer(
+    return (_clang_index_getClientContainer ??= _dylib.lookupFunction<
+            _c_clang_index_getClientContainer,
+            _dart_clang_index_getClientContainer>(
+        'clang_index_getClientContainer'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getClientContainer _clang_index_getClientContainer;
+  _dart_clang_index_getClientContainer? _clang_index_getClientContainer;
 
   /// For setting a custom CXIdxClientContainer attached to a container.
   void clang_index_setClientContainer(
     ffi.Pointer<CXIdxContainerInfo> arg0,
     ffi.Pointer<ffi.Void> arg1,
   ) {
-    _clang_index_setClientContainer ??= _dylib.lookupFunction<
-        _c_clang_index_setClientContainer,
-        _dart_clang_index_setClientContainer>('clang_index_setClientContainer');
-    return _clang_index_setClientContainer(
+    return (_clang_index_setClientContainer ??= _dylib.lookupFunction<
+            _c_clang_index_setClientContainer,
+            _dart_clang_index_setClientContainer>(
+        'clang_index_setClientContainer'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_clang_index_setClientContainer _clang_index_setClientContainer;
+  _dart_clang_index_setClientContainer? _clang_index_setClientContainer;
 
   /// For retrieving a custom CXIdxClientEntity attached to an entity.
   ffi.Pointer<ffi.Void> clang_index_getClientEntity(
     ffi.Pointer<CXIdxEntityInfo> arg0,
   ) {
-    _clang_index_getClientEntity ??= _dylib.lookupFunction<
+    return (_clang_index_getClientEntity ??= _dylib.lookupFunction<
         _c_clang_index_getClientEntity,
-        _dart_clang_index_getClientEntity>('clang_index_getClientEntity');
-    return _clang_index_getClientEntity(
+        _dart_clang_index_getClientEntity>('clang_index_getClientEntity'))(
       arg0,
     );
   }
 
-  _dart_clang_index_getClientEntity _clang_index_getClientEntity;
+  _dart_clang_index_getClientEntity? _clang_index_getClientEntity;
 
   /// For setting a custom CXIdxClientEntity attached to an entity.
   void clang_index_setClientEntity(
     ffi.Pointer<CXIdxEntityInfo> arg0,
     ffi.Pointer<ffi.Void> arg1,
   ) {
-    _clang_index_setClientEntity ??= _dylib.lookupFunction<
+    return (_clang_index_setClientEntity ??= _dylib.lookupFunction<
         _c_clang_index_setClientEntity,
-        _dart_clang_index_setClientEntity>('clang_index_setClientEntity');
-    return _clang_index_setClientEntity(
+        _dart_clang_index_setClientEntity>('clang_index_setClientEntity'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_clang_index_setClientEntity _clang_index_setClientEntity;
+  _dart_clang_index_setClientEntity? _clang_index_setClientEntity;
 
   /// An indexing action/session, to be applied to one or multiple translation
   /// units.
   ffi.Pointer<ffi.Void> clang_IndexAction_create(
     ffi.Pointer<ffi.Void> CIdx,
   ) {
-    _clang_IndexAction_create ??= _dylib.lookupFunction<
+    return (_clang_IndexAction_create ??= _dylib.lookupFunction<
         _c_clang_IndexAction_create,
-        _dart_clang_IndexAction_create>('clang_IndexAction_create');
-    return _clang_IndexAction_create(
+        _dart_clang_IndexAction_create>('clang_IndexAction_create'))(
       CIdx,
     );
   }
 
-  _dart_clang_IndexAction_create _clang_IndexAction_create;
+  _dart_clang_IndexAction_create? _clang_IndexAction_create;
 
   /// Destroy the given index action.
   void clang_IndexAction_dispose(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _clang_IndexAction_dispose ??= _dylib.lookupFunction<
+    return (_clang_IndexAction_dispose ??= _dylib.lookupFunction<
         _c_clang_IndexAction_dispose,
-        _dart_clang_IndexAction_dispose>('clang_IndexAction_dispose');
-    return _clang_IndexAction_dispose(
+        _dart_clang_IndexAction_dispose>('clang_IndexAction_dispose'))(
       arg0,
     );
   }
 
-  _dart_clang_IndexAction_dispose _clang_IndexAction_dispose;
+  _dart_clang_IndexAction_dispose? _clang_IndexAction_dispose;
 
   /// Index the given source file and the translation unit corresponding to that
   /// file via callbacks implemented through #IndexerCallbacks.
@@ -2064,9 +1966,9 @@
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
     int TU_options,
   ) {
-    _clang_indexSourceFile ??= _dylib.lookupFunction<_c_clang_indexSourceFile,
-        _dart_clang_indexSourceFile>('clang_indexSourceFile');
-    return _clang_indexSourceFile(
+    return (_clang_indexSourceFile ??= _dylib.lookupFunction<
+        _c_clang_indexSourceFile,
+        _dart_clang_indexSourceFile>('clang_indexSourceFile'))(
       arg0,
       client_data,
       index_callbacks,
@@ -2082,7 +1984,7 @@
     );
   }
 
-  _dart_clang_indexSourceFile _clang_indexSourceFile;
+  _dart_clang_indexSourceFile? _clang_indexSourceFile;
 
   /// Same as clang_indexSourceFile but requires a full command line for
   /// command_line_args including argv[0]. This is useful if the standard
@@ -2101,10 +2003,9 @@
     ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
     int TU_options,
   ) {
-    _clang_indexSourceFileFullArgv ??= _dylib.lookupFunction<
+    return (_clang_indexSourceFileFullArgv ??= _dylib.lookupFunction<
         _c_clang_indexSourceFileFullArgv,
-        _dart_clang_indexSourceFileFullArgv>('clang_indexSourceFileFullArgv');
-    return _clang_indexSourceFileFullArgv(
+        _dart_clang_indexSourceFileFullArgv>('clang_indexSourceFileFullArgv'))(
       arg0,
       client_data,
       index_callbacks,
@@ -2120,7 +2021,7 @@
     );
   }
 
-  _dart_clang_indexSourceFileFullArgv _clang_indexSourceFileFullArgv;
+  _dart_clang_indexSourceFileFullArgv? _clang_indexSourceFileFullArgv;
 
   /// Index the given translation unit via callbacks implemented through
   /// #IndexerCallbacks.
@@ -2132,10 +2033,9 @@
     int index_options,
     ffi.Pointer<CXTranslationUnitImpl> arg5,
   ) {
-    _clang_indexTranslationUnit ??= _dylib.lookupFunction<
+    return (_clang_indexTranslationUnit ??= _dylib.lookupFunction<
         _c_clang_indexTranslationUnit,
-        _dart_clang_indexTranslationUnit>('clang_indexTranslationUnit');
-    return _clang_indexTranslationUnit(
+        _dart_clang_indexTranslationUnit>('clang_indexTranslationUnit'))(
       arg0,
       client_data,
       index_callbacks,
@@ -2145,7 +2045,7 @@
     );
   }
 
-  _dart_clang_indexTranslationUnit _clang_indexTranslationUnit;
+  _dart_clang_indexTranslationUnit? _clang_indexTranslationUnit;
 }
 
 /// Error codes returned by libclang routines.
@@ -2168,17 +2068,17 @@
 
 /// A character string.
 class CXString extends ffi.Struct {
-  ffi.Pointer<ffi.Void> data;
+  external ffi.Pointer<ffi.Void> data;
 
   @ffi.Uint32()
-  int private_flags;
+  external int private_flags;
 }
 
 class CXStringSet extends ffi.Struct {
-  ffi.Pointer<CXString> Strings;
+  external ffi.Pointer<CXString> Strings;
 
   @ffi.Uint32()
-  int Count;
+  external int Count;
 }
 
 class CXVirtualFileOverlayImpl extends ffi.Struct {}
@@ -2192,14 +2092,14 @@
 /// Provides the contents of a file that has not yet been saved to disk.
 class CXUnsavedFile extends ffi.Struct {
   /// The file whose contents have not yet been saved.
-  ffi.Pointer<ffi.Int8> Filename;
+  external ffi.Pointer<ffi.Int8> Filename;
 
   /// A buffer containing the unsaved contents of this file.
-  ffi.Pointer<ffi.Int8> Contents;
+  external ffi.Pointer<ffi.Int8> Contents;
 
   /// The length of the unsaved contents of this buffer.
   @ffi.Uint64()
-  int Length;
+  external int Length;
 }
 
 /// Describes the availability of a particular entity, which indicates whether
@@ -2226,18 +2126,18 @@
   /// The major version number, e.g., the '10' in '10.7.3'. A negative value
   /// indicates that there is no version number at all.
   @ffi.Int32()
-  int Major;
+  external int Major;
 
   /// The minor version number, e.g., the '7' in '10.7.3'. This value will be
   /// negative if no minor version number was provided, e.g., for version '10'.
   @ffi.Int32()
-  int Minor;
+  external int Minor;
 
   /// The subminor version number, e.g., the '3' in '10.7.3'. This value will be
   /// negative if no minor or subminor version number was provided, e.g., in
   /// version '10' or '10.7'.
   @ffi.Int32()
-  int Subminor;
+  external int Subminor;
 }
 
 /// Describes the exception specification of a cursor.
@@ -2294,11 +2194,11 @@
 /// across an indexing session.
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Uint64()
-  int _unique_data_item_0;
+  external int _unique_data_item_0;
   @ffi.Uint64()
-  int _unique_data_item_1;
+  external int _unique_data_item_1;
   @ffi.Uint64()
-  int _unique_data_item_2;
+  external int _unique_data_item_2;
 
   /// Helper for array `data`.
   ArrayHelper_CXFileUniqueID_data_level0 get data =>
@@ -2355,14 +2255,14 @@
 
 /// Identifies a specific source location within a translation unit.
 class CXSourceLocation extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceLocation_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXSourceLocation_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int int_data;
+  external int int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXSourceLocation`.
@@ -2410,17 +2310,17 @@
 
 /// Identifies a half-open character range in the source code.
 class CXSourceRange extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceRange_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXSourceRange_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int begin_int_data;
+  external int begin_int_data;
 
   @ffi.Uint32()
-  int end_int_data;
+  external int end_int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXSourceRange`.
@@ -2470,10 +2370,10 @@
 class CXSourceRangeList extends ffi.Struct {
   /// The number of ranges in the ranges array.
   @ffi.Uint32()
-  int count;
+  external int count;
 
   /// An array of CXSourceRanges.
-  ffi.Pointer<CXSourceRange> ranges;
+  external ffi.Pointer<CXSourceRange> ranges;
 }
 
 /// Describes the severity of a particular diagnostic.
@@ -2656,20 +2556,20 @@
 
 class CXTUResourceUsageEntry extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  external int kind;
 
   @ffi.Uint64()
-  int amount;
+  external int amount;
 }
 
 /// The memory usage of a CXTranslationUnit, broken into categories.
 class CXTUResourceUsage extends ffi.Struct {
-  ffi.Pointer<ffi.Void> data;
+  external ffi.Pointer<ffi.Void> data;
 
   @ffi.Uint32()
-  int numEntries;
+  external int numEntries;
 
-  ffi.Pointer<CXTUResourceUsageEntry> entries;
+  external ffi.Pointer<CXTUResourceUsageEntry> entries;
 }
 
 /// Describes the kind of entity that a cursor refers to.
@@ -3328,14 +3228,14 @@
 /// translation unit.
 class CXCursor extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  external int kind;
 
   @ffi.Int32()
-  int xdata;
+  external int xdata;
 
-  ffi.Pointer<ffi.Void> _unique_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_data_item_1;
-  ffi.Pointer<ffi.Void> _unique_data_item_2;
+  external ffi.Pointer<ffi.Void> _unique_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_data_item_2;
 
   /// Helper for array `data`.
   ArrayHelper_CXCursor_data_level0 get data =>
@@ -3602,10 +3502,10 @@
 /// The type of an element in the abstract syntax tree.
 class CXType extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  external int kind;
 
-  ffi.Pointer<ffi.Void> _unique_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_data_item_1;
 
   /// Helper for array `data`.
   ArrayHelper_CXType_data_level0 get data =>
@@ -3849,18 +3749,18 @@
 /// Describes a single preprocessing token.
 class CXToken extends ffi.Struct {
   @ffi.Uint32()
-  int _unique_int_data_item_0;
+  external int _unique_int_data_item_0;
   @ffi.Uint32()
-  int _unique_int_data_item_1;
+  external int _unique_int_data_item_1;
   @ffi.Uint32()
-  int _unique_int_data_item_2;
+  external int _unique_int_data_item_2;
   @ffi.Uint32()
-  int _unique_int_data_item_3;
+  external int _unique_int_data_item_3;
 
   /// Helper for array `int_data`.
   ArrayHelper_CXToken_int_data_level0 get int_data =>
       ArrayHelper_CXToken_int_data_level0(this, [4], 0, 0);
-  ffi.Pointer<ffi.Void> ptr_data;
+  external ffi.Pointer<ffi.Void> ptr_data;
 }
 
 /// Helper for array `int_data` in struct `CXToken`.
@@ -3920,11 +3820,11 @@
 class CXCompletionResult extends ffi.Struct {
   /// The kind of entity that this completion refers to.
   @ffi.Int32()
-  int CursorKind;
+  external int CursorKind;
 
   /// The code-completion string that describes how to insert this
   /// code-completion result into the editing buffer.
-  ffi.Pointer<ffi.Void> CompletionString;
+  external ffi.Pointer<ffi.Void> CompletionString;
 }
 
 /// Describes a single piece of text within a code-completion string.
@@ -4003,11 +3903,11 @@
 /// Contains the results of code-completion.
 class CXCodeCompleteResults extends ffi.Struct {
   /// The code-completion results.
-  ffi.Pointer<CXCompletionResult> Results;
+  external ffi.Pointer<CXCompletionResult> Results;
 
   /// The number of code-completion results stored in the Results array.
   @ffi.Uint32()
-  int NumResults;
+  external int NumResults;
 }
 
 /// Flags that can be passed to clang_codeCompleteAt() to modify its behavior.
@@ -4158,14 +4058,14 @@
 
 /// Source location passed to index callbacks.
 class CXIdxLoc extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  external ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXIdxLoc_ptr_data_level0 get ptr_data =>
       ArrayHelper_CXIdxLoc_ptr_data_level0(this, [2], 0, 0);
   @ffi.Uint32()
-  int int_data;
+  external int int_data;
 }
 
 /// Helper for array `ptr_data` in struct `CXIdxLoc`.
@@ -4294,10 +4194,10 @@
 }
 
 class CXIdxObjCContainerDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
+  external ffi.Pointer<CXIdxDeclInfo> declInfo;
 
   @ffi.Int32()
-  int kind;
+  external int kind;
 }
 
 class CXIdxBaseClassInfo extends ffi.Struct {}
@@ -4305,37 +4205,37 @@
 class CXIdxObjCProtocolRefInfo extends ffi.Struct {}
 
 class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
-  ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
+  external ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
 
   @ffi.Uint32()
-  int numProtocols;
+  external int numProtocols;
 }
 
 class CXIdxObjCInterfaceDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;
+  external ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;
 
-  ffi.Pointer<CXIdxBaseClassInfo> superInfo;
+  external ffi.Pointer<CXIdxBaseClassInfo> superInfo;
 
-  ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
+  external ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
 }
 
 class CXIdxObjCCategoryDeclInfo extends ffi.Struct {}
 
 class CXIdxObjCPropertyDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
+  external ffi.Pointer<CXIdxDeclInfo> declInfo;
 
-  ffi.Pointer<CXIdxEntityInfo> getter;
+  external ffi.Pointer<CXIdxEntityInfo> getter;
 
-  ffi.Pointer<CXIdxEntityInfo> setter;
+  external ffi.Pointer<CXIdxEntityInfo> setter;
 }
 
 class CXIdxCXXClassDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
+  external ffi.Pointer<CXIdxDeclInfo> declInfo;
 
-  ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
+  external ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
 
   @ffi.Uint32()
-  int numBases;
+  external int numBases;
 }
 
 /// Data for IndexerCallbacks#indexEntityReference.
@@ -4370,26 +4270,26 @@
 class IndexerCallbacks extends ffi.Struct {
   /// Called periodically to check whether indexing should be aborted. Should
   /// return 0 to continue, and non-zero to abort.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> abortQuery;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> abortQuery;
 
   /// Called at the end of indexing; passes the complete diagnostic set.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_3>> diagnostic;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_3>> diagnostic;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_4>> enteredMainFile;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_4>> enteredMainFile;
 
   /// Called when a file gets #included/#imported.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_5>> ppIncludedFile;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_5>> ppIncludedFile;
 
   /// Called when a AST file (PCH or module) gets imported.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_6>> importedASTFile;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_6>> importedASTFile;
 
   /// Called at the beginning of indexing a translation unit.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_7>> startedTranslationUnit;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_7>> startedTranslationUnit;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_8>> indexDeclaration;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_8>> indexDeclaration;
 
   /// Called to index a reference of an entity.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_9>> indexEntityReference;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_9>> indexEntityReference;
 }
 
 abstract class CXIndexOptFlags {
diff --git a/test/large_integration_tests/_expected_sqlite_bindings.dart b/test/large_integration_tests/_expected_sqlite_bindings.dart
index 7ca15ad..7ea5be8 100644
--- a/test/large_integration_tests/_expected_sqlite_bindings.dart
+++ b/test/large_integration_tests/_expected_sqlite_bindings.dart
@@ -12,57 +12,52 @@
   SQLite(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
 
   ffi.Pointer<ffi.Int8> sqlite3_libversion() {
-    _sqlite3_libversion ??=
+    return (_sqlite3_libversion ??=
         _dylib.lookupFunction<_c_sqlite3_libversion, _dart_sqlite3_libversion>(
-            'sqlite3_libversion');
-    return _sqlite3_libversion();
+            'sqlite3_libversion'))();
   }
 
-  _dart_sqlite3_libversion _sqlite3_libversion;
+  _dart_sqlite3_libversion? _sqlite3_libversion;
 
   ffi.Pointer<ffi.Int8> sqlite3_sourceid() {
-    _sqlite3_sourceid ??=
+    return (_sqlite3_sourceid ??=
         _dylib.lookupFunction<_c_sqlite3_sourceid, _dart_sqlite3_sourceid>(
-            'sqlite3_sourceid');
-    return _sqlite3_sourceid();
+            'sqlite3_sourceid'))();
   }
 
-  _dart_sqlite3_sourceid _sqlite3_sourceid;
+  _dart_sqlite3_sourceid? _sqlite3_sourceid;
 
   int sqlite3_libversion_number() {
-    _sqlite3_libversion_number ??= _dylib.lookupFunction<
+    return (_sqlite3_libversion_number ??= _dylib.lookupFunction<
         _c_sqlite3_libversion_number,
-        _dart_sqlite3_libversion_number>('sqlite3_libversion_number');
-    return _sqlite3_libversion_number();
+        _dart_sqlite3_libversion_number>('sqlite3_libversion_number'))();
   }
 
-  _dart_sqlite3_libversion_number _sqlite3_libversion_number;
+  _dart_sqlite3_libversion_number? _sqlite3_libversion_number;
 
   int sqlite3_compileoption_used(
     ffi.Pointer<ffi.Int8> zOptName,
   ) {
-    _sqlite3_compileoption_used ??= _dylib.lookupFunction<
+    return (_sqlite3_compileoption_used ??= _dylib.lookupFunction<
         _c_sqlite3_compileoption_used,
-        _dart_sqlite3_compileoption_used>('sqlite3_compileoption_used');
-    return _sqlite3_compileoption_used(
+        _dart_sqlite3_compileoption_used>('sqlite3_compileoption_used'))(
       zOptName,
     );
   }
 
-  _dart_sqlite3_compileoption_used _sqlite3_compileoption_used;
+  _dart_sqlite3_compileoption_used? _sqlite3_compileoption_used;
 
   ffi.Pointer<ffi.Int8> sqlite3_compileoption_get(
     int N,
   ) {
-    _sqlite3_compileoption_get ??= _dylib.lookupFunction<
+    return (_sqlite3_compileoption_get ??= _dylib.lookupFunction<
         _c_sqlite3_compileoption_get,
-        _dart_sqlite3_compileoption_get>('sqlite3_compileoption_get');
-    return _sqlite3_compileoption_get(
+        _dart_sqlite3_compileoption_get>('sqlite3_compileoption_get'))(
       N,
     );
   }
 
-  _dart_sqlite3_compileoption_get _sqlite3_compileoption_get;
+  _dart_sqlite3_compileoption_get? _sqlite3_compileoption_get;
 
   /// CAPI3REF: Test To See If The Library Is Threadsafe
   ///
@@ -99,13 +94,12 @@
   ///
   /// See the [threading mode] documentation for additional information.
   int sqlite3_threadsafe() {
-    _sqlite3_threadsafe ??=
+    return (_sqlite3_threadsafe ??=
         _dylib.lookupFunction<_c_sqlite3_threadsafe, _dart_sqlite3_threadsafe>(
-            'sqlite3_threadsafe');
-    return _sqlite3_threadsafe();
+            'sqlite3_threadsafe'))();
   }
 
-  _dart_sqlite3_threadsafe _sqlite3_threadsafe;
+  _dart_sqlite3_threadsafe? _sqlite3_threadsafe;
 
   /// CAPI3REF: Closing A Database Connection
   /// DESTRUCTOR: sqlite3
@@ -146,27 +140,26 @@
   int sqlite3_close(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_close ??= _dylib
-        .lookupFunction<_c_sqlite3_close, _dart_sqlite3_close>('sqlite3_close');
-    return _sqlite3_close(
+    return (_sqlite3_close ??=
+        _dylib.lookupFunction<_c_sqlite3_close, _dart_sqlite3_close>(
+            'sqlite3_close'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_close _sqlite3_close;
+  _dart_sqlite3_close? _sqlite3_close;
 
   int sqlite3_close_v2(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_close_v2 ??=
+    return (_sqlite3_close_v2 ??=
         _dylib.lookupFunction<_c_sqlite3_close_v2, _dart_sqlite3_close_v2>(
-            'sqlite3_close_v2');
-    return _sqlite3_close_v2(
+            'sqlite3_close_v2'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_close_v2 _sqlite3_close_v2;
+  _dart_sqlite3_close_v2? _sqlite3_close_v2;
 
   /// CAPI3REF: One-Step Query Execution Interface
   /// METHOD: sqlite3
@@ -235,9 +228,8 @@
     ffi.Pointer<ffi.Void> arg3,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> errmsg,
   ) {
-    _sqlite3_exec ??= _dylib
-        .lookupFunction<_c_sqlite3_exec, _dart_sqlite3_exec>('sqlite3_exec');
-    return _sqlite3_exec(
+    return (_sqlite3_exec ??= _dylib
+        .lookupFunction<_c_sqlite3_exec, _dart_sqlite3_exec>('sqlite3_exec'))(
       arg0,
       sql,
       callback,
@@ -246,7 +238,7 @@
     );
   }
 
-  _dart_sqlite3_exec _sqlite3_exec;
+  _dart_sqlite3_exec? _sqlite3_exec;
 
   /// CAPI3REF: Initialize The SQLite Library
   ///
@@ -322,40 +314,36 @@
   /// must return [SQLITE_OK] on success and some other [error code] upon
   /// failure.
   int sqlite3_initialize() {
-    _sqlite3_initialize ??=
+    return (_sqlite3_initialize ??=
         _dylib.lookupFunction<_c_sqlite3_initialize, _dart_sqlite3_initialize>(
-            'sqlite3_initialize');
-    return _sqlite3_initialize();
+            'sqlite3_initialize'))();
   }
 
-  _dart_sqlite3_initialize _sqlite3_initialize;
+  _dart_sqlite3_initialize? _sqlite3_initialize;
 
   int sqlite3_shutdown() {
-    _sqlite3_shutdown ??=
+    return (_sqlite3_shutdown ??=
         _dylib.lookupFunction<_c_sqlite3_shutdown, _dart_sqlite3_shutdown>(
-            'sqlite3_shutdown');
-    return _sqlite3_shutdown();
+            'sqlite3_shutdown'))();
   }
 
-  _dart_sqlite3_shutdown _sqlite3_shutdown;
+  _dart_sqlite3_shutdown? _sqlite3_shutdown;
 
   int sqlite3_os_init() {
-    _sqlite3_os_init ??=
+    return (_sqlite3_os_init ??=
         _dylib.lookupFunction<_c_sqlite3_os_init, _dart_sqlite3_os_init>(
-            'sqlite3_os_init');
-    return _sqlite3_os_init();
+            'sqlite3_os_init'))();
   }
 
-  _dart_sqlite3_os_init _sqlite3_os_init;
+  _dart_sqlite3_os_init? _sqlite3_os_init;
 
   int sqlite3_os_end() {
-    _sqlite3_os_end ??=
+    return (_sqlite3_os_end ??=
         _dylib.lookupFunction<_c_sqlite3_os_end, _dart_sqlite3_os_end>(
-            'sqlite3_os_end');
-    return _sqlite3_os_end();
+            'sqlite3_os_end'))();
   }
 
-  _dart_sqlite3_os_end _sqlite3_os_end;
+  _dart_sqlite3_os_end? _sqlite3_os_end;
 
   /// CAPI3REF: Configuring The SQLite Library
   ///
@@ -389,15 +377,14 @@
   int sqlite3_config(
     int arg0,
   ) {
-    _sqlite3_config ??=
+    return (_sqlite3_config ??=
         _dylib.lookupFunction<_c_sqlite3_config, _dart_sqlite3_config>(
-            'sqlite3_config');
-    return _sqlite3_config(
+            'sqlite3_config'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_config _sqlite3_config;
+  _dart_sqlite3_config? _sqlite3_config;
 
   /// CAPI3REF: Configure database connections
   /// METHOD: sqlite3
@@ -418,16 +405,15 @@
     ffi.Pointer<sqlite3> arg0,
     int op,
   ) {
-    _sqlite3_db_config ??=
+    return (_sqlite3_db_config ??=
         _dylib.lookupFunction<_c_sqlite3_db_config, _dart_sqlite3_db_config>(
-            'sqlite3_db_config');
-    return _sqlite3_db_config(
+            'sqlite3_db_config'))(
       arg0,
       op,
     );
   }
 
-  _dart_sqlite3_db_config _sqlite3_db_config;
+  _dart_sqlite3_db_config? _sqlite3_db_config;
 
   /// CAPI3REF: Enable Or Disable Extended Result Codes
   /// METHOD: sqlite3
@@ -439,16 +425,15 @@
     ffi.Pointer<sqlite3> arg0,
     int onoff,
   ) {
-    _sqlite3_extended_result_codes ??= _dylib.lookupFunction<
+    return (_sqlite3_extended_result_codes ??= _dylib.lookupFunction<
         _c_sqlite3_extended_result_codes,
-        _dart_sqlite3_extended_result_codes>('sqlite3_extended_result_codes');
-    return _sqlite3_extended_result_codes(
+        _dart_sqlite3_extended_result_codes>('sqlite3_extended_result_codes'))(
       arg0,
       onoff,
     );
   }
 
-  _dart_sqlite3_extended_result_codes _sqlite3_extended_result_codes;
+  _dart_sqlite3_extended_result_codes? _sqlite3_extended_result_codes;
 
   /// CAPI3REF: Last Insert Rowid
   /// METHOD: sqlite3
@@ -511,15 +496,14 @@
   int sqlite3_last_insert_rowid(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_last_insert_rowid ??= _dylib.lookupFunction<
+    return (_sqlite3_last_insert_rowid ??= _dylib.lookupFunction<
         _c_sqlite3_last_insert_rowid,
-        _dart_sqlite3_last_insert_rowid>('sqlite3_last_insert_rowid');
-    return _sqlite3_last_insert_rowid(
+        _dart_sqlite3_last_insert_rowid>('sqlite3_last_insert_rowid'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_last_insert_rowid _sqlite3_last_insert_rowid;
+  _dart_sqlite3_last_insert_rowid? _sqlite3_last_insert_rowid;
 
   /// CAPI3REF: Set the Last Insert Rowid value.
   /// METHOD: sqlite3
@@ -531,16 +515,15 @@
     ffi.Pointer<sqlite3> arg0,
     int arg1,
   ) {
-    _sqlite3_set_last_insert_rowid ??= _dylib.lookupFunction<
+    return (_sqlite3_set_last_insert_rowid ??= _dylib.lookupFunction<
         _c_sqlite3_set_last_insert_rowid,
-        _dart_sqlite3_set_last_insert_rowid>('sqlite3_set_last_insert_rowid');
-    return _sqlite3_set_last_insert_rowid(
+        _dart_sqlite3_set_last_insert_rowid>('sqlite3_set_last_insert_rowid'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_set_last_insert_rowid _sqlite3_set_last_insert_rowid;
+  _dart_sqlite3_set_last_insert_rowid? _sqlite3_set_last_insert_rowid;
 
   /// CAPI3REF: Count The Number Of Rows Modified
   /// METHOD: sqlite3
@@ -599,15 +582,14 @@
   int sqlite3_changes(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_changes ??=
+    return (_sqlite3_changes ??=
         _dylib.lookupFunction<_c_sqlite3_changes, _dart_sqlite3_changes>(
-            'sqlite3_changes');
-    return _sqlite3_changes(
+            'sqlite3_changes'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_changes _sqlite3_changes;
+  _dart_sqlite3_changes? _sqlite3_changes;
 
   /// CAPI3REF: Total Number Of Rows Modified
   /// METHOD: sqlite3
@@ -645,14 +627,14 @@
   int sqlite3_total_changes(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_total_changes ??= _dylib.lookupFunction<_c_sqlite3_total_changes,
-        _dart_sqlite3_total_changes>('sqlite3_total_changes');
-    return _sqlite3_total_changes(
+    return (_sqlite3_total_changes ??= _dylib.lookupFunction<
+        _c_sqlite3_total_changes,
+        _dart_sqlite3_total_changes>('sqlite3_total_changes'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_total_changes _sqlite3_total_changes;
+  _dart_sqlite3_total_changes? _sqlite3_total_changes;
 
   /// CAPI3REF: Interrupt A Long-Running Query
   /// METHOD: sqlite3
@@ -690,15 +672,14 @@
   void sqlite3_interrupt(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_interrupt ??=
+    return (_sqlite3_interrupt ??=
         _dylib.lookupFunction<_c_sqlite3_interrupt, _dart_sqlite3_interrupt>(
-            'sqlite3_interrupt');
-    return _sqlite3_interrupt(
+            'sqlite3_interrupt'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_interrupt _sqlite3_interrupt;
+  _dart_sqlite3_interrupt? _sqlite3_interrupt;
 
   /// CAPI3REF: Determine If An SQL Statement Is Complete
   ///
@@ -734,28 +715,26 @@
   int sqlite3_complete(
     ffi.Pointer<ffi.Int8> sql,
   ) {
-    _sqlite3_complete ??=
+    return (_sqlite3_complete ??=
         _dylib.lookupFunction<_c_sqlite3_complete, _dart_sqlite3_complete>(
-            'sqlite3_complete');
-    return _sqlite3_complete(
+            'sqlite3_complete'))(
       sql,
     );
   }
 
-  _dart_sqlite3_complete _sqlite3_complete;
+  _dart_sqlite3_complete? _sqlite3_complete;
 
   int sqlite3_complete16(
     ffi.Pointer<ffi.Void> sql,
   ) {
-    _sqlite3_complete16 ??=
+    return (_sqlite3_complete16 ??=
         _dylib.lookupFunction<_c_sqlite3_complete16, _dart_sqlite3_complete16>(
-            'sqlite3_complete16');
-    return _sqlite3_complete16(
+            'sqlite3_complete16'))(
       sql,
     );
   }
 
-  _dart_sqlite3_complete16 _sqlite3_complete16;
+  _dart_sqlite3_complete16? _sqlite3_complete16;
 
   /// CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors
   /// KEYWORDS: {busy-handler callback} {busy handler}
@@ -819,16 +798,16 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_20>> arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
-    _sqlite3_busy_handler ??= _dylib.lookupFunction<_c_sqlite3_busy_handler,
-        _dart_sqlite3_busy_handler>('sqlite3_busy_handler');
-    return _sqlite3_busy_handler(
+    return (_sqlite3_busy_handler ??= _dylib.lookupFunction<
+        _c_sqlite3_busy_handler,
+        _dart_sqlite3_busy_handler>('sqlite3_busy_handler'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_busy_handler _sqlite3_busy_handler;
+  _dart_sqlite3_busy_handler? _sqlite3_busy_handler;
 
   /// CAPI3REF: Set A Busy Timeout
   /// METHOD: sqlite3
@@ -853,15 +832,15 @@
     ffi.Pointer<sqlite3> arg0,
     int ms,
   ) {
-    _sqlite3_busy_timeout ??= _dylib.lookupFunction<_c_sqlite3_busy_timeout,
-        _dart_sqlite3_busy_timeout>('sqlite3_busy_timeout');
-    return _sqlite3_busy_timeout(
+    return (_sqlite3_busy_timeout ??= _dylib.lookupFunction<
+        _c_sqlite3_busy_timeout,
+        _dart_sqlite3_busy_timeout>('sqlite3_busy_timeout'))(
       arg0,
       ms,
     );
   }
 
-  _dart_sqlite3_busy_timeout _sqlite3_busy_timeout;
+  _dart_sqlite3_busy_timeout? _sqlite3_busy_timeout;
 
   /// CAPI3REF: Convenience Routines For Running Queries
   /// METHOD: sqlite3
@@ -942,10 +921,9 @@
     ffi.Pointer<ffi.Int32> pnColumn,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> pzErrmsg,
   ) {
-    _sqlite3_get_table ??=
+    return (_sqlite3_get_table ??=
         _dylib.lookupFunction<_c_sqlite3_get_table, _dart_sqlite3_get_table>(
-            'sqlite3_get_table');
-    return _sqlite3_get_table(
+            'sqlite3_get_table'))(
       db,
       zSql,
       pazResult,
@@ -955,20 +933,19 @@
     );
   }
 
-  _dart_sqlite3_get_table _sqlite3_get_table;
+  _dart_sqlite3_get_table? _sqlite3_get_table;
 
   void sqlite3_free_table(
     ffi.Pointer<ffi.Pointer<ffi.Int8>> result,
   ) {
-    _sqlite3_free_table ??=
+    return (_sqlite3_free_table ??=
         _dylib.lookupFunction<_c_sqlite3_free_table, _dart_sqlite3_free_table>(
-            'sqlite3_free_table');
-    return _sqlite3_free_table(
+            'sqlite3_free_table'))(
       result,
     );
   }
 
-  _dart_sqlite3_free_table _sqlite3_free_table;
+  _dart_sqlite3_free_table? _sqlite3_free_table;
 
   /// CAPI3REF: Formatted String Printing Functions
   ///
@@ -1011,32 +988,30 @@
   ffi.Pointer<ffi.Int8> sqlite3_mprintf(
     ffi.Pointer<ffi.Int8> arg0,
   ) {
-    _sqlite3_mprintf ??=
+    return (_sqlite3_mprintf ??=
         _dylib.lookupFunction<_c_sqlite3_mprintf, _dart_sqlite3_mprintf>(
-            'sqlite3_mprintf');
-    return _sqlite3_mprintf(
+            'sqlite3_mprintf'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mprintf _sqlite3_mprintf;
+  _dart_sqlite3_mprintf? _sqlite3_mprintf;
 
   ffi.Pointer<ffi.Int8> sqlite3_snprintf(
     int arg0,
     ffi.Pointer<ffi.Int8> arg1,
     ffi.Pointer<ffi.Int8> arg2,
   ) {
-    _sqlite3_snprintf ??=
+    return (_sqlite3_snprintf ??=
         _dylib.lookupFunction<_c_sqlite3_snprintf, _dart_sqlite3_snprintf>(
-            'sqlite3_snprintf');
-    return _sqlite3_snprintf(
+            'sqlite3_snprintf'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_snprintf _sqlite3_snprintf;
+  _dart_sqlite3_snprintf? _sqlite3_snprintf;
 
   /// CAPI3REF: Memory Allocation Subsystem
   ///
@@ -1114,82 +1089,77 @@
   ffi.Pointer<ffi.Void> sqlite3_malloc(
     int arg0,
   ) {
-    _sqlite3_malloc ??=
+    return (_sqlite3_malloc ??=
         _dylib.lookupFunction<_c_sqlite3_malloc, _dart_sqlite3_malloc>(
-            'sqlite3_malloc');
-    return _sqlite3_malloc(
+            'sqlite3_malloc'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_malloc _sqlite3_malloc;
+  _dart_sqlite3_malloc? _sqlite3_malloc;
 
   ffi.Pointer<ffi.Void> sqlite3_malloc64(
     int arg0,
   ) {
-    _sqlite3_malloc64 ??=
+    return (_sqlite3_malloc64 ??=
         _dylib.lookupFunction<_c_sqlite3_malloc64, _dart_sqlite3_malloc64>(
-            'sqlite3_malloc64');
-    return _sqlite3_malloc64(
+            'sqlite3_malloc64'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_malloc64 _sqlite3_malloc64;
+  _dart_sqlite3_malloc64? _sqlite3_malloc64;
 
   ffi.Pointer<ffi.Void> sqlite3_realloc(
     ffi.Pointer<ffi.Void> arg0,
     int arg1,
   ) {
-    _sqlite3_realloc ??=
+    return (_sqlite3_realloc ??=
         _dylib.lookupFunction<_c_sqlite3_realloc, _dart_sqlite3_realloc>(
-            'sqlite3_realloc');
-    return _sqlite3_realloc(
+            'sqlite3_realloc'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_realloc _sqlite3_realloc;
+  _dart_sqlite3_realloc? _sqlite3_realloc;
 
   ffi.Pointer<ffi.Void> sqlite3_realloc64(
     ffi.Pointer<ffi.Void> arg0,
     int arg1,
   ) {
-    _sqlite3_realloc64 ??=
+    return (_sqlite3_realloc64 ??=
         _dylib.lookupFunction<_c_sqlite3_realloc64, _dart_sqlite3_realloc64>(
-            'sqlite3_realloc64');
-    return _sqlite3_realloc64(
+            'sqlite3_realloc64'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_realloc64 _sqlite3_realloc64;
+  _dart_sqlite3_realloc64? _sqlite3_realloc64;
 
   void sqlite3_free(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _sqlite3_free ??= _dylib
-        .lookupFunction<_c_sqlite3_free, _dart_sqlite3_free>('sqlite3_free');
-    return _sqlite3_free(
+    return (_sqlite3_free ??= _dylib
+        .lookupFunction<_c_sqlite3_free, _dart_sqlite3_free>('sqlite3_free'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_free _sqlite3_free;
+  _dart_sqlite3_free? _sqlite3_free;
 
   int sqlite3_msize(
     ffi.Pointer<ffi.Void> arg0,
   ) {
-    _sqlite3_msize ??= _dylib
-        .lookupFunction<_c_sqlite3_msize, _dart_sqlite3_msize>('sqlite3_msize');
-    return _sqlite3_msize(
+    return (_sqlite3_msize ??=
+        _dylib.lookupFunction<_c_sqlite3_msize, _dart_sqlite3_msize>(
+            'sqlite3_msize'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_msize _sqlite3_msize;
+  _dart_sqlite3_msize? _sqlite3_msize;
 
   /// CAPI3REF: Memory Allocator Statistics
   ///
@@ -1213,25 +1183,24 @@
   /// by [sqlite3_memory_highwater(1)] is the high-water mark
   /// prior to the reset.
   int sqlite3_memory_used() {
-    _sqlite3_memory_used ??= _dylib.lookupFunction<_c_sqlite3_memory_used,
-        _dart_sqlite3_memory_used>('sqlite3_memory_used');
-    return _sqlite3_memory_used();
+    return (_sqlite3_memory_used ??= _dylib.lookupFunction<
+        _c_sqlite3_memory_used,
+        _dart_sqlite3_memory_used>('sqlite3_memory_used'))();
   }
 
-  _dart_sqlite3_memory_used _sqlite3_memory_used;
+  _dart_sqlite3_memory_used? _sqlite3_memory_used;
 
   int sqlite3_memory_highwater(
     int resetFlag,
   ) {
-    _sqlite3_memory_highwater ??= _dylib.lookupFunction<
+    return (_sqlite3_memory_highwater ??= _dylib.lookupFunction<
         _c_sqlite3_memory_highwater,
-        _dart_sqlite3_memory_highwater>('sqlite3_memory_highwater');
-    return _sqlite3_memory_highwater(
+        _dart_sqlite3_memory_highwater>('sqlite3_memory_highwater'))(
       resetFlag,
     );
   }
 
-  _dart_sqlite3_memory_highwater _sqlite3_memory_highwater;
+  _dart_sqlite3_memory_highwater? _sqlite3_memory_highwater;
 
   /// CAPI3REF: Pseudo-Random Number Generator
   ///
@@ -1256,16 +1225,15 @@
     int N,
     ffi.Pointer<ffi.Void> P,
   ) {
-    _sqlite3_randomness ??=
+    return (_sqlite3_randomness ??=
         _dylib.lookupFunction<_c_sqlite3_randomness, _dart_sqlite3_randomness>(
-            'sqlite3_randomness');
-    return _sqlite3_randomness(
+            'sqlite3_randomness'))(
       N,
       P,
     );
   }
 
-  _dart_sqlite3_randomness _sqlite3_randomness;
+  _dart_sqlite3_randomness? _sqlite3_randomness;
 
   /// CAPI3REF: Compile-Time Authorization Callbacks
   /// METHOD: sqlite3
@@ -1359,16 +1327,16 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_21>> xAuth,
     ffi.Pointer<ffi.Void> pUserData,
   ) {
-    _sqlite3_set_authorizer ??= _dylib.lookupFunction<_c_sqlite3_set_authorizer,
-        _dart_sqlite3_set_authorizer>('sqlite3_set_authorizer');
-    return _sqlite3_set_authorizer(
+    return (_sqlite3_set_authorizer ??= _dylib.lookupFunction<
+        _c_sqlite3_set_authorizer,
+        _dart_sqlite3_set_authorizer>('sqlite3_set_authorizer'))(
       arg0,
       xAuth,
       pUserData,
     );
   }
 
-  _dart_sqlite3_set_authorizer _sqlite3_set_authorizer;
+  _dart_sqlite3_set_authorizer? _sqlite3_set_authorizer;
 
   /// CAPI3REF: Tracing And Profiling Functions
   /// METHOD: sqlite3
@@ -1405,33 +1373,32 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_22>> xTrace,
     ffi.Pointer<ffi.Void> arg2,
   ) {
-    _sqlite3_trace ??= _dylib
-        .lookupFunction<_c_sqlite3_trace, _dart_sqlite3_trace>('sqlite3_trace');
-    return _sqlite3_trace(
+    return (_sqlite3_trace ??=
+        _dylib.lookupFunction<_c_sqlite3_trace, _dart_sqlite3_trace>(
+            'sqlite3_trace'))(
       arg0,
       xTrace,
       arg2,
     );
   }
 
-  _dart_sqlite3_trace _sqlite3_trace;
+  _dart_sqlite3_trace? _sqlite3_trace;
 
   ffi.Pointer<ffi.Void> sqlite3_profile(
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<ffi.NativeFunction<_typedefC_23>> xProfile,
     ffi.Pointer<ffi.Void> arg2,
   ) {
-    _sqlite3_profile ??=
+    return (_sqlite3_profile ??=
         _dylib.lookupFunction<_c_sqlite3_profile, _dart_sqlite3_profile>(
-            'sqlite3_profile');
-    return _sqlite3_profile(
+            'sqlite3_profile'))(
       arg0,
       xProfile,
       arg2,
     );
   }
 
-  _dart_sqlite3_profile _sqlite3_profile;
+  _dart_sqlite3_profile? _sqlite3_profile;
 
   /// CAPI3REF: SQL Trace Hook
   /// METHOD: sqlite3
@@ -1466,10 +1433,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_24>> xCallback,
     ffi.Pointer<ffi.Void> pCtx,
   ) {
-    _sqlite3_trace_v2 ??=
+    return (_sqlite3_trace_v2 ??=
         _dylib.lookupFunction<_c_sqlite3_trace_v2, _dart_sqlite3_trace_v2>(
-            'sqlite3_trace_v2');
-    return _sqlite3_trace_v2(
+            'sqlite3_trace_v2'))(
       arg0,
       uMask,
       xCallback,
@@ -1477,7 +1443,7 @@
     );
   }
 
-  _dart_sqlite3_trace_v2 _sqlite3_trace_v2;
+  _dart_sqlite3_trace_v2? _sqlite3_trace_v2;
 
   /// CAPI3REF: Query Progress Callbacks
   /// METHOD: sqlite3
@@ -1514,10 +1480,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_25>> arg2,
     ffi.Pointer<ffi.Void> arg3,
   ) {
-    _sqlite3_progress_handler ??= _dylib.lookupFunction<
+    return (_sqlite3_progress_handler ??= _dylib.lookupFunction<
         _c_sqlite3_progress_handler,
-        _dart_sqlite3_progress_handler>('sqlite3_progress_handler');
-    return _sqlite3_progress_handler(
+        _dart_sqlite3_progress_handler>('sqlite3_progress_handler'))(
       arg0,
       arg1,
       arg2,
@@ -1525,7 +1490,7 @@
     );
   }
 
-  _dart_sqlite3_progress_handler _sqlite3_progress_handler;
+  _dart_sqlite3_progress_handler? _sqlite3_progress_handler;
 
   /// CAPI3REF: Opening A New Database Connection
   /// CONSTRUCTOR: sqlite3
@@ -1782,30 +1747,28 @@
     ffi.Pointer<ffi.Int8> filename,
     ffi.Pointer<ffi.Pointer<sqlite3>> ppDb,
   ) {
-    _sqlite3_open ??= _dylib
-        .lookupFunction<_c_sqlite3_open, _dart_sqlite3_open>('sqlite3_open');
-    return _sqlite3_open(
+    return (_sqlite3_open ??= _dylib
+        .lookupFunction<_c_sqlite3_open, _dart_sqlite3_open>('sqlite3_open'))(
       filename,
       ppDb,
     );
   }
 
-  _dart_sqlite3_open _sqlite3_open;
+  _dart_sqlite3_open? _sqlite3_open;
 
   int sqlite3_open16(
     ffi.Pointer<ffi.Void> filename,
     ffi.Pointer<ffi.Pointer<sqlite3>> ppDb,
   ) {
-    _sqlite3_open16 ??=
+    return (_sqlite3_open16 ??=
         _dylib.lookupFunction<_c_sqlite3_open16, _dart_sqlite3_open16>(
-            'sqlite3_open16');
-    return _sqlite3_open16(
+            'sqlite3_open16'))(
       filename,
       ppDb,
     );
   }
 
-  _dart_sqlite3_open16 _sqlite3_open16;
+  _dart_sqlite3_open16? _sqlite3_open16;
 
   int sqlite3_open_v2(
     ffi.Pointer<ffi.Int8> filename,
@@ -1813,10 +1776,9 @@
     int flags,
     ffi.Pointer<ffi.Int8> zVfs,
   ) {
-    _sqlite3_open_v2 ??=
+    return (_sqlite3_open_v2 ??=
         _dylib.lookupFunction<_c_sqlite3_open_v2, _dart_sqlite3_open_v2>(
-            'sqlite3_open_v2');
-    return _sqlite3_open_v2(
+            'sqlite3_open_v2'))(
       filename,
       ppDb,
       flags,
@@ -1824,7 +1786,7 @@
     );
   }
 
-  _dart_sqlite3_open_v2 _sqlite3_open_v2;
+  _dart_sqlite3_open_v2? _sqlite3_open_v2;
 
   /// CAPI3REF: Obtain Values For URI Parameters
   ///
@@ -1894,63 +1856,61 @@
     ffi.Pointer<ffi.Int8> zFilename,
     ffi.Pointer<ffi.Int8> zParam,
   ) {
-    _sqlite3_uri_parameter ??= _dylib.lookupFunction<_c_sqlite3_uri_parameter,
-        _dart_sqlite3_uri_parameter>('sqlite3_uri_parameter');
-    return _sqlite3_uri_parameter(
+    return (_sqlite3_uri_parameter ??= _dylib.lookupFunction<
+        _c_sqlite3_uri_parameter,
+        _dart_sqlite3_uri_parameter>('sqlite3_uri_parameter'))(
       zFilename,
       zParam,
     );
   }
 
-  _dart_sqlite3_uri_parameter _sqlite3_uri_parameter;
+  _dart_sqlite3_uri_parameter? _sqlite3_uri_parameter;
 
   int sqlite3_uri_boolean(
     ffi.Pointer<ffi.Int8> zFile,
     ffi.Pointer<ffi.Int8> zParam,
     int bDefault,
   ) {
-    _sqlite3_uri_boolean ??= _dylib.lookupFunction<_c_sqlite3_uri_boolean,
-        _dart_sqlite3_uri_boolean>('sqlite3_uri_boolean');
-    return _sqlite3_uri_boolean(
+    return (_sqlite3_uri_boolean ??= _dylib.lookupFunction<
+        _c_sqlite3_uri_boolean,
+        _dart_sqlite3_uri_boolean>('sqlite3_uri_boolean'))(
       zFile,
       zParam,
       bDefault,
     );
   }
 
-  _dart_sqlite3_uri_boolean _sqlite3_uri_boolean;
+  _dart_sqlite3_uri_boolean? _sqlite3_uri_boolean;
 
   int sqlite3_uri_int64(
     ffi.Pointer<ffi.Int8> arg0,
     ffi.Pointer<ffi.Int8> arg1,
     int arg2,
   ) {
-    _sqlite3_uri_int64 ??=
+    return (_sqlite3_uri_int64 ??=
         _dylib.lookupFunction<_c_sqlite3_uri_int64, _dart_sqlite3_uri_int64>(
-            'sqlite3_uri_int64');
-    return _sqlite3_uri_int64(
+            'sqlite3_uri_int64'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_uri_int64 _sqlite3_uri_int64;
+  _dart_sqlite3_uri_int64? _sqlite3_uri_int64;
 
   ffi.Pointer<ffi.Int8> sqlite3_uri_key(
     ffi.Pointer<ffi.Int8> zFilename,
     int N,
   ) {
-    _sqlite3_uri_key ??=
+    return (_sqlite3_uri_key ??=
         _dylib.lookupFunction<_c_sqlite3_uri_key, _dart_sqlite3_uri_key>(
-            'sqlite3_uri_key');
-    return _sqlite3_uri_key(
+            'sqlite3_uri_key'))(
       zFilename,
       N,
     );
   }
 
-  _dart_sqlite3_uri_key _sqlite3_uri_key;
+  _dart_sqlite3_uri_key? _sqlite3_uri_key;
 
   /// CAPI3REF:  Translate filenames
   ///
@@ -1980,40 +1940,38 @@
   ffi.Pointer<ffi.Int8> sqlite3_filename_database(
     ffi.Pointer<ffi.Int8> arg0,
   ) {
-    _sqlite3_filename_database ??= _dylib.lookupFunction<
+    return (_sqlite3_filename_database ??= _dylib.lookupFunction<
         _c_sqlite3_filename_database,
-        _dart_sqlite3_filename_database>('sqlite3_filename_database');
-    return _sqlite3_filename_database(
+        _dart_sqlite3_filename_database>('sqlite3_filename_database'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_filename_database _sqlite3_filename_database;
+  _dart_sqlite3_filename_database? _sqlite3_filename_database;
 
   ffi.Pointer<ffi.Int8> sqlite3_filename_journal(
     ffi.Pointer<ffi.Int8> arg0,
   ) {
-    _sqlite3_filename_journal ??= _dylib.lookupFunction<
+    return (_sqlite3_filename_journal ??= _dylib.lookupFunction<
         _c_sqlite3_filename_journal,
-        _dart_sqlite3_filename_journal>('sqlite3_filename_journal');
-    return _sqlite3_filename_journal(
+        _dart_sqlite3_filename_journal>('sqlite3_filename_journal'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_filename_journal _sqlite3_filename_journal;
+  _dart_sqlite3_filename_journal? _sqlite3_filename_journal;
 
   ffi.Pointer<ffi.Int8> sqlite3_filename_wal(
     ffi.Pointer<ffi.Int8> arg0,
   ) {
-    _sqlite3_filename_wal ??= _dylib.lookupFunction<_c_sqlite3_filename_wal,
-        _dart_sqlite3_filename_wal>('sqlite3_filename_wal');
-    return _sqlite3_filename_wal(
+    return (_sqlite3_filename_wal ??= _dylib.lookupFunction<
+        _c_sqlite3_filename_wal,
+        _dart_sqlite3_filename_wal>('sqlite3_filename_wal'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_filename_wal _sqlite3_filename_wal;
+  _dart_sqlite3_filename_wal? _sqlite3_filename_wal;
 
   /// CAPI3REF:  Database File Corresponding To A Journal
   ///
@@ -2033,15 +1991,14 @@
   ffi.Pointer<sqlite3_file> sqlite3_database_file_object(
     ffi.Pointer<ffi.Int8> arg0,
   ) {
-    _sqlite3_database_file_object ??= _dylib.lookupFunction<
+    return (_sqlite3_database_file_object ??= _dylib.lookupFunction<
         _c_sqlite3_database_file_object,
-        _dart_sqlite3_database_file_object>('sqlite3_database_file_object');
-    return _sqlite3_database_file_object(
+        _dart_sqlite3_database_file_object>('sqlite3_database_file_object'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_database_file_object _sqlite3_database_file_object;
+  _dart_sqlite3_database_file_object? _sqlite3_database_file_object;
 
   /// CAPI3REF: Create and Destroy VFS Filenames
   ///
@@ -2093,10 +2050,9 @@
     int nParam,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> azParam,
   ) {
-    _sqlite3_create_filename ??= _dylib.lookupFunction<
+    return (_sqlite3_create_filename ??= _dylib.lookupFunction<
         _c_sqlite3_create_filename,
-        _dart_sqlite3_create_filename>('sqlite3_create_filename');
-    return _sqlite3_create_filename(
+        _dart_sqlite3_create_filename>('sqlite3_create_filename'))(
       zDatabase,
       zJournal,
       zWal,
@@ -2105,19 +2061,19 @@
     );
   }
 
-  _dart_sqlite3_create_filename _sqlite3_create_filename;
+  _dart_sqlite3_create_filename? _sqlite3_create_filename;
 
   void sqlite3_free_filename(
     ffi.Pointer<ffi.Int8> arg0,
   ) {
-    _sqlite3_free_filename ??= _dylib.lookupFunction<_c_sqlite3_free_filename,
-        _dart_sqlite3_free_filename>('sqlite3_free_filename');
-    return _sqlite3_free_filename(
+    return (_sqlite3_free_filename ??= _dylib.lookupFunction<
+        _c_sqlite3_free_filename,
+        _dart_sqlite3_free_filename>('sqlite3_free_filename'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_free_filename _sqlite3_free_filename;
+  _dart_sqlite3_free_filename? _sqlite3_free_filename;
 
   /// CAPI3REF: Error Codes And Messages
   /// METHOD: sqlite3
@@ -2172,67 +2128,62 @@
   int sqlite3_errcode(
     ffi.Pointer<sqlite3> db,
   ) {
-    _sqlite3_errcode ??=
+    return (_sqlite3_errcode ??=
         _dylib.lookupFunction<_c_sqlite3_errcode, _dart_sqlite3_errcode>(
-            'sqlite3_errcode');
-    return _sqlite3_errcode(
+            'sqlite3_errcode'))(
       db,
     );
   }
 
-  _dart_sqlite3_errcode _sqlite3_errcode;
+  _dart_sqlite3_errcode? _sqlite3_errcode;
 
   int sqlite3_extended_errcode(
     ffi.Pointer<sqlite3> db,
   ) {
-    _sqlite3_extended_errcode ??= _dylib.lookupFunction<
+    return (_sqlite3_extended_errcode ??= _dylib.lookupFunction<
         _c_sqlite3_extended_errcode,
-        _dart_sqlite3_extended_errcode>('sqlite3_extended_errcode');
-    return _sqlite3_extended_errcode(
+        _dart_sqlite3_extended_errcode>('sqlite3_extended_errcode'))(
       db,
     );
   }
 
-  _dart_sqlite3_extended_errcode _sqlite3_extended_errcode;
+  _dart_sqlite3_extended_errcode? _sqlite3_extended_errcode;
 
   ffi.Pointer<ffi.Int8> sqlite3_errmsg(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_errmsg ??=
+    return (_sqlite3_errmsg ??=
         _dylib.lookupFunction<_c_sqlite3_errmsg, _dart_sqlite3_errmsg>(
-            'sqlite3_errmsg');
-    return _sqlite3_errmsg(
+            'sqlite3_errmsg'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_errmsg _sqlite3_errmsg;
+  _dart_sqlite3_errmsg? _sqlite3_errmsg;
 
   ffi.Pointer<ffi.Void> sqlite3_errmsg16(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_errmsg16 ??=
+    return (_sqlite3_errmsg16 ??=
         _dylib.lookupFunction<_c_sqlite3_errmsg16, _dart_sqlite3_errmsg16>(
-            'sqlite3_errmsg16');
-    return _sqlite3_errmsg16(
+            'sqlite3_errmsg16'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_errmsg16 _sqlite3_errmsg16;
+  _dart_sqlite3_errmsg16? _sqlite3_errmsg16;
 
   ffi.Pointer<ffi.Int8> sqlite3_errstr(
     int arg0,
   ) {
-    _sqlite3_errstr ??=
+    return (_sqlite3_errstr ??=
         _dylib.lookupFunction<_c_sqlite3_errstr, _dart_sqlite3_errstr>(
-            'sqlite3_errstr');
-    return _sqlite3_errstr(
+            'sqlite3_errstr'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_errstr _sqlite3_errstr;
+  _dart_sqlite3_errstr? _sqlite3_errstr;
 
   /// CAPI3REF: Run-time Limits
   /// METHOD: sqlite3
@@ -2277,16 +2228,16 @@
     int id,
     int newVal,
   ) {
-    _sqlite3_limit ??= _dylib
-        .lookupFunction<_c_sqlite3_limit, _dart_sqlite3_limit>('sqlite3_limit');
-    return _sqlite3_limit(
+    return (_sqlite3_limit ??=
+        _dylib.lookupFunction<_c_sqlite3_limit, _dart_sqlite3_limit>(
+            'sqlite3_limit'))(
       arg0,
       id,
       newVal,
     );
   }
 
-  _dart_sqlite3_limit _sqlite3_limit;
+  _dart_sqlite3_limit? _sqlite3_limit;
 
   /// CAPI3REF: Compiling An SQL Statement
   /// KEYWORDS: {SQL statement compiler}
@@ -2393,10 +2344,9 @@
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
   ) {
-    _sqlite3_prepare ??=
+    return (_sqlite3_prepare ??=
         _dylib.lookupFunction<_c_sqlite3_prepare, _dart_sqlite3_prepare>(
-            'sqlite3_prepare');
-    return _sqlite3_prepare(
+            'sqlite3_prepare'))(
       db,
       zSql,
       nByte,
@@ -2405,7 +2355,7 @@
     );
   }
 
-  _dart_sqlite3_prepare _sqlite3_prepare;
+  _dart_sqlite3_prepare? _sqlite3_prepare;
 
   int sqlite3_prepare_v2(
     ffi.Pointer<sqlite3> db,
@@ -2414,10 +2364,9 @@
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
   ) {
-    _sqlite3_prepare_v2 ??=
+    return (_sqlite3_prepare_v2 ??=
         _dylib.lookupFunction<_c_sqlite3_prepare_v2, _dart_sqlite3_prepare_v2>(
-            'sqlite3_prepare_v2');
-    return _sqlite3_prepare_v2(
+            'sqlite3_prepare_v2'))(
       db,
       zSql,
       nByte,
@@ -2426,7 +2375,7 @@
     );
   }
 
-  _dart_sqlite3_prepare_v2 _sqlite3_prepare_v2;
+  _dart_sqlite3_prepare_v2? _sqlite3_prepare_v2;
 
   int sqlite3_prepare_v3(
     ffi.Pointer<sqlite3> db,
@@ -2436,10 +2385,9 @@
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> pzTail,
   ) {
-    _sqlite3_prepare_v3 ??=
+    return (_sqlite3_prepare_v3 ??=
         _dylib.lookupFunction<_c_sqlite3_prepare_v3, _dart_sqlite3_prepare_v3>(
-            'sqlite3_prepare_v3');
-    return _sqlite3_prepare_v3(
+            'sqlite3_prepare_v3'))(
       db,
       zSql,
       nByte,
@@ -2449,7 +2397,7 @@
     );
   }
 
-  _dart_sqlite3_prepare_v3 _sqlite3_prepare_v3;
+  _dart_sqlite3_prepare_v3? _sqlite3_prepare_v3;
 
   int sqlite3_prepare16(
     ffi.Pointer<sqlite3> db,
@@ -2458,10 +2406,9 @@
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
     ffi.Pointer<ffi.Pointer<ffi.Void>> pzTail,
   ) {
-    _sqlite3_prepare16 ??=
+    return (_sqlite3_prepare16 ??=
         _dylib.lookupFunction<_c_sqlite3_prepare16, _dart_sqlite3_prepare16>(
-            'sqlite3_prepare16');
-    return _sqlite3_prepare16(
+            'sqlite3_prepare16'))(
       db,
       zSql,
       nByte,
@@ -2470,7 +2417,7 @@
     );
   }
 
-  _dart_sqlite3_prepare16 _sqlite3_prepare16;
+  _dart_sqlite3_prepare16? _sqlite3_prepare16;
 
   int sqlite3_prepare16_v2(
     ffi.Pointer<sqlite3> db,
@@ -2479,9 +2426,9 @@
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
     ffi.Pointer<ffi.Pointer<ffi.Void>> pzTail,
   ) {
-    _sqlite3_prepare16_v2 ??= _dylib.lookupFunction<_c_sqlite3_prepare16_v2,
-        _dart_sqlite3_prepare16_v2>('sqlite3_prepare16_v2');
-    return _sqlite3_prepare16_v2(
+    return (_sqlite3_prepare16_v2 ??= _dylib.lookupFunction<
+        _c_sqlite3_prepare16_v2,
+        _dart_sqlite3_prepare16_v2>('sqlite3_prepare16_v2'))(
       db,
       zSql,
       nByte,
@@ -2490,7 +2437,7 @@
     );
   }
 
-  _dart_sqlite3_prepare16_v2 _sqlite3_prepare16_v2;
+  _dart_sqlite3_prepare16_v2? _sqlite3_prepare16_v2;
 
   int sqlite3_prepare16_v3(
     ffi.Pointer<sqlite3> db,
@@ -2500,9 +2447,9 @@
     ffi.Pointer<ffi.Pointer<sqlite3_stmt>> ppStmt,
     ffi.Pointer<ffi.Pointer<ffi.Void>> pzTail,
   ) {
-    _sqlite3_prepare16_v3 ??= _dylib.lookupFunction<_c_sqlite3_prepare16_v3,
-        _dart_sqlite3_prepare16_v3>('sqlite3_prepare16_v3');
-    return _sqlite3_prepare16_v3(
+    return (_sqlite3_prepare16_v3 ??= _dylib.lookupFunction<
+        _c_sqlite3_prepare16_v3,
+        _dart_sqlite3_prepare16_v3>('sqlite3_prepare16_v3'))(
       db,
       zSql,
       nByte,
@@ -2512,7 +2459,7 @@
     );
   }
 
-  _dart_sqlite3_prepare16_v3 _sqlite3_prepare16_v3;
+  _dart_sqlite3_prepare16_v3? _sqlite3_prepare16_v3;
 
   /// CAPI3REF: Retrieving Statement SQL
   /// METHOD: sqlite3_stmt
@@ -2553,38 +2500,37 @@
   ffi.Pointer<ffi.Int8> sqlite3_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_sql ??=
-        _dylib.lookupFunction<_c_sqlite3_sql, _dart_sqlite3_sql>('sqlite3_sql');
-    return _sqlite3_sql(
+    return (_sqlite3_sql ??= _dylib
+        .lookupFunction<_c_sqlite3_sql, _dart_sqlite3_sql>('sqlite3_sql'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_sql _sqlite3_sql;
+  _dart_sqlite3_sql? _sqlite3_sql;
 
   ffi.Pointer<ffi.Int8> sqlite3_expanded_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_expanded_sql ??= _dylib.lookupFunction<_c_sqlite3_expanded_sql,
-        _dart_sqlite3_expanded_sql>('sqlite3_expanded_sql');
-    return _sqlite3_expanded_sql(
+    return (_sqlite3_expanded_sql ??= _dylib.lookupFunction<
+        _c_sqlite3_expanded_sql,
+        _dart_sqlite3_expanded_sql>('sqlite3_expanded_sql'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_expanded_sql _sqlite3_expanded_sql;
+  _dart_sqlite3_expanded_sql? _sqlite3_expanded_sql;
 
   ffi.Pointer<ffi.Int8> sqlite3_normalized_sql(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_normalized_sql ??= _dylib.lookupFunction<_c_sqlite3_normalized_sql,
-        _dart_sqlite3_normalized_sql>('sqlite3_normalized_sql');
-    return _sqlite3_normalized_sql(
+    return (_sqlite3_normalized_sql ??= _dylib.lookupFunction<
+        _c_sqlite3_normalized_sql,
+        _dart_sqlite3_normalized_sql>('sqlite3_normalized_sql'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_normalized_sql _sqlite3_normalized_sql;
+  _dart_sqlite3_normalized_sql? _sqlite3_normalized_sql;
 
   /// CAPI3REF: Determine If An SQL Statement Writes The Database
   /// METHOD: sqlite3_stmt
@@ -2621,14 +2567,14 @@
   int sqlite3_stmt_readonly(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_stmt_readonly ??= _dylib.lookupFunction<_c_sqlite3_stmt_readonly,
-        _dart_sqlite3_stmt_readonly>('sqlite3_stmt_readonly');
-    return _sqlite3_stmt_readonly(
+    return (_sqlite3_stmt_readonly ??= _dylib.lookupFunction<
+        _c_sqlite3_stmt_readonly,
+        _dart_sqlite3_stmt_readonly>('sqlite3_stmt_readonly'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_stmt_readonly _sqlite3_stmt_readonly;
+  _dart_sqlite3_stmt_readonly? _sqlite3_stmt_readonly;
 
   /// CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement
   /// METHOD: sqlite3_stmt
@@ -2641,14 +2587,14 @@
   int sqlite3_stmt_isexplain(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_stmt_isexplain ??= _dylib.lookupFunction<_c_sqlite3_stmt_isexplain,
-        _dart_sqlite3_stmt_isexplain>('sqlite3_stmt_isexplain');
-    return _sqlite3_stmt_isexplain(
+    return (_sqlite3_stmt_isexplain ??= _dylib.lookupFunction<
+        _c_sqlite3_stmt_isexplain,
+        _dart_sqlite3_stmt_isexplain>('sqlite3_stmt_isexplain'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_stmt_isexplain _sqlite3_stmt_isexplain;
+  _dart_sqlite3_stmt_isexplain? _sqlite3_stmt_isexplain;
 
   /// CAPI3REF: Determine If A Prepared Statement Has Been Reset
   /// METHOD: sqlite3_stmt
@@ -2670,15 +2616,14 @@
   int sqlite3_stmt_busy(
     ffi.Pointer<sqlite3_stmt> arg0,
   ) {
-    _sqlite3_stmt_busy ??=
+    return (_sqlite3_stmt_busy ??=
         _dylib.lookupFunction<_c_sqlite3_stmt_busy, _dart_sqlite3_stmt_busy>(
-            'sqlite3_stmt_busy');
-    return _sqlite3_stmt_busy(
+            'sqlite3_stmt_busy'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_stmt_busy _sqlite3_stmt_busy;
+  _dart_sqlite3_stmt_busy? _sqlite3_stmt_busy;
 
   /// CAPI3REF: Binding Values To Prepared Statements
   /// KEYWORDS: {host parameter} {host parameters} {host parameter name}
@@ -2821,10 +2766,9 @@
     int n,
     ffi.Pointer<ffi.NativeFunction<_typedefC_26>> arg4,
   ) {
-    _sqlite3_bind_blob ??=
+    return (_sqlite3_bind_blob ??=
         _dylib.lookupFunction<_c_sqlite3_bind_blob, _dart_sqlite3_bind_blob>(
-            'sqlite3_bind_blob');
-    return _sqlite3_bind_blob(
+            'sqlite3_bind_blob'))(
       arg0,
       arg1,
       arg2,
@@ -2833,7 +2777,7 @@
     );
   }
 
-  _dart_sqlite3_bind_blob _sqlite3_bind_blob;
+  _dart_sqlite3_bind_blob? _sqlite3_bind_blob;
 
   int sqlite3_bind_blob64(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -2842,9 +2786,9 @@
     int arg3,
     ffi.Pointer<ffi.NativeFunction<_typedefC_27>> arg4,
   ) {
-    _sqlite3_bind_blob64 ??= _dylib.lookupFunction<_c_sqlite3_bind_blob64,
-        _dart_sqlite3_bind_blob64>('sqlite3_bind_blob64');
-    return _sqlite3_bind_blob64(
+    return (_sqlite3_bind_blob64 ??= _dylib.lookupFunction<
+        _c_sqlite3_bind_blob64,
+        _dart_sqlite3_bind_blob64>('sqlite3_bind_blob64'))(
       arg0,
       arg1,
       arg2,
@@ -2853,72 +2797,69 @@
     );
   }
 
-  _dart_sqlite3_bind_blob64 _sqlite3_bind_blob64;
+  _dart_sqlite3_bind_blob64? _sqlite3_bind_blob64;
 
   int sqlite3_bind_double(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     double arg2,
   ) {
-    _sqlite3_bind_double ??= _dylib.lookupFunction<_c_sqlite3_bind_double,
-        _dart_sqlite3_bind_double>('sqlite3_bind_double');
-    return _sqlite3_bind_double(
+    return (_sqlite3_bind_double ??= _dylib.lookupFunction<
+        _c_sqlite3_bind_double,
+        _dart_sqlite3_bind_double>('sqlite3_bind_double'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_bind_double _sqlite3_bind_double;
+  _dart_sqlite3_bind_double? _sqlite3_bind_double;
 
   int sqlite3_bind_int(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     int arg2,
   ) {
-    _sqlite3_bind_int ??=
+    return (_sqlite3_bind_int ??=
         _dylib.lookupFunction<_c_sqlite3_bind_int, _dart_sqlite3_bind_int>(
-            'sqlite3_bind_int');
-    return _sqlite3_bind_int(
+            'sqlite3_bind_int'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_bind_int _sqlite3_bind_int;
+  _dart_sqlite3_bind_int? _sqlite3_bind_int;
 
   int sqlite3_bind_int64(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     int arg2,
   ) {
-    _sqlite3_bind_int64 ??=
+    return (_sqlite3_bind_int64 ??=
         _dylib.lookupFunction<_c_sqlite3_bind_int64, _dart_sqlite3_bind_int64>(
-            'sqlite3_bind_int64');
-    return _sqlite3_bind_int64(
+            'sqlite3_bind_int64'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_bind_int64 _sqlite3_bind_int64;
+  _dart_sqlite3_bind_int64? _sqlite3_bind_int64;
 
   int sqlite3_bind_null(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_bind_null ??=
+    return (_sqlite3_bind_null ??=
         _dylib.lookupFunction<_c_sqlite3_bind_null, _dart_sqlite3_bind_null>(
-            'sqlite3_bind_null');
-    return _sqlite3_bind_null(
+            'sqlite3_bind_null'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_bind_null _sqlite3_bind_null;
+  _dart_sqlite3_bind_null? _sqlite3_bind_null;
 
   int sqlite3_bind_text(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -2927,10 +2868,9 @@
     int arg3,
     ffi.Pointer<ffi.NativeFunction<_typedefC_28>> arg4,
   ) {
-    _sqlite3_bind_text ??=
+    return (_sqlite3_bind_text ??=
         _dylib.lookupFunction<_c_sqlite3_bind_text, _dart_sqlite3_bind_text>(
-            'sqlite3_bind_text');
-    return _sqlite3_bind_text(
+            'sqlite3_bind_text'))(
       arg0,
       arg1,
       arg2,
@@ -2939,7 +2879,7 @@
     );
   }
 
-  _dart_sqlite3_bind_text _sqlite3_bind_text;
+  _dart_sqlite3_bind_text? _sqlite3_bind_text;
 
   int sqlite3_bind_text16(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -2948,9 +2888,9 @@
     int arg3,
     ffi.Pointer<ffi.NativeFunction<_typedefC_29>> arg4,
   ) {
-    _sqlite3_bind_text16 ??= _dylib.lookupFunction<_c_sqlite3_bind_text16,
-        _dart_sqlite3_bind_text16>('sqlite3_bind_text16');
-    return _sqlite3_bind_text16(
+    return (_sqlite3_bind_text16 ??= _dylib.lookupFunction<
+        _c_sqlite3_bind_text16,
+        _dart_sqlite3_bind_text16>('sqlite3_bind_text16'))(
       arg0,
       arg1,
       arg2,
@@ -2959,7 +2899,7 @@
     );
   }
 
-  _dart_sqlite3_bind_text16 _sqlite3_bind_text16;
+  _dart_sqlite3_bind_text16? _sqlite3_bind_text16;
 
   int sqlite3_bind_text64(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -2969,9 +2909,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_30>> arg4,
     int encoding,
   ) {
-    _sqlite3_bind_text64 ??= _dylib.lookupFunction<_c_sqlite3_bind_text64,
-        _dart_sqlite3_bind_text64>('sqlite3_bind_text64');
-    return _sqlite3_bind_text64(
+    return (_sqlite3_bind_text64 ??= _dylib.lookupFunction<
+        _c_sqlite3_bind_text64,
+        _dart_sqlite3_bind_text64>('sqlite3_bind_text64'))(
       arg0,
       arg1,
       arg2,
@@ -2981,24 +2921,23 @@
     );
   }
 
-  _dart_sqlite3_bind_text64 _sqlite3_bind_text64;
+  _dart_sqlite3_bind_text64? _sqlite3_bind_text64;
 
   int sqlite3_bind_value(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     ffi.Pointer<sqlite3_value> arg2,
   ) {
-    _sqlite3_bind_value ??=
+    return (_sqlite3_bind_value ??=
         _dylib.lookupFunction<_c_sqlite3_bind_value, _dart_sqlite3_bind_value>(
-            'sqlite3_bind_value');
-    return _sqlite3_bind_value(
+            'sqlite3_bind_value'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_bind_value _sqlite3_bind_value;
+  _dart_sqlite3_bind_value? _sqlite3_bind_value;
 
   int sqlite3_bind_pointer(
     ffi.Pointer<sqlite3_stmt> arg0,
@@ -3007,9 +2946,9 @@
     ffi.Pointer<ffi.Int8> arg3,
     ffi.Pointer<ffi.NativeFunction<_typedefC_31>> arg4,
   ) {
-    _sqlite3_bind_pointer ??= _dylib.lookupFunction<_c_sqlite3_bind_pointer,
-        _dart_sqlite3_bind_pointer>('sqlite3_bind_pointer');
-    return _sqlite3_bind_pointer(
+    return (_sqlite3_bind_pointer ??= _dylib.lookupFunction<
+        _c_sqlite3_bind_pointer,
+        _dart_sqlite3_bind_pointer>('sqlite3_bind_pointer'))(
       arg0,
       arg1,
       arg2,
@@ -3018,40 +2957,39 @@
     );
   }
 
-  _dart_sqlite3_bind_pointer _sqlite3_bind_pointer;
+  _dart_sqlite3_bind_pointer? _sqlite3_bind_pointer;
 
   int sqlite3_bind_zeroblob(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     int n,
   ) {
-    _sqlite3_bind_zeroblob ??= _dylib.lookupFunction<_c_sqlite3_bind_zeroblob,
-        _dart_sqlite3_bind_zeroblob>('sqlite3_bind_zeroblob');
-    return _sqlite3_bind_zeroblob(
+    return (_sqlite3_bind_zeroblob ??= _dylib.lookupFunction<
+        _c_sqlite3_bind_zeroblob,
+        _dart_sqlite3_bind_zeroblob>('sqlite3_bind_zeroblob'))(
       arg0,
       arg1,
       n,
     );
   }
 
-  _dart_sqlite3_bind_zeroblob _sqlite3_bind_zeroblob;
+  _dart_sqlite3_bind_zeroblob? _sqlite3_bind_zeroblob;
 
   int sqlite3_bind_zeroblob64(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
     int arg2,
   ) {
-    _sqlite3_bind_zeroblob64 ??= _dylib.lookupFunction<
+    return (_sqlite3_bind_zeroblob64 ??= _dylib.lookupFunction<
         _c_sqlite3_bind_zeroblob64,
-        _dart_sqlite3_bind_zeroblob64>('sqlite3_bind_zeroblob64');
-    return _sqlite3_bind_zeroblob64(
+        _dart_sqlite3_bind_zeroblob64>('sqlite3_bind_zeroblob64'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_bind_zeroblob64 _sqlite3_bind_zeroblob64;
+  _dart_sqlite3_bind_zeroblob64? _sqlite3_bind_zeroblob64;
 
   /// CAPI3REF: Number Of SQL Parameters
   /// METHOD: sqlite3_stmt
@@ -3073,15 +3011,14 @@
   int sqlite3_bind_parameter_count(
     ffi.Pointer<sqlite3_stmt> arg0,
   ) {
-    _sqlite3_bind_parameter_count ??= _dylib.lookupFunction<
+    return (_sqlite3_bind_parameter_count ??= _dylib.lookupFunction<
         _c_sqlite3_bind_parameter_count,
-        _dart_sqlite3_bind_parameter_count>('sqlite3_bind_parameter_count');
-    return _sqlite3_bind_parameter_count(
+        _dart_sqlite3_bind_parameter_count>('sqlite3_bind_parameter_count'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_bind_parameter_count _sqlite3_bind_parameter_count;
+  _dart_sqlite3_bind_parameter_count? _sqlite3_bind_parameter_count;
 
   /// CAPI3REF: Name Of A Host Parameter
   /// METHOD: sqlite3_stmt
@@ -3111,16 +3048,15 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_bind_parameter_name ??= _dylib.lookupFunction<
+    return (_sqlite3_bind_parameter_name ??= _dylib.lookupFunction<
         _c_sqlite3_bind_parameter_name,
-        _dart_sqlite3_bind_parameter_name>('sqlite3_bind_parameter_name');
-    return _sqlite3_bind_parameter_name(
+        _dart_sqlite3_bind_parameter_name>('sqlite3_bind_parameter_name'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_bind_parameter_name _sqlite3_bind_parameter_name;
+  _dart_sqlite3_bind_parameter_name? _sqlite3_bind_parameter_name;
 
   /// CAPI3REF: Index Of A Parameter With A Given Name
   /// METHOD: sqlite3_stmt
@@ -3140,16 +3076,15 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     ffi.Pointer<ffi.Int8> zName,
   ) {
-    _sqlite3_bind_parameter_index ??= _dylib.lookupFunction<
+    return (_sqlite3_bind_parameter_index ??= _dylib.lookupFunction<
         _c_sqlite3_bind_parameter_index,
-        _dart_sqlite3_bind_parameter_index>('sqlite3_bind_parameter_index');
-    return _sqlite3_bind_parameter_index(
+        _dart_sqlite3_bind_parameter_index>('sqlite3_bind_parameter_index'))(
       arg0,
       zName,
     );
   }
 
-  _dart_sqlite3_bind_parameter_index _sqlite3_bind_parameter_index;
+  _dart_sqlite3_bind_parameter_index? _sqlite3_bind_parameter_index;
 
   /// CAPI3REF: Reset All Bindings On A Prepared Statement
   /// METHOD: sqlite3_stmt
@@ -3160,14 +3095,14 @@
   int sqlite3_clear_bindings(
     ffi.Pointer<sqlite3_stmt> arg0,
   ) {
-    _sqlite3_clear_bindings ??= _dylib.lookupFunction<_c_sqlite3_clear_bindings,
-        _dart_sqlite3_clear_bindings>('sqlite3_clear_bindings');
-    return _sqlite3_clear_bindings(
+    return (_sqlite3_clear_bindings ??= _dylib.lookupFunction<
+        _c_sqlite3_clear_bindings,
+        _dart_sqlite3_clear_bindings>('sqlite3_clear_bindings'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_clear_bindings _sqlite3_clear_bindings;
+  _dart_sqlite3_clear_bindings? _sqlite3_clear_bindings;
 
   /// CAPI3REF: Number Of Columns In A Result Set
   /// METHOD: sqlite3_stmt
@@ -3184,14 +3119,14 @@
   int sqlite3_column_count(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_column_count ??= _dylib.lookupFunction<_c_sqlite3_column_count,
-        _dart_sqlite3_column_count>('sqlite3_column_count');
-    return _sqlite3_column_count(
+    return (_sqlite3_column_count ??= _dylib.lookupFunction<
+        _c_sqlite3_column_count,
+        _dart_sqlite3_column_count>('sqlite3_column_count'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_column_count _sqlite3_column_count;
+  _dart_sqlite3_column_count? _sqlite3_column_count;
 
   /// CAPI3REF: Column Names In A Result Set
   /// METHOD: sqlite3_stmt
@@ -3222,29 +3157,29 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     int N,
   ) {
-    _sqlite3_column_name ??= _dylib.lookupFunction<_c_sqlite3_column_name,
-        _dart_sqlite3_column_name>('sqlite3_column_name');
-    return _sqlite3_column_name(
+    return (_sqlite3_column_name ??= _dylib.lookupFunction<
+        _c_sqlite3_column_name,
+        _dart_sqlite3_column_name>('sqlite3_column_name'))(
       arg0,
       N,
     );
   }
 
-  _dart_sqlite3_column_name _sqlite3_column_name;
+  _dart_sqlite3_column_name? _sqlite3_column_name;
 
   ffi.Pointer<ffi.Void> sqlite3_column_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
     int N,
   ) {
-    _sqlite3_column_name16 ??= _dylib.lookupFunction<_c_sqlite3_column_name16,
-        _dart_sqlite3_column_name16>('sqlite3_column_name16');
-    return _sqlite3_column_name16(
+    return (_sqlite3_column_name16 ??= _dylib.lookupFunction<
+        _c_sqlite3_column_name16,
+        _dart_sqlite3_column_name16>('sqlite3_column_name16'))(
       arg0,
       N,
     );
   }
 
-  _dart_sqlite3_column_name16 _sqlite3_column_name16;
+  _dart_sqlite3_column_name16? _sqlite3_column_name16;
 
   /// CAPI3REF: Source Of Data In A Query Result
   /// METHOD: sqlite3_stmt
@@ -3290,91 +3225,86 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_database_name ??= _dylib.lookupFunction<
+    return (_sqlite3_column_database_name ??= _dylib.lookupFunction<
         _c_sqlite3_column_database_name,
-        _dart_sqlite3_column_database_name>('sqlite3_column_database_name');
-    return _sqlite3_column_database_name(
+        _dart_sqlite3_column_database_name>('sqlite3_column_database_name'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_database_name _sqlite3_column_database_name;
+  _dart_sqlite3_column_database_name? _sqlite3_column_database_name;
 
   ffi.Pointer<ffi.Void> sqlite3_column_database_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_database_name16 ??= _dylib.lookupFunction<
-        _c_sqlite3_column_database_name16,
-        _dart_sqlite3_column_database_name16>('sqlite3_column_database_name16');
-    return _sqlite3_column_database_name16(
+    return (_sqlite3_column_database_name16 ??= _dylib.lookupFunction<
+            _c_sqlite3_column_database_name16,
+            _dart_sqlite3_column_database_name16>(
+        'sqlite3_column_database_name16'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_database_name16 _sqlite3_column_database_name16;
+  _dart_sqlite3_column_database_name16? _sqlite3_column_database_name16;
 
   ffi.Pointer<ffi.Int8> sqlite3_column_table_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_table_name ??= _dylib.lookupFunction<
+    return (_sqlite3_column_table_name ??= _dylib.lookupFunction<
         _c_sqlite3_column_table_name,
-        _dart_sqlite3_column_table_name>('sqlite3_column_table_name');
-    return _sqlite3_column_table_name(
+        _dart_sqlite3_column_table_name>('sqlite3_column_table_name'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_table_name _sqlite3_column_table_name;
+  _dart_sqlite3_column_table_name? _sqlite3_column_table_name;
 
   ffi.Pointer<ffi.Void> sqlite3_column_table_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_table_name16 ??= _dylib.lookupFunction<
+    return (_sqlite3_column_table_name16 ??= _dylib.lookupFunction<
         _c_sqlite3_column_table_name16,
-        _dart_sqlite3_column_table_name16>('sqlite3_column_table_name16');
-    return _sqlite3_column_table_name16(
+        _dart_sqlite3_column_table_name16>('sqlite3_column_table_name16'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_table_name16 _sqlite3_column_table_name16;
+  _dart_sqlite3_column_table_name16? _sqlite3_column_table_name16;
 
   ffi.Pointer<ffi.Int8> sqlite3_column_origin_name(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_origin_name ??= _dylib.lookupFunction<
+    return (_sqlite3_column_origin_name ??= _dylib.lookupFunction<
         _c_sqlite3_column_origin_name,
-        _dart_sqlite3_column_origin_name>('sqlite3_column_origin_name');
-    return _sqlite3_column_origin_name(
+        _dart_sqlite3_column_origin_name>('sqlite3_column_origin_name'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_origin_name _sqlite3_column_origin_name;
+  _dart_sqlite3_column_origin_name? _sqlite3_column_origin_name;
 
   ffi.Pointer<ffi.Void> sqlite3_column_origin_name16(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_origin_name16 ??= _dylib.lookupFunction<
+    return (_sqlite3_column_origin_name16 ??= _dylib.lookupFunction<
         _c_sqlite3_column_origin_name16,
-        _dart_sqlite3_column_origin_name16>('sqlite3_column_origin_name16');
-    return _sqlite3_column_origin_name16(
+        _dart_sqlite3_column_origin_name16>('sqlite3_column_origin_name16'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_origin_name16 _sqlite3_column_origin_name16;
+  _dart_sqlite3_column_origin_name16? _sqlite3_column_origin_name16;
 
   /// CAPI3REF: Declared Datatype Of A Query Result
   /// METHOD: sqlite3_stmt
@@ -3408,31 +3338,29 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_decltype ??= _dylib.lookupFunction<
+    return (_sqlite3_column_decltype ??= _dylib.lookupFunction<
         _c_sqlite3_column_decltype,
-        _dart_sqlite3_column_decltype>('sqlite3_column_decltype');
-    return _sqlite3_column_decltype(
+        _dart_sqlite3_column_decltype>('sqlite3_column_decltype'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_decltype _sqlite3_column_decltype;
+  _dart_sqlite3_column_decltype? _sqlite3_column_decltype;
 
   ffi.Pointer<ffi.Void> sqlite3_column_decltype16(
     ffi.Pointer<sqlite3_stmt> arg0,
     int arg1,
   ) {
-    _sqlite3_column_decltype16 ??= _dylib.lookupFunction<
+    return (_sqlite3_column_decltype16 ??= _dylib.lookupFunction<
         _c_sqlite3_column_decltype16,
-        _dart_sqlite3_column_decltype16>('sqlite3_column_decltype16');
-    return _sqlite3_column_decltype16(
+        _dart_sqlite3_column_decltype16>('sqlite3_column_decltype16'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_column_decltype16 _sqlite3_column_decltype16;
+  _dart_sqlite3_column_decltype16? _sqlite3_column_decltype16;
 
   /// CAPI3REF: Evaluate An SQL Statement
   /// METHOD: sqlite3_stmt
@@ -3517,14 +3445,13 @@
   int sqlite3_step(
     ffi.Pointer<sqlite3_stmt> arg0,
   ) {
-    _sqlite3_step ??= _dylib
-        .lookupFunction<_c_sqlite3_step, _dart_sqlite3_step>('sqlite3_step');
-    return _sqlite3_step(
+    return (_sqlite3_step ??= _dylib
+        .lookupFunction<_c_sqlite3_step, _dart_sqlite3_step>('sqlite3_step'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_step _sqlite3_step;
+  _dart_sqlite3_step? _sqlite3_step;
 
   /// CAPI3REF: Number of columns in a result set
   /// METHOD: sqlite3_stmt
@@ -3546,15 +3473,14 @@
   int sqlite3_data_count(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_data_count ??=
+    return (_sqlite3_data_count ??=
         _dylib.lookupFunction<_c_sqlite3_data_count, _dart_sqlite3_data_count>(
-            'sqlite3_data_count');
-    return _sqlite3_data_count(
+            'sqlite3_data_count'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_data_count _sqlite3_data_count;
+  _dart_sqlite3_data_count? _sqlite3_data_count;
 
   /// CAPI3REF: Result Values From A Query
   /// KEYWORDS: {column access functions}
@@ -3767,142 +3693,141 @@
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_blob ??= _dylib.lookupFunction<_c_sqlite3_column_blob,
-        _dart_sqlite3_column_blob>('sqlite3_column_blob');
-    return _sqlite3_column_blob(
+    return (_sqlite3_column_blob ??= _dylib.lookupFunction<
+        _c_sqlite3_column_blob,
+        _dart_sqlite3_column_blob>('sqlite3_column_blob'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_blob _sqlite3_column_blob;
+  _dart_sqlite3_column_blob? _sqlite3_column_blob;
 
   double sqlite3_column_double(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_double ??= _dylib.lookupFunction<_c_sqlite3_column_double,
-        _dart_sqlite3_column_double>('sqlite3_column_double');
-    return _sqlite3_column_double(
+    return (_sqlite3_column_double ??= _dylib.lookupFunction<
+        _c_sqlite3_column_double,
+        _dart_sqlite3_column_double>('sqlite3_column_double'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_double _sqlite3_column_double;
+  _dart_sqlite3_column_double? _sqlite3_column_double;
 
   int sqlite3_column_int(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_int ??=
+    return (_sqlite3_column_int ??=
         _dylib.lookupFunction<_c_sqlite3_column_int, _dart_sqlite3_column_int>(
-            'sqlite3_column_int');
-    return _sqlite3_column_int(
+            'sqlite3_column_int'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_int _sqlite3_column_int;
+  _dart_sqlite3_column_int? _sqlite3_column_int;
 
   int sqlite3_column_int64(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_int64 ??= _dylib.lookupFunction<_c_sqlite3_column_int64,
-        _dart_sqlite3_column_int64>('sqlite3_column_int64');
-    return _sqlite3_column_int64(
+    return (_sqlite3_column_int64 ??= _dylib.lookupFunction<
+        _c_sqlite3_column_int64,
+        _dart_sqlite3_column_int64>('sqlite3_column_int64'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_int64 _sqlite3_column_int64;
+  _dart_sqlite3_column_int64? _sqlite3_column_int64;
 
   ffi.Pointer<ffi.Uint8> sqlite3_column_text(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_text ??= _dylib.lookupFunction<_c_sqlite3_column_text,
-        _dart_sqlite3_column_text>('sqlite3_column_text');
-    return _sqlite3_column_text(
+    return (_sqlite3_column_text ??= _dylib.lookupFunction<
+        _c_sqlite3_column_text,
+        _dart_sqlite3_column_text>('sqlite3_column_text'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_text _sqlite3_column_text;
+  _dart_sqlite3_column_text? _sqlite3_column_text;
 
   ffi.Pointer<ffi.Void> sqlite3_column_text16(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_text16 ??= _dylib.lookupFunction<_c_sqlite3_column_text16,
-        _dart_sqlite3_column_text16>('sqlite3_column_text16');
-    return _sqlite3_column_text16(
+    return (_sqlite3_column_text16 ??= _dylib.lookupFunction<
+        _c_sqlite3_column_text16,
+        _dart_sqlite3_column_text16>('sqlite3_column_text16'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_text16 _sqlite3_column_text16;
+  _dart_sqlite3_column_text16? _sqlite3_column_text16;
 
   ffi.Pointer<sqlite3_value> sqlite3_column_value(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_value ??= _dylib.lookupFunction<_c_sqlite3_column_value,
-        _dart_sqlite3_column_value>('sqlite3_column_value');
-    return _sqlite3_column_value(
+    return (_sqlite3_column_value ??= _dylib.lookupFunction<
+        _c_sqlite3_column_value,
+        _dart_sqlite3_column_value>('sqlite3_column_value'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_value _sqlite3_column_value;
+  _dart_sqlite3_column_value? _sqlite3_column_value;
 
   int sqlite3_column_bytes(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_bytes ??= _dylib.lookupFunction<_c_sqlite3_column_bytes,
-        _dart_sqlite3_column_bytes>('sqlite3_column_bytes');
-    return _sqlite3_column_bytes(
+    return (_sqlite3_column_bytes ??= _dylib.lookupFunction<
+        _c_sqlite3_column_bytes,
+        _dart_sqlite3_column_bytes>('sqlite3_column_bytes'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_bytes _sqlite3_column_bytes;
+  _dart_sqlite3_column_bytes? _sqlite3_column_bytes;
 
   int sqlite3_column_bytes16(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_bytes16 ??= _dylib.lookupFunction<_c_sqlite3_column_bytes16,
-        _dart_sqlite3_column_bytes16>('sqlite3_column_bytes16');
-    return _sqlite3_column_bytes16(
+    return (_sqlite3_column_bytes16 ??= _dylib.lookupFunction<
+        _c_sqlite3_column_bytes16,
+        _dart_sqlite3_column_bytes16>('sqlite3_column_bytes16'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_bytes16 _sqlite3_column_bytes16;
+  _dart_sqlite3_column_bytes16? _sqlite3_column_bytes16;
 
   int sqlite3_column_type(
     ffi.Pointer<sqlite3_stmt> arg0,
     int iCol,
   ) {
-    _sqlite3_column_type ??= _dylib.lookupFunction<_c_sqlite3_column_type,
-        _dart_sqlite3_column_type>('sqlite3_column_type');
-    return _sqlite3_column_type(
+    return (_sqlite3_column_type ??= _dylib.lookupFunction<
+        _c_sqlite3_column_type,
+        _dart_sqlite3_column_type>('sqlite3_column_type'))(
       arg0,
       iCol,
     );
   }
 
-  _dart_sqlite3_column_type _sqlite3_column_type;
+  _dart_sqlite3_column_type? _sqlite3_column_type;
 
   /// CAPI3REF: Destroy A Prepared Statement Object
   /// DESTRUCTOR: sqlite3_stmt
@@ -3931,15 +3856,14 @@
   int sqlite3_finalize(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_finalize ??=
+    return (_sqlite3_finalize ??=
         _dylib.lookupFunction<_c_sqlite3_finalize, _dart_sqlite3_finalize>(
-            'sqlite3_finalize');
-    return _sqlite3_finalize(
+            'sqlite3_finalize'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_finalize _sqlite3_finalize;
+  _dart_sqlite3_finalize? _sqlite3_finalize;
 
   /// CAPI3REF: Reset A Prepared Statement Object
   /// METHOD: sqlite3_stmt
@@ -3967,14 +3891,14 @@
   int sqlite3_reset(
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_reset ??= _dylib
-        .lookupFunction<_c_sqlite3_reset, _dart_sqlite3_reset>('sqlite3_reset');
-    return _sqlite3_reset(
+    return (_sqlite3_reset ??=
+        _dylib.lookupFunction<_c_sqlite3_reset, _dart_sqlite3_reset>(
+            'sqlite3_reset'))(
       pStmt,
     );
   }
 
-  _dart_sqlite3_reset _sqlite3_reset;
+  _dart_sqlite3_reset? _sqlite3_reset;
 
   /// CAPI3REF: Create Or Redefine SQL Functions
   /// KEYWORDS: {function creation routines}
@@ -4109,10 +4033,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_33>> xStep,
     ffi.Pointer<ffi.NativeFunction<_typedefC_34>> xFinal,
   ) {
-    _sqlite3_create_function ??= _dylib.lookupFunction<
+    return (_sqlite3_create_function ??= _dylib.lookupFunction<
         _c_sqlite3_create_function,
-        _dart_sqlite3_create_function>('sqlite3_create_function');
-    return _sqlite3_create_function(
+        _dart_sqlite3_create_function>('sqlite3_create_function'))(
       db,
       zFunctionName,
       nArg,
@@ -4124,7 +4047,7 @@
     );
   }
 
-  _dart_sqlite3_create_function _sqlite3_create_function;
+  _dart_sqlite3_create_function? _sqlite3_create_function;
 
   int sqlite3_create_function16(
     ffi.Pointer<sqlite3> db,
@@ -4136,10 +4059,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_36>> xStep,
     ffi.Pointer<ffi.NativeFunction<_typedefC_37>> xFinal,
   ) {
-    _sqlite3_create_function16 ??= _dylib.lookupFunction<
+    return (_sqlite3_create_function16 ??= _dylib.lookupFunction<
         _c_sqlite3_create_function16,
-        _dart_sqlite3_create_function16>('sqlite3_create_function16');
-    return _sqlite3_create_function16(
+        _dart_sqlite3_create_function16>('sqlite3_create_function16'))(
       db,
       zFunctionName,
       nArg,
@@ -4151,7 +4073,7 @@
     );
   }
 
-  _dart_sqlite3_create_function16 _sqlite3_create_function16;
+  _dart_sqlite3_create_function16? _sqlite3_create_function16;
 
   int sqlite3_create_function_v2(
     ffi.Pointer<sqlite3> db,
@@ -4164,10 +4086,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_40>> xFinal,
     ffi.Pointer<ffi.NativeFunction<_typedefC_41>> xDestroy,
   ) {
-    _sqlite3_create_function_v2 ??= _dylib.lookupFunction<
+    return (_sqlite3_create_function_v2 ??= _dylib.lookupFunction<
         _c_sqlite3_create_function_v2,
-        _dart_sqlite3_create_function_v2>('sqlite3_create_function_v2');
-    return _sqlite3_create_function_v2(
+        _dart_sqlite3_create_function_v2>('sqlite3_create_function_v2'))(
       db,
       zFunctionName,
       nArg,
@@ -4180,7 +4101,7 @@
     );
   }
 
-  _dart_sqlite3_create_function_v2 _sqlite3_create_function_v2;
+  _dart_sqlite3_create_function_v2? _sqlite3_create_function_v2;
 
   int sqlite3_create_window_function(
     ffi.Pointer<sqlite3> db,
@@ -4194,10 +4115,10 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_45>> xInverse,
     ffi.Pointer<ffi.NativeFunction<_typedefC_46>> xDestroy,
   ) {
-    _sqlite3_create_window_function ??= _dylib.lookupFunction<
-        _c_sqlite3_create_window_function,
-        _dart_sqlite3_create_window_function>('sqlite3_create_window_function');
-    return _sqlite3_create_window_function(
+    return (_sqlite3_create_window_function ??= _dylib.lookupFunction<
+            _c_sqlite3_create_window_function,
+            _dart_sqlite3_create_window_function>(
+        'sqlite3_create_window_function'))(
       db,
       zFunctionName,
       nArg,
@@ -4211,80 +4132,77 @@
     );
   }
 
-  _dart_sqlite3_create_window_function _sqlite3_create_window_function;
+  _dart_sqlite3_create_window_function? _sqlite3_create_window_function;
 
   int sqlite3_aggregate_count(
     ffi.Pointer<sqlite3_context> arg0,
   ) {
-    _sqlite3_aggregate_count ??= _dylib.lookupFunction<
+    return (_sqlite3_aggregate_count ??= _dylib.lookupFunction<
         _c_sqlite3_aggregate_count,
-        _dart_sqlite3_aggregate_count>('sqlite3_aggregate_count');
-    return _sqlite3_aggregate_count(
+        _dart_sqlite3_aggregate_count>('sqlite3_aggregate_count'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_aggregate_count _sqlite3_aggregate_count;
+  _dart_sqlite3_aggregate_count? _sqlite3_aggregate_count;
 
   int sqlite3_expired(
     ffi.Pointer<sqlite3_stmt> arg0,
   ) {
-    _sqlite3_expired ??=
+    return (_sqlite3_expired ??=
         _dylib.lookupFunction<_c_sqlite3_expired, _dart_sqlite3_expired>(
-            'sqlite3_expired');
-    return _sqlite3_expired(
+            'sqlite3_expired'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_expired _sqlite3_expired;
+  _dart_sqlite3_expired? _sqlite3_expired;
 
   int sqlite3_transfer_bindings(
     ffi.Pointer<sqlite3_stmt> arg0,
     ffi.Pointer<sqlite3_stmt> arg1,
   ) {
-    _sqlite3_transfer_bindings ??= _dylib.lookupFunction<
+    return (_sqlite3_transfer_bindings ??= _dylib.lookupFunction<
         _c_sqlite3_transfer_bindings,
-        _dart_sqlite3_transfer_bindings>('sqlite3_transfer_bindings');
-    return _sqlite3_transfer_bindings(
+        _dart_sqlite3_transfer_bindings>('sqlite3_transfer_bindings'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_transfer_bindings _sqlite3_transfer_bindings;
+  _dart_sqlite3_transfer_bindings? _sqlite3_transfer_bindings;
 
   int sqlite3_global_recover() {
-    _sqlite3_global_recover ??= _dylib.lookupFunction<_c_sqlite3_global_recover,
-        _dart_sqlite3_global_recover>('sqlite3_global_recover');
-    return _sqlite3_global_recover();
+    return (_sqlite3_global_recover ??= _dylib.lookupFunction<
+        _c_sqlite3_global_recover,
+        _dart_sqlite3_global_recover>('sqlite3_global_recover'))();
   }
 
-  _dart_sqlite3_global_recover _sqlite3_global_recover;
+  _dart_sqlite3_global_recover? _sqlite3_global_recover;
 
   void sqlite3_thread_cleanup() {
-    _sqlite3_thread_cleanup ??= _dylib.lookupFunction<_c_sqlite3_thread_cleanup,
-        _dart_sqlite3_thread_cleanup>('sqlite3_thread_cleanup');
-    return _sqlite3_thread_cleanup();
+    return (_sqlite3_thread_cleanup ??= _dylib.lookupFunction<
+        _c_sqlite3_thread_cleanup,
+        _dart_sqlite3_thread_cleanup>('sqlite3_thread_cleanup'))();
   }
 
-  _dart_sqlite3_thread_cleanup _sqlite3_thread_cleanup;
+  _dart_sqlite3_thread_cleanup? _sqlite3_thread_cleanup;
 
   int sqlite3_memory_alarm(
     ffi.Pointer<ffi.NativeFunction<_typedefC_47>> arg0,
     ffi.Pointer<ffi.Void> arg1,
     int arg2,
   ) {
-    _sqlite3_memory_alarm ??= _dylib.lookupFunction<_c_sqlite3_memory_alarm,
-        _dart_sqlite3_memory_alarm>('sqlite3_memory_alarm');
-    return _sqlite3_memory_alarm(
+    return (_sqlite3_memory_alarm ??= _dylib.lookupFunction<
+        _c_sqlite3_memory_alarm,
+        _dart_sqlite3_memory_alarm>('sqlite3_memory_alarm'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_memory_alarm _sqlite3_memory_alarm;
+  _dart_sqlite3_memory_alarm? _sqlite3_memory_alarm;
 
   /// CAPI3REF: Obtaining SQL Values
   /// METHOD: sqlite3_value
@@ -4415,189 +4333,184 @@
   ffi.Pointer<ffi.Void> sqlite3_value_blob(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_blob ??=
+    return (_sqlite3_value_blob ??=
         _dylib.lookupFunction<_c_sqlite3_value_blob, _dart_sqlite3_value_blob>(
-            'sqlite3_value_blob');
-    return _sqlite3_value_blob(
+            'sqlite3_value_blob'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_blob _sqlite3_value_blob;
+  _dart_sqlite3_value_blob? _sqlite3_value_blob;
 
   double sqlite3_value_double(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_double ??= _dylib.lookupFunction<_c_sqlite3_value_double,
-        _dart_sqlite3_value_double>('sqlite3_value_double');
-    return _sqlite3_value_double(
+    return (_sqlite3_value_double ??= _dylib.lookupFunction<
+        _c_sqlite3_value_double,
+        _dart_sqlite3_value_double>('sqlite3_value_double'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_double _sqlite3_value_double;
+  _dart_sqlite3_value_double? _sqlite3_value_double;
 
   int sqlite3_value_int(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_int ??=
+    return (_sqlite3_value_int ??=
         _dylib.lookupFunction<_c_sqlite3_value_int, _dart_sqlite3_value_int>(
-            'sqlite3_value_int');
-    return _sqlite3_value_int(
+            'sqlite3_value_int'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_int _sqlite3_value_int;
+  _dart_sqlite3_value_int? _sqlite3_value_int;
 
   int sqlite3_value_int64(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_int64 ??= _dylib.lookupFunction<_c_sqlite3_value_int64,
-        _dart_sqlite3_value_int64>('sqlite3_value_int64');
-    return _sqlite3_value_int64(
+    return (_sqlite3_value_int64 ??= _dylib.lookupFunction<
+        _c_sqlite3_value_int64,
+        _dart_sqlite3_value_int64>('sqlite3_value_int64'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_int64 _sqlite3_value_int64;
+  _dart_sqlite3_value_int64? _sqlite3_value_int64;
 
   ffi.Pointer<ffi.Void> sqlite3_value_pointer(
     ffi.Pointer<sqlite3_value> arg0,
     ffi.Pointer<ffi.Int8> arg1,
   ) {
-    _sqlite3_value_pointer ??= _dylib.lookupFunction<_c_sqlite3_value_pointer,
-        _dart_sqlite3_value_pointer>('sqlite3_value_pointer');
-    return _sqlite3_value_pointer(
+    return (_sqlite3_value_pointer ??= _dylib.lookupFunction<
+        _c_sqlite3_value_pointer,
+        _dart_sqlite3_value_pointer>('sqlite3_value_pointer'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_value_pointer _sqlite3_value_pointer;
+  _dart_sqlite3_value_pointer? _sqlite3_value_pointer;
 
   ffi.Pointer<ffi.Uint8> sqlite3_value_text(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_text ??=
+    return (_sqlite3_value_text ??=
         _dylib.lookupFunction<_c_sqlite3_value_text, _dart_sqlite3_value_text>(
-            'sqlite3_value_text');
-    return _sqlite3_value_text(
+            'sqlite3_value_text'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_text _sqlite3_value_text;
+  _dart_sqlite3_value_text? _sqlite3_value_text;
 
   ffi.Pointer<ffi.Void> sqlite3_value_text16(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_text16 ??= _dylib.lookupFunction<_c_sqlite3_value_text16,
-        _dart_sqlite3_value_text16>('sqlite3_value_text16');
-    return _sqlite3_value_text16(
+    return (_sqlite3_value_text16 ??= _dylib.lookupFunction<
+        _c_sqlite3_value_text16,
+        _dart_sqlite3_value_text16>('sqlite3_value_text16'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_text16 _sqlite3_value_text16;
+  _dart_sqlite3_value_text16? _sqlite3_value_text16;
 
   ffi.Pointer<ffi.Void> sqlite3_value_text16le(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_text16le ??= _dylib.lookupFunction<_c_sqlite3_value_text16le,
-        _dart_sqlite3_value_text16le>('sqlite3_value_text16le');
-    return _sqlite3_value_text16le(
+    return (_sqlite3_value_text16le ??= _dylib.lookupFunction<
+        _c_sqlite3_value_text16le,
+        _dart_sqlite3_value_text16le>('sqlite3_value_text16le'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_text16le _sqlite3_value_text16le;
+  _dart_sqlite3_value_text16le? _sqlite3_value_text16le;
 
   ffi.Pointer<ffi.Void> sqlite3_value_text16be(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_text16be ??= _dylib.lookupFunction<_c_sqlite3_value_text16be,
-        _dart_sqlite3_value_text16be>('sqlite3_value_text16be');
-    return _sqlite3_value_text16be(
+    return (_sqlite3_value_text16be ??= _dylib.lookupFunction<
+        _c_sqlite3_value_text16be,
+        _dart_sqlite3_value_text16be>('sqlite3_value_text16be'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_text16be _sqlite3_value_text16be;
+  _dart_sqlite3_value_text16be? _sqlite3_value_text16be;
 
   int sqlite3_value_bytes(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_bytes ??= _dylib.lookupFunction<_c_sqlite3_value_bytes,
-        _dart_sqlite3_value_bytes>('sqlite3_value_bytes');
-    return _sqlite3_value_bytes(
+    return (_sqlite3_value_bytes ??= _dylib.lookupFunction<
+        _c_sqlite3_value_bytes,
+        _dart_sqlite3_value_bytes>('sqlite3_value_bytes'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_bytes _sqlite3_value_bytes;
+  _dart_sqlite3_value_bytes? _sqlite3_value_bytes;
 
   int sqlite3_value_bytes16(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_bytes16 ??= _dylib.lookupFunction<_c_sqlite3_value_bytes16,
-        _dart_sqlite3_value_bytes16>('sqlite3_value_bytes16');
-    return _sqlite3_value_bytes16(
+    return (_sqlite3_value_bytes16 ??= _dylib.lookupFunction<
+        _c_sqlite3_value_bytes16,
+        _dart_sqlite3_value_bytes16>('sqlite3_value_bytes16'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_bytes16 _sqlite3_value_bytes16;
+  _dart_sqlite3_value_bytes16? _sqlite3_value_bytes16;
 
   int sqlite3_value_type(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_type ??=
+    return (_sqlite3_value_type ??=
         _dylib.lookupFunction<_c_sqlite3_value_type, _dart_sqlite3_value_type>(
-            'sqlite3_value_type');
-    return _sqlite3_value_type(
+            'sqlite3_value_type'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_type _sqlite3_value_type;
+  _dart_sqlite3_value_type? _sqlite3_value_type;
 
   int sqlite3_value_numeric_type(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_numeric_type ??= _dylib.lookupFunction<
+    return (_sqlite3_value_numeric_type ??= _dylib.lookupFunction<
         _c_sqlite3_value_numeric_type,
-        _dart_sqlite3_value_numeric_type>('sqlite3_value_numeric_type');
-    return _sqlite3_value_numeric_type(
+        _dart_sqlite3_value_numeric_type>('sqlite3_value_numeric_type'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_numeric_type _sqlite3_value_numeric_type;
+  _dart_sqlite3_value_numeric_type? _sqlite3_value_numeric_type;
 
   int sqlite3_value_nochange(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_nochange ??= _dylib.lookupFunction<_c_sqlite3_value_nochange,
-        _dart_sqlite3_value_nochange>('sqlite3_value_nochange');
-    return _sqlite3_value_nochange(
+    return (_sqlite3_value_nochange ??= _dylib.lookupFunction<
+        _c_sqlite3_value_nochange,
+        _dart_sqlite3_value_nochange>('sqlite3_value_nochange'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_nochange _sqlite3_value_nochange;
+  _dart_sqlite3_value_nochange? _sqlite3_value_nochange;
 
   int sqlite3_value_frombind(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_frombind ??= _dylib.lookupFunction<_c_sqlite3_value_frombind,
-        _dart_sqlite3_value_frombind>('sqlite3_value_frombind');
-    return _sqlite3_value_frombind(
+    return (_sqlite3_value_frombind ??= _dylib.lookupFunction<
+        _c_sqlite3_value_frombind,
+        _dart_sqlite3_value_frombind>('sqlite3_value_frombind'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_frombind _sqlite3_value_frombind;
+  _dart_sqlite3_value_frombind? _sqlite3_value_frombind;
 
   /// CAPI3REF: Finding The Subtype Of SQL Values
   /// METHOD: sqlite3_value
@@ -4610,14 +4523,14 @@
   int sqlite3_value_subtype(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_subtype ??= _dylib.lookupFunction<_c_sqlite3_value_subtype,
-        _dart_sqlite3_value_subtype>('sqlite3_value_subtype');
-    return _sqlite3_value_subtype(
+    return (_sqlite3_value_subtype ??= _dylib.lookupFunction<
+        _c_sqlite3_value_subtype,
+        _dart_sqlite3_value_subtype>('sqlite3_value_subtype'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_subtype _sqlite3_value_subtype;
+  _dart_sqlite3_value_subtype? _sqlite3_value_subtype;
 
   /// CAPI3REF: Copy And Free SQL Values
   /// METHOD: sqlite3_value
@@ -4634,28 +4547,26 @@
   ffi.Pointer<sqlite3_value> sqlite3_value_dup(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_dup ??=
+    return (_sqlite3_value_dup ??=
         _dylib.lookupFunction<_c_sqlite3_value_dup, _dart_sqlite3_value_dup>(
-            'sqlite3_value_dup');
-    return _sqlite3_value_dup(
+            'sqlite3_value_dup'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_dup _sqlite3_value_dup;
+  _dart_sqlite3_value_dup? _sqlite3_value_dup;
 
   void sqlite3_value_free(
     ffi.Pointer<sqlite3_value> arg0,
   ) {
-    _sqlite3_value_free ??=
+    return (_sqlite3_value_free ??=
         _dylib.lookupFunction<_c_sqlite3_value_free, _dart_sqlite3_value_free>(
-            'sqlite3_value_free');
-    return _sqlite3_value_free(
+            'sqlite3_value_free'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_value_free _sqlite3_value_free;
+  _dart_sqlite3_value_free? _sqlite3_value_free;
 
   /// CAPI3REF: Obtain Aggregate Function Context
   /// METHOD: sqlite3_context
@@ -4702,16 +4613,15 @@
     ffi.Pointer<sqlite3_context> arg0,
     int nBytes,
   ) {
-    _sqlite3_aggregate_context ??= _dylib.lookupFunction<
+    return (_sqlite3_aggregate_context ??= _dylib.lookupFunction<
         _c_sqlite3_aggregate_context,
-        _dart_sqlite3_aggregate_context>('sqlite3_aggregate_context');
-    return _sqlite3_aggregate_context(
+        _dart_sqlite3_aggregate_context>('sqlite3_aggregate_context'))(
       arg0,
       nBytes,
     );
   }
 
-  _dart_sqlite3_aggregate_context _sqlite3_aggregate_context;
+  _dart_sqlite3_aggregate_context? _sqlite3_aggregate_context;
 
   /// CAPI3REF: User Data For Functions
   /// METHOD: sqlite3_context
@@ -4727,15 +4637,14 @@
   ffi.Pointer<ffi.Void> sqlite3_user_data(
     ffi.Pointer<sqlite3_context> arg0,
   ) {
-    _sqlite3_user_data ??=
+    return (_sqlite3_user_data ??=
         _dylib.lookupFunction<_c_sqlite3_user_data, _dart_sqlite3_user_data>(
-            'sqlite3_user_data');
-    return _sqlite3_user_data(
+            'sqlite3_user_data'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_user_data _sqlite3_user_data;
+  _dart_sqlite3_user_data? _sqlite3_user_data;
 
   /// CAPI3REF: Database Connection For Functions
   /// METHOD: sqlite3_context
@@ -4748,15 +4657,14 @@
   ffi.Pointer<sqlite3> sqlite3_context_db_handle(
     ffi.Pointer<sqlite3_context> arg0,
   ) {
-    _sqlite3_context_db_handle ??= _dylib.lookupFunction<
+    return (_sqlite3_context_db_handle ??= _dylib.lookupFunction<
         _c_sqlite3_context_db_handle,
-        _dart_sqlite3_context_db_handle>('sqlite3_context_db_handle');
-    return _sqlite3_context_db_handle(
+        _dart_sqlite3_context_db_handle>('sqlite3_context_db_handle'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_context_db_handle _sqlite3_context_db_handle;
+  _dart_sqlite3_context_db_handle? _sqlite3_context_db_handle;
 
   /// CAPI3REF: Function Auxiliary Data
   /// METHOD: sqlite3_context
@@ -4817,15 +4725,15 @@
     ffi.Pointer<sqlite3_context> arg0,
     int N,
   ) {
-    _sqlite3_get_auxdata ??= _dylib.lookupFunction<_c_sqlite3_get_auxdata,
-        _dart_sqlite3_get_auxdata>('sqlite3_get_auxdata');
-    return _sqlite3_get_auxdata(
+    return (_sqlite3_get_auxdata ??= _dylib.lookupFunction<
+        _c_sqlite3_get_auxdata,
+        _dart_sqlite3_get_auxdata>('sqlite3_get_auxdata'))(
       arg0,
       N,
     );
   }
 
-  _dart_sqlite3_get_auxdata _sqlite3_get_auxdata;
+  _dart_sqlite3_get_auxdata? _sqlite3_get_auxdata;
 
   void sqlite3_set_auxdata(
     ffi.Pointer<sqlite3_context> arg0,
@@ -4833,9 +4741,9 @@
     ffi.Pointer<ffi.Void> arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_48>> arg3,
   ) {
-    _sqlite3_set_auxdata ??= _dylib.lookupFunction<_c_sqlite3_set_auxdata,
-        _dart_sqlite3_set_auxdata>('sqlite3_set_auxdata');
-    return _sqlite3_set_auxdata(
+    return (_sqlite3_set_auxdata ??= _dylib.lookupFunction<
+        _c_sqlite3_set_auxdata,
+        _dart_sqlite3_set_auxdata>('sqlite3_set_auxdata'))(
       arg0,
       N,
       arg2,
@@ -4843,7 +4751,7 @@
     );
   }
 
-  _dart_sqlite3_set_auxdata _sqlite3_set_auxdata;
+  _dart_sqlite3_set_auxdata? _sqlite3_set_auxdata;
 
   /// CAPI3REF: Setting The Result Of An SQL Function
   /// METHOD: sqlite3_context
@@ -4995,9 +4903,9 @@
     int arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_49>> arg3,
   ) {
-    _sqlite3_result_blob ??= _dylib.lookupFunction<_c_sqlite3_result_blob,
-        _dart_sqlite3_result_blob>('sqlite3_result_blob');
-    return _sqlite3_result_blob(
+    return (_sqlite3_result_blob ??= _dylib.lookupFunction<
+        _c_sqlite3_result_blob,
+        _dart_sqlite3_result_blob>('sqlite3_result_blob'))(
       arg0,
       arg1,
       arg2,
@@ -5005,7 +4913,7 @@
     );
   }
 
-  _dart_sqlite3_result_blob _sqlite3_result_blob;
+  _dart_sqlite3_result_blob? _sqlite3_result_blob;
 
   void sqlite3_result_blob64(
     ffi.Pointer<sqlite3_context> arg0,
@@ -5013,9 +4921,9 @@
     int arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_50>> arg3,
   ) {
-    _sqlite3_result_blob64 ??= _dylib.lookupFunction<_c_sqlite3_result_blob64,
-        _dart_sqlite3_result_blob64>('sqlite3_result_blob64');
-    return _sqlite3_result_blob64(
+    return (_sqlite3_result_blob64 ??= _dylib.lookupFunction<
+        _c_sqlite3_result_blob64,
+        _dart_sqlite3_result_blob64>('sqlite3_result_blob64'))(
       arg0,
       arg1,
       arg2,
@@ -5023,135 +4931,131 @@
     );
   }
 
-  _dart_sqlite3_result_blob64 _sqlite3_result_blob64;
+  _dart_sqlite3_result_blob64? _sqlite3_result_blob64;
 
   void sqlite3_result_double(
     ffi.Pointer<sqlite3_context> arg0,
     double arg1,
   ) {
-    _sqlite3_result_double ??= _dylib.lookupFunction<_c_sqlite3_result_double,
-        _dart_sqlite3_result_double>('sqlite3_result_double');
-    return _sqlite3_result_double(
+    return (_sqlite3_result_double ??= _dylib.lookupFunction<
+        _c_sqlite3_result_double,
+        _dart_sqlite3_result_double>('sqlite3_result_double'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_result_double _sqlite3_result_double;
+  _dart_sqlite3_result_double? _sqlite3_result_double;
 
   void sqlite3_result_error(
     ffi.Pointer<sqlite3_context> arg0,
     ffi.Pointer<ffi.Int8> arg1,
     int arg2,
   ) {
-    _sqlite3_result_error ??= _dylib.lookupFunction<_c_sqlite3_result_error,
-        _dart_sqlite3_result_error>('sqlite3_result_error');
-    return _sqlite3_result_error(
+    return (_sqlite3_result_error ??= _dylib.lookupFunction<
+        _c_sqlite3_result_error,
+        _dart_sqlite3_result_error>('sqlite3_result_error'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_result_error _sqlite3_result_error;
+  _dart_sqlite3_result_error? _sqlite3_result_error;
 
   void sqlite3_result_error16(
     ffi.Pointer<sqlite3_context> arg0,
     ffi.Pointer<ffi.Void> arg1,
     int arg2,
   ) {
-    _sqlite3_result_error16 ??= _dylib.lookupFunction<_c_sqlite3_result_error16,
-        _dart_sqlite3_result_error16>('sqlite3_result_error16');
-    return _sqlite3_result_error16(
+    return (_sqlite3_result_error16 ??= _dylib.lookupFunction<
+        _c_sqlite3_result_error16,
+        _dart_sqlite3_result_error16>('sqlite3_result_error16'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_result_error16 _sqlite3_result_error16;
+  _dart_sqlite3_result_error16? _sqlite3_result_error16;
 
   void sqlite3_result_error_toobig(
     ffi.Pointer<sqlite3_context> arg0,
   ) {
-    _sqlite3_result_error_toobig ??= _dylib.lookupFunction<
+    return (_sqlite3_result_error_toobig ??= _dylib.lookupFunction<
         _c_sqlite3_result_error_toobig,
-        _dart_sqlite3_result_error_toobig>('sqlite3_result_error_toobig');
-    return _sqlite3_result_error_toobig(
+        _dart_sqlite3_result_error_toobig>('sqlite3_result_error_toobig'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_result_error_toobig _sqlite3_result_error_toobig;
+  _dart_sqlite3_result_error_toobig? _sqlite3_result_error_toobig;
 
   void sqlite3_result_error_nomem(
     ffi.Pointer<sqlite3_context> arg0,
   ) {
-    _sqlite3_result_error_nomem ??= _dylib.lookupFunction<
+    return (_sqlite3_result_error_nomem ??= _dylib.lookupFunction<
         _c_sqlite3_result_error_nomem,
-        _dart_sqlite3_result_error_nomem>('sqlite3_result_error_nomem');
-    return _sqlite3_result_error_nomem(
+        _dart_sqlite3_result_error_nomem>('sqlite3_result_error_nomem'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_result_error_nomem _sqlite3_result_error_nomem;
+  _dart_sqlite3_result_error_nomem? _sqlite3_result_error_nomem;
 
   void sqlite3_result_error_code(
     ffi.Pointer<sqlite3_context> arg0,
     int arg1,
   ) {
-    _sqlite3_result_error_code ??= _dylib.lookupFunction<
+    return (_sqlite3_result_error_code ??= _dylib.lookupFunction<
         _c_sqlite3_result_error_code,
-        _dart_sqlite3_result_error_code>('sqlite3_result_error_code');
-    return _sqlite3_result_error_code(
+        _dart_sqlite3_result_error_code>('sqlite3_result_error_code'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_result_error_code _sqlite3_result_error_code;
+  _dart_sqlite3_result_error_code? _sqlite3_result_error_code;
 
   void sqlite3_result_int(
     ffi.Pointer<sqlite3_context> arg0,
     int arg1,
   ) {
-    _sqlite3_result_int ??=
+    return (_sqlite3_result_int ??=
         _dylib.lookupFunction<_c_sqlite3_result_int, _dart_sqlite3_result_int>(
-            'sqlite3_result_int');
-    return _sqlite3_result_int(
+            'sqlite3_result_int'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_result_int _sqlite3_result_int;
+  _dart_sqlite3_result_int? _sqlite3_result_int;
 
   void sqlite3_result_int64(
     ffi.Pointer<sqlite3_context> arg0,
     int arg1,
   ) {
-    _sqlite3_result_int64 ??= _dylib.lookupFunction<_c_sqlite3_result_int64,
-        _dart_sqlite3_result_int64>('sqlite3_result_int64');
-    return _sqlite3_result_int64(
+    return (_sqlite3_result_int64 ??= _dylib.lookupFunction<
+        _c_sqlite3_result_int64,
+        _dart_sqlite3_result_int64>('sqlite3_result_int64'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_result_int64 _sqlite3_result_int64;
+  _dart_sqlite3_result_int64? _sqlite3_result_int64;
 
   void sqlite3_result_null(
     ffi.Pointer<sqlite3_context> arg0,
   ) {
-    _sqlite3_result_null ??= _dylib.lookupFunction<_c_sqlite3_result_null,
-        _dart_sqlite3_result_null>('sqlite3_result_null');
-    return _sqlite3_result_null(
+    return (_sqlite3_result_null ??= _dylib.lookupFunction<
+        _c_sqlite3_result_null,
+        _dart_sqlite3_result_null>('sqlite3_result_null'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_result_null _sqlite3_result_null;
+  _dart_sqlite3_result_null? _sqlite3_result_null;
 
   void sqlite3_result_text(
     ffi.Pointer<sqlite3_context> arg0,
@@ -5159,9 +5063,9 @@
     int arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_51>> arg3,
   ) {
-    _sqlite3_result_text ??= _dylib.lookupFunction<_c_sqlite3_result_text,
-        _dart_sqlite3_result_text>('sqlite3_result_text');
-    return _sqlite3_result_text(
+    return (_sqlite3_result_text ??= _dylib.lookupFunction<
+        _c_sqlite3_result_text,
+        _dart_sqlite3_result_text>('sqlite3_result_text'))(
       arg0,
       arg1,
       arg2,
@@ -5169,7 +5073,7 @@
     );
   }
 
-  _dart_sqlite3_result_text _sqlite3_result_text;
+  _dart_sqlite3_result_text? _sqlite3_result_text;
 
   void sqlite3_result_text64(
     ffi.Pointer<sqlite3_context> arg0,
@@ -5178,9 +5082,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_52>> arg3,
     int encoding,
   ) {
-    _sqlite3_result_text64 ??= _dylib.lookupFunction<_c_sqlite3_result_text64,
-        _dart_sqlite3_result_text64>('sqlite3_result_text64');
-    return _sqlite3_result_text64(
+    return (_sqlite3_result_text64 ??= _dylib.lookupFunction<
+        _c_sqlite3_result_text64,
+        _dart_sqlite3_result_text64>('sqlite3_result_text64'))(
       arg0,
       arg1,
       arg2,
@@ -5189,7 +5093,7 @@
     );
   }
 
-  _dart_sqlite3_result_text64 _sqlite3_result_text64;
+  _dart_sqlite3_result_text64? _sqlite3_result_text64;
 
   void sqlite3_result_text16(
     ffi.Pointer<sqlite3_context> arg0,
@@ -5197,9 +5101,9 @@
     int arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_53>> arg3,
   ) {
-    _sqlite3_result_text16 ??= _dylib.lookupFunction<_c_sqlite3_result_text16,
-        _dart_sqlite3_result_text16>('sqlite3_result_text16');
-    return _sqlite3_result_text16(
+    return (_sqlite3_result_text16 ??= _dylib.lookupFunction<
+        _c_sqlite3_result_text16,
+        _dart_sqlite3_result_text16>('sqlite3_result_text16'))(
       arg0,
       arg1,
       arg2,
@@ -5207,7 +5111,7 @@
     );
   }
 
-  _dart_sqlite3_result_text16 _sqlite3_result_text16;
+  _dart_sqlite3_result_text16? _sqlite3_result_text16;
 
   void sqlite3_result_text16le(
     ffi.Pointer<sqlite3_context> arg0,
@@ -5215,10 +5119,9 @@
     int arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_54>> arg3,
   ) {
-    _sqlite3_result_text16le ??= _dylib.lookupFunction<
+    return (_sqlite3_result_text16le ??= _dylib.lookupFunction<
         _c_sqlite3_result_text16le,
-        _dart_sqlite3_result_text16le>('sqlite3_result_text16le');
-    return _sqlite3_result_text16le(
+        _dart_sqlite3_result_text16le>('sqlite3_result_text16le'))(
       arg0,
       arg1,
       arg2,
@@ -5226,7 +5129,7 @@
     );
   }
 
-  _dart_sqlite3_result_text16le _sqlite3_result_text16le;
+  _dart_sqlite3_result_text16le? _sqlite3_result_text16le;
 
   void sqlite3_result_text16be(
     ffi.Pointer<sqlite3_context> arg0,
@@ -5234,10 +5137,9 @@
     int arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_55>> arg3,
   ) {
-    _sqlite3_result_text16be ??= _dylib.lookupFunction<
+    return (_sqlite3_result_text16be ??= _dylib.lookupFunction<
         _c_sqlite3_result_text16be,
-        _dart_sqlite3_result_text16be>('sqlite3_result_text16be');
-    return _sqlite3_result_text16be(
+        _dart_sqlite3_result_text16be>('sqlite3_result_text16be'))(
       arg0,
       arg1,
       arg2,
@@ -5245,21 +5147,21 @@
     );
   }
 
-  _dart_sqlite3_result_text16be _sqlite3_result_text16be;
+  _dart_sqlite3_result_text16be? _sqlite3_result_text16be;
 
   void sqlite3_result_value(
     ffi.Pointer<sqlite3_context> arg0,
     ffi.Pointer<sqlite3_value> arg1,
   ) {
-    _sqlite3_result_value ??= _dylib.lookupFunction<_c_sqlite3_result_value,
-        _dart_sqlite3_result_value>('sqlite3_result_value');
-    return _sqlite3_result_value(
+    return (_sqlite3_result_value ??= _dylib.lookupFunction<
+        _c_sqlite3_result_value,
+        _dart_sqlite3_result_value>('sqlite3_result_value'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_result_value _sqlite3_result_value;
+  _dart_sqlite3_result_value? _sqlite3_result_value;
 
   void sqlite3_result_pointer(
     ffi.Pointer<sqlite3_context> arg0,
@@ -5267,9 +5169,9 @@
     ffi.Pointer<ffi.Int8> arg2,
     ffi.Pointer<ffi.NativeFunction<_typedefC_56>> arg3,
   ) {
-    _sqlite3_result_pointer ??= _dylib.lookupFunction<_c_sqlite3_result_pointer,
-        _dart_sqlite3_result_pointer>('sqlite3_result_pointer');
-    return _sqlite3_result_pointer(
+    return (_sqlite3_result_pointer ??= _dylib.lookupFunction<
+        _c_sqlite3_result_pointer,
+        _dart_sqlite3_result_pointer>('sqlite3_result_pointer'))(
       arg0,
       arg1,
       arg2,
@@ -5277,37 +5179,35 @@
     );
   }
 
-  _dart_sqlite3_result_pointer _sqlite3_result_pointer;
+  _dart_sqlite3_result_pointer? _sqlite3_result_pointer;
 
   void sqlite3_result_zeroblob(
     ffi.Pointer<sqlite3_context> arg0,
     int n,
   ) {
-    _sqlite3_result_zeroblob ??= _dylib.lookupFunction<
+    return (_sqlite3_result_zeroblob ??= _dylib.lookupFunction<
         _c_sqlite3_result_zeroblob,
-        _dart_sqlite3_result_zeroblob>('sqlite3_result_zeroblob');
-    return _sqlite3_result_zeroblob(
+        _dart_sqlite3_result_zeroblob>('sqlite3_result_zeroblob'))(
       arg0,
       n,
     );
   }
 
-  _dart_sqlite3_result_zeroblob _sqlite3_result_zeroblob;
+  _dart_sqlite3_result_zeroblob? _sqlite3_result_zeroblob;
 
   int sqlite3_result_zeroblob64(
     ffi.Pointer<sqlite3_context> arg0,
     int n,
   ) {
-    _sqlite3_result_zeroblob64 ??= _dylib.lookupFunction<
+    return (_sqlite3_result_zeroblob64 ??= _dylib.lookupFunction<
         _c_sqlite3_result_zeroblob64,
-        _dart_sqlite3_result_zeroblob64>('sqlite3_result_zeroblob64');
-    return _sqlite3_result_zeroblob64(
+        _dart_sqlite3_result_zeroblob64>('sqlite3_result_zeroblob64'))(
       arg0,
       n,
     );
   }
 
-  _dart_sqlite3_result_zeroblob64 _sqlite3_result_zeroblob64;
+  _dart_sqlite3_result_zeroblob64? _sqlite3_result_zeroblob64;
 
   /// CAPI3REF: Setting The Subtype Of An SQL Function
   /// METHOD: sqlite3_context
@@ -5323,15 +5223,15 @@
     ffi.Pointer<sqlite3_context> arg0,
     int arg1,
   ) {
-    _sqlite3_result_subtype ??= _dylib.lookupFunction<_c_sqlite3_result_subtype,
-        _dart_sqlite3_result_subtype>('sqlite3_result_subtype');
-    return _sqlite3_result_subtype(
+    return (_sqlite3_result_subtype ??= _dylib.lookupFunction<
+        _c_sqlite3_result_subtype,
+        _dart_sqlite3_result_subtype>('sqlite3_result_subtype'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_result_subtype _sqlite3_result_subtype;
+  _dart_sqlite3_result_subtype? _sqlite3_result_subtype;
 
   /// CAPI3REF: Define New Collating Sequences
   /// METHOD: sqlite3
@@ -5419,10 +5319,9 @@
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<ffi.NativeFunction<_typedefC_57>> xCompare,
   ) {
-    _sqlite3_create_collation ??= _dylib.lookupFunction<
+    return (_sqlite3_create_collation ??= _dylib.lookupFunction<
         _c_sqlite3_create_collation,
-        _dart_sqlite3_create_collation>('sqlite3_create_collation');
-    return _sqlite3_create_collation(
+        _dart_sqlite3_create_collation>('sqlite3_create_collation'))(
       arg0,
       zName,
       eTextRep,
@@ -5431,7 +5330,7 @@
     );
   }
 
-  _dart_sqlite3_create_collation _sqlite3_create_collation;
+  _dart_sqlite3_create_collation? _sqlite3_create_collation;
 
   int sqlite3_create_collation_v2(
     ffi.Pointer<sqlite3> arg0,
@@ -5441,10 +5340,9 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_58>> xCompare,
     ffi.Pointer<ffi.NativeFunction<_typedefC_59>> xDestroy,
   ) {
-    _sqlite3_create_collation_v2 ??= _dylib.lookupFunction<
+    return (_sqlite3_create_collation_v2 ??= _dylib.lookupFunction<
         _c_sqlite3_create_collation_v2,
-        _dart_sqlite3_create_collation_v2>('sqlite3_create_collation_v2');
-    return _sqlite3_create_collation_v2(
+        _dart_sqlite3_create_collation_v2>('sqlite3_create_collation_v2'))(
       arg0,
       zName,
       eTextRep,
@@ -5454,7 +5352,7 @@
     );
   }
 
-  _dart_sqlite3_create_collation_v2 _sqlite3_create_collation_v2;
+  _dart_sqlite3_create_collation_v2? _sqlite3_create_collation_v2;
 
   int sqlite3_create_collation16(
     ffi.Pointer<sqlite3> arg0,
@@ -5463,10 +5361,9 @@
     ffi.Pointer<ffi.Void> pArg,
     ffi.Pointer<ffi.NativeFunction<_typedefC_60>> xCompare,
   ) {
-    _sqlite3_create_collation16 ??= _dylib.lookupFunction<
+    return (_sqlite3_create_collation16 ??= _dylib.lookupFunction<
         _c_sqlite3_create_collation16,
-        _dart_sqlite3_create_collation16>('sqlite3_create_collation16');
-    return _sqlite3_create_collation16(
+        _dart_sqlite3_create_collation16>('sqlite3_create_collation16'))(
       arg0,
       zName,
       eTextRep,
@@ -5475,7 +5372,7 @@
     );
   }
 
-  _dart_sqlite3_create_collation16 _sqlite3_create_collation16;
+  _dart_sqlite3_create_collation16? _sqlite3_create_collation16;
 
   /// CAPI3REF: Collation Needed Callbacks
   /// METHOD: sqlite3
@@ -5507,34 +5404,32 @@
     ffi.Pointer<ffi.Void> arg1,
     ffi.Pointer<ffi.NativeFunction<_typedefC_61>> arg2,
   ) {
-    _sqlite3_collation_needed ??= _dylib.lookupFunction<
+    return (_sqlite3_collation_needed ??= _dylib.lookupFunction<
         _c_sqlite3_collation_needed,
-        _dart_sqlite3_collation_needed>('sqlite3_collation_needed');
-    return _sqlite3_collation_needed(
+        _dart_sqlite3_collation_needed>('sqlite3_collation_needed'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_collation_needed _sqlite3_collation_needed;
+  _dart_sqlite3_collation_needed? _sqlite3_collation_needed;
 
   int sqlite3_collation_needed16(
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<ffi.Void> arg1,
     ffi.Pointer<ffi.NativeFunction<_typedefC_62>> arg2,
   ) {
-    _sqlite3_collation_needed16 ??= _dylib.lookupFunction<
+    return (_sqlite3_collation_needed16 ??= _dylib.lookupFunction<
         _c_sqlite3_collation_needed16,
-        _dart_sqlite3_collation_needed16>('sqlite3_collation_needed16');
-    return _sqlite3_collation_needed16(
+        _dart_sqlite3_collation_needed16>('sqlite3_collation_needed16'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_collation_needed16 _sqlite3_collation_needed16;
+  _dart_sqlite3_collation_needed16? _sqlite3_collation_needed16;
 
   /// CAPI3REF: Suspend Execution For A Short Time
   ///
@@ -5554,14 +5449,14 @@
   int sqlite3_sleep(
     int arg0,
   ) {
-    _sqlite3_sleep ??= _dylib
-        .lookupFunction<_c_sqlite3_sleep, _dart_sqlite3_sleep>('sqlite3_sleep');
-    return _sqlite3_sleep(
+    return (_sqlite3_sleep ??=
+        _dylib.lookupFunction<_c_sqlite3_sleep, _dart_sqlite3_sleep>(
+            'sqlite3_sleep'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_sleep _sqlite3_sleep;
+  _dart_sqlite3_sleep? _sqlite3_sleep;
 
   /// CAPI3REF: Win32 Specific Interface
   ///
@@ -5584,46 +5479,43 @@
     int type,
     ffi.Pointer<ffi.Void> zValue,
   ) {
-    _sqlite3_win32_set_directory ??= _dylib.lookupFunction<
+    return (_sqlite3_win32_set_directory ??= _dylib.lookupFunction<
         _c_sqlite3_win32_set_directory,
-        _dart_sqlite3_win32_set_directory>('sqlite3_win32_set_directory');
-    return _sqlite3_win32_set_directory(
+        _dart_sqlite3_win32_set_directory>('sqlite3_win32_set_directory'))(
       type,
       zValue,
     );
   }
 
-  _dart_sqlite3_win32_set_directory _sqlite3_win32_set_directory;
+  _dart_sqlite3_win32_set_directory? _sqlite3_win32_set_directory;
 
   int sqlite3_win32_set_directory8(
     int type,
     ffi.Pointer<ffi.Int8> zValue,
   ) {
-    _sqlite3_win32_set_directory8 ??= _dylib.lookupFunction<
+    return (_sqlite3_win32_set_directory8 ??= _dylib.lookupFunction<
         _c_sqlite3_win32_set_directory8,
-        _dart_sqlite3_win32_set_directory8>('sqlite3_win32_set_directory8');
-    return _sqlite3_win32_set_directory8(
+        _dart_sqlite3_win32_set_directory8>('sqlite3_win32_set_directory8'))(
       type,
       zValue,
     );
   }
 
-  _dart_sqlite3_win32_set_directory8 _sqlite3_win32_set_directory8;
+  _dart_sqlite3_win32_set_directory8? _sqlite3_win32_set_directory8;
 
   int sqlite3_win32_set_directory16(
     int type,
     ffi.Pointer<ffi.Void> zValue,
   ) {
-    _sqlite3_win32_set_directory16 ??= _dylib.lookupFunction<
+    return (_sqlite3_win32_set_directory16 ??= _dylib.lookupFunction<
         _c_sqlite3_win32_set_directory16,
-        _dart_sqlite3_win32_set_directory16>('sqlite3_win32_set_directory16');
-    return _sqlite3_win32_set_directory16(
+        _dart_sqlite3_win32_set_directory16>('sqlite3_win32_set_directory16'))(
       type,
       zValue,
     );
   }
 
-  _dart_sqlite3_win32_set_directory16 _sqlite3_win32_set_directory16;
+  _dart_sqlite3_win32_set_directory16? _sqlite3_win32_set_directory16;
 
   /// CAPI3REF: Test For Auto-Commit Mode
   /// KEYWORDS: {autocommit mode}
@@ -5648,14 +5540,14 @@
   int sqlite3_get_autocommit(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_get_autocommit ??= _dylib.lookupFunction<_c_sqlite3_get_autocommit,
-        _dart_sqlite3_get_autocommit>('sqlite3_get_autocommit');
-    return _sqlite3_get_autocommit(
+    return (_sqlite3_get_autocommit ??= _dylib.lookupFunction<
+        _c_sqlite3_get_autocommit,
+        _dart_sqlite3_get_autocommit>('sqlite3_get_autocommit'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_get_autocommit _sqlite3_get_autocommit;
+  _dart_sqlite3_get_autocommit? _sqlite3_get_autocommit;
 
   /// CAPI3REF: Find The Database Handle Of A Prepared Statement
   /// METHOD: sqlite3_stmt
@@ -5669,15 +5561,14 @@
   ffi.Pointer<sqlite3> sqlite3_db_handle(
     ffi.Pointer<sqlite3_stmt> arg0,
   ) {
-    _sqlite3_db_handle ??=
+    return (_sqlite3_db_handle ??=
         _dylib.lookupFunction<_c_sqlite3_db_handle, _dart_sqlite3_db_handle>(
-            'sqlite3_db_handle');
-    return _sqlite3_db_handle(
+            'sqlite3_db_handle'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_db_handle _sqlite3_db_handle;
+  _dart_sqlite3_db_handle? _sqlite3_db_handle;
 
   /// CAPI3REF: Return The Filename For A Database Connection
   /// METHOD: sqlite3
@@ -5711,15 +5602,15 @@
     ffi.Pointer<sqlite3> db,
     ffi.Pointer<ffi.Int8> zDbName,
   ) {
-    _sqlite3_db_filename ??= _dylib.lookupFunction<_c_sqlite3_db_filename,
-        _dart_sqlite3_db_filename>('sqlite3_db_filename');
-    return _sqlite3_db_filename(
+    return (_sqlite3_db_filename ??= _dylib.lookupFunction<
+        _c_sqlite3_db_filename,
+        _dart_sqlite3_db_filename>('sqlite3_db_filename'))(
       db,
       zDbName,
     );
   }
 
-  _dart_sqlite3_db_filename _sqlite3_db_filename;
+  _dart_sqlite3_db_filename? _sqlite3_db_filename;
 
   /// CAPI3REF: Determine if a database is read-only
   /// METHOD: sqlite3
@@ -5731,15 +5622,15 @@
     ffi.Pointer<sqlite3> db,
     ffi.Pointer<ffi.Int8> zDbName,
   ) {
-    _sqlite3_db_readonly ??= _dylib.lookupFunction<_c_sqlite3_db_readonly,
-        _dart_sqlite3_db_readonly>('sqlite3_db_readonly');
-    return _sqlite3_db_readonly(
+    return (_sqlite3_db_readonly ??= _dylib.lookupFunction<
+        _c_sqlite3_db_readonly,
+        _dart_sqlite3_db_readonly>('sqlite3_db_readonly'))(
       db,
       zDbName,
     );
   }
 
-  _dart_sqlite3_db_readonly _sqlite3_db_readonly;
+  _dart_sqlite3_db_readonly? _sqlite3_db_readonly;
 
   /// CAPI3REF: Find the next prepared statement
   /// METHOD: sqlite3
@@ -5757,16 +5648,15 @@
     ffi.Pointer<sqlite3> pDb,
     ffi.Pointer<sqlite3_stmt> pStmt,
   ) {
-    _sqlite3_next_stmt ??=
+    return (_sqlite3_next_stmt ??=
         _dylib.lookupFunction<_c_sqlite3_next_stmt, _dart_sqlite3_next_stmt>(
-            'sqlite3_next_stmt');
-    return _sqlite3_next_stmt(
+            'sqlite3_next_stmt'))(
       pDb,
       pStmt,
     );
   }
 
-  _dart_sqlite3_next_stmt _sqlite3_next_stmt;
+  _dart_sqlite3_next_stmt? _sqlite3_next_stmt;
 
   /// CAPI3REF: Commit And Rollback Notification Callbacks
   /// METHOD: sqlite3
@@ -5818,32 +5708,32 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_63>> arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
-    _sqlite3_commit_hook ??= _dylib.lookupFunction<_c_sqlite3_commit_hook,
-        _dart_sqlite3_commit_hook>('sqlite3_commit_hook');
-    return _sqlite3_commit_hook(
+    return (_sqlite3_commit_hook ??= _dylib.lookupFunction<
+        _c_sqlite3_commit_hook,
+        _dart_sqlite3_commit_hook>('sqlite3_commit_hook'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_commit_hook _sqlite3_commit_hook;
+  _dart_sqlite3_commit_hook? _sqlite3_commit_hook;
 
   ffi.Pointer<ffi.Void> sqlite3_rollback_hook(
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<ffi.NativeFunction<_typedefC_64>> arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
-    _sqlite3_rollback_hook ??= _dylib.lookupFunction<_c_sqlite3_rollback_hook,
-        _dart_sqlite3_rollback_hook>('sqlite3_rollback_hook');
-    return _sqlite3_rollback_hook(
+    return (_sqlite3_rollback_hook ??= _dylib.lookupFunction<
+        _c_sqlite3_rollback_hook,
+        _dart_sqlite3_rollback_hook>('sqlite3_rollback_hook'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_rollback_hook _sqlite3_rollback_hook;
+  _dart_sqlite3_rollback_hook? _sqlite3_rollback_hook;
 
   /// CAPI3REF: Data Change Notification Callbacks
   /// METHOD: sqlite3
@@ -5897,16 +5787,16 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_65>> arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
-    _sqlite3_update_hook ??= _dylib.lookupFunction<_c_sqlite3_update_hook,
-        _dart_sqlite3_update_hook>('sqlite3_update_hook');
-    return _sqlite3_update_hook(
+    return (_sqlite3_update_hook ??= _dylib.lookupFunction<
+        _c_sqlite3_update_hook,
+        _dart_sqlite3_update_hook>('sqlite3_update_hook'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_update_hook _sqlite3_update_hook;
+  _dart_sqlite3_update_hook? _sqlite3_update_hook;
 
   /// CAPI3REF: Enable Or Disable Shared Pager Cache
   ///
@@ -5948,15 +5838,14 @@
   int sqlite3_enable_shared_cache(
     int arg0,
   ) {
-    _sqlite3_enable_shared_cache ??= _dylib.lookupFunction<
+    return (_sqlite3_enable_shared_cache ??= _dylib.lookupFunction<
         _c_sqlite3_enable_shared_cache,
-        _dart_sqlite3_enable_shared_cache>('sqlite3_enable_shared_cache');
-    return _sqlite3_enable_shared_cache(
+        _dart_sqlite3_enable_shared_cache>('sqlite3_enable_shared_cache'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_enable_shared_cache _sqlite3_enable_shared_cache;
+  _dart_sqlite3_enable_shared_cache? _sqlite3_enable_shared_cache;
 
   /// CAPI3REF: Attempt To Free Heap Memory
   ///
@@ -5973,14 +5862,14 @@
   int sqlite3_release_memory(
     int arg0,
   ) {
-    _sqlite3_release_memory ??= _dylib.lookupFunction<_c_sqlite3_release_memory,
-        _dart_sqlite3_release_memory>('sqlite3_release_memory');
-    return _sqlite3_release_memory(
+    return (_sqlite3_release_memory ??= _dylib.lookupFunction<
+        _c_sqlite3_release_memory,
+        _dart_sqlite3_release_memory>('sqlite3_release_memory'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_release_memory _sqlite3_release_memory;
+  _dart_sqlite3_release_memory? _sqlite3_release_memory;
 
   /// CAPI3REF: Free Memory Used By A Database Connection
   /// METHOD: sqlite3
@@ -5995,15 +5884,14 @@
   int sqlite3_db_release_memory(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_db_release_memory ??= _dylib.lookupFunction<
+    return (_sqlite3_db_release_memory ??= _dylib.lookupFunction<
         _c_sqlite3_db_release_memory,
-        _dart_sqlite3_db_release_memory>('sqlite3_db_release_memory');
-    return _sqlite3_db_release_memory(
+        _dart_sqlite3_db_release_memory>('sqlite3_db_release_memory'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_db_release_memory _sqlite3_db_release_memory;
+  _dart_sqlite3_db_release_memory? _sqlite3_db_release_memory;
 
   /// CAPI3REF: Impose A Limit On Heap Size
   ///
@@ -6070,28 +5958,26 @@
   int sqlite3_soft_heap_limit64(
     int N,
   ) {
-    _sqlite3_soft_heap_limit64 ??= _dylib.lookupFunction<
+    return (_sqlite3_soft_heap_limit64 ??= _dylib.lookupFunction<
         _c_sqlite3_soft_heap_limit64,
-        _dart_sqlite3_soft_heap_limit64>('sqlite3_soft_heap_limit64');
-    return _sqlite3_soft_heap_limit64(
+        _dart_sqlite3_soft_heap_limit64>('sqlite3_soft_heap_limit64'))(
       N,
     );
   }
 
-  _dart_sqlite3_soft_heap_limit64 _sqlite3_soft_heap_limit64;
+  _dart_sqlite3_soft_heap_limit64? _sqlite3_soft_heap_limit64;
 
   int sqlite3_hard_heap_limit64(
     int N,
   ) {
-    _sqlite3_hard_heap_limit64 ??= _dylib.lookupFunction<
+    return (_sqlite3_hard_heap_limit64 ??= _dylib.lookupFunction<
         _c_sqlite3_hard_heap_limit64,
-        _dart_sqlite3_hard_heap_limit64>('sqlite3_hard_heap_limit64');
-    return _sqlite3_hard_heap_limit64(
+        _dart_sqlite3_hard_heap_limit64>('sqlite3_hard_heap_limit64'))(
       N,
     );
   }
 
-  _dart_sqlite3_hard_heap_limit64 _sqlite3_hard_heap_limit64;
+  _dart_sqlite3_hard_heap_limit64? _sqlite3_hard_heap_limit64;
 
   /// CAPI3REF: Deprecated Soft Heap Limit Interface
   /// DEPRECATED
@@ -6103,15 +5989,14 @@
   void sqlite3_soft_heap_limit(
     int N,
   ) {
-    _sqlite3_soft_heap_limit ??= _dylib.lookupFunction<
+    return (_sqlite3_soft_heap_limit ??= _dylib.lookupFunction<
         _c_sqlite3_soft_heap_limit,
-        _dart_sqlite3_soft_heap_limit>('sqlite3_soft_heap_limit');
-    return _sqlite3_soft_heap_limit(
+        _dart_sqlite3_soft_heap_limit>('sqlite3_soft_heap_limit'))(
       N,
     );
   }
 
-  _dart_sqlite3_soft_heap_limit _sqlite3_soft_heap_limit;
+  _dart_sqlite3_soft_heap_limit? _sqlite3_soft_heap_limit;
 
   /// CAPI3REF: Extract Metadata About A Column Of A Table
   /// METHOD: sqlite3
@@ -6191,10 +6076,9 @@
     ffi.Pointer<ffi.Int32> pPrimaryKey,
     ffi.Pointer<ffi.Int32> pAutoinc,
   ) {
-    _sqlite3_table_column_metadata ??= _dylib.lookupFunction<
+    return (_sqlite3_table_column_metadata ??= _dylib.lookupFunction<
         _c_sqlite3_table_column_metadata,
-        _dart_sqlite3_table_column_metadata>('sqlite3_table_column_metadata');
-    return _sqlite3_table_column_metadata(
+        _dart_sqlite3_table_column_metadata>('sqlite3_table_column_metadata'))(
       db,
       zDbName,
       zTableName,
@@ -6207,7 +6091,7 @@
     );
   }
 
-  _dart_sqlite3_table_column_metadata _sqlite3_table_column_metadata;
+  _dart_sqlite3_table_column_metadata? _sqlite3_table_column_metadata;
 
   /// CAPI3REF: Load An Extension
   /// METHOD: sqlite3
@@ -6257,9 +6141,9 @@
     ffi.Pointer<ffi.Int8> zProc,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> pzErrMsg,
   ) {
-    _sqlite3_load_extension ??= _dylib.lookupFunction<_c_sqlite3_load_extension,
-        _dart_sqlite3_load_extension>('sqlite3_load_extension');
-    return _sqlite3_load_extension(
+    return (_sqlite3_load_extension ??= _dylib.lookupFunction<
+        _c_sqlite3_load_extension,
+        _dart_sqlite3_load_extension>('sqlite3_load_extension'))(
       db,
       zFile,
       zProc,
@@ -6267,7 +6151,7 @@
     );
   }
 
-  _dart_sqlite3_load_extension _sqlite3_load_extension;
+  _dart_sqlite3_load_extension? _sqlite3_load_extension;
 
   /// CAPI3REF: Enable Or Disable Extension Loading
   /// METHOD: sqlite3
@@ -6296,16 +6180,15 @@
     ffi.Pointer<sqlite3> db,
     int onoff,
   ) {
-    _sqlite3_enable_load_extension ??= _dylib.lookupFunction<
+    return (_sqlite3_enable_load_extension ??= _dylib.lookupFunction<
         _c_sqlite3_enable_load_extension,
-        _dart_sqlite3_enable_load_extension>('sqlite3_enable_load_extension');
-    return _sqlite3_enable_load_extension(
+        _dart_sqlite3_enable_load_extension>('sqlite3_enable_load_extension'))(
       db,
       onoff,
     );
   }
 
-  _dart_sqlite3_enable_load_extension _sqlite3_enable_load_extension;
+  _dart_sqlite3_enable_load_extension? _sqlite3_enable_load_extension;
 
   /// CAPI3REF: Automatically Load Statically Linked Extensions
   ///
@@ -6344,14 +6227,14 @@
   int sqlite3_auto_extension(
     ffi.Pointer<ffi.NativeFunction<_typedefC_66>> xEntryPoint,
   ) {
-    _sqlite3_auto_extension ??= _dylib.lookupFunction<_c_sqlite3_auto_extension,
-        _dart_sqlite3_auto_extension>('sqlite3_auto_extension');
-    return _sqlite3_auto_extension(
+    return (_sqlite3_auto_extension ??= _dylib.lookupFunction<
+        _c_sqlite3_auto_extension,
+        _dart_sqlite3_auto_extension>('sqlite3_auto_extension'))(
       xEntryPoint,
     );
   }
 
-  _dart_sqlite3_auto_extension _sqlite3_auto_extension;
+  _dart_sqlite3_auto_extension? _sqlite3_auto_extension;
 
   /// CAPI3REF: Cancel Automatic Extension Loading
   ///
@@ -6364,28 +6247,26 @@
   int sqlite3_cancel_auto_extension(
     ffi.Pointer<ffi.NativeFunction<_typedefC_67>> xEntryPoint,
   ) {
-    _sqlite3_cancel_auto_extension ??= _dylib.lookupFunction<
+    return (_sqlite3_cancel_auto_extension ??= _dylib.lookupFunction<
         _c_sqlite3_cancel_auto_extension,
-        _dart_sqlite3_cancel_auto_extension>('sqlite3_cancel_auto_extension');
-    return _sqlite3_cancel_auto_extension(
+        _dart_sqlite3_cancel_auto_extension>('sqlite3_cancel_auto_extension'))(
       xEntryPoint,
     );
   }
 
-  _dart_sqlite3_cancel_auto_extension _sqlite3_cancel_auto_extension;
+  _dart_sqlite3_cancel_auto_extension? _sqlite3_cancel_auto_extension;
 
   /// CAPI3REF: Reset Automatic Extension Loading
   ///
   /// ^This interface disables all automatic extensions previously
   /// registered using [sqlite3_auto_extension()].
   void sqlite3_reset_auto_extension() {
-    _sqlite3_reset_auto_extension ??= _dylib.lookupFunction<
+    return (_sqlite3_reset_auto_extension ??= _dylib.lookupFunction<
         _c_sqlite3_reset_auto_extension,
-        _dart_sqlite3_reset_auto_extension>('sqlite3_reset_auto_extension');
-    return _sqlite3_reset_auto_extension();
+        _dart_sqlite3_reset_auto_extension>('sqlite3_reset_auto_extension'))();
   }
 
-  _dart_sqlite3_reset_auto_extension _sqlite3_reset_auto_extension;
+  _dart_sqlite3_reset_auto_extension? _sqlite3_reset_auto_extension;
 
   /// CAPI3REF: Register A Virtual Table Implementation
   /// METHOD: sqlite3
@@ -6423,9 +6304,9 @@
     ffi.Pointer<sqlite3_module> p,
     ffi.Pointer<ffi.Void> pClientData,
   ) {
-    _sqlite3_create_module ??= _dylib.lookupFunction<_c_sqlite3_create_module,
-        _dart_sqlite3_create_module>('sqlite3_create_module');
-    return _sqlite3_create_module(
+    return (_sqlite3_create_module ??= _dylib.lookupFunction<
+        _c_sqlite3_create_module,
+        _dart_sqlite3_create_module>('sqlite3_create_module'))(
       db,
       zName,
       p,
@@ -6433,7 +6314,7 @@
     );
   }
 
-  _dart_sqlite3_create_module _sqlite3_create_module;
+  _dart_sqlite3_create_module? _sqlite3_create_module;
 
   int sqlite3_create_module_v2(
     ffi.Pointer<sqlite3> db,
@@ -6442,10 +6323,9 @@
     ffi.Pointer<ffi.Void> pClientData,
     ffi.Pointer<ffi.NativeFunction<_typedefC_68>> xDestroy,
   ) {
-    _sqlite3_create_module_v2 ??= _dylib.lookupFunction<
+    return (_sqlite3_create_module_v2 ??= _dylib.lookupFunction<
         _c_sqlite3_create_module_v2,
-        _dart_sqlite3_create_module_v2>('sqlite3_create_module_v2');
-    return _sqlite3_create_module_v2(
+        _dart_sqlite3_create_module_v2>('sqlite3_create_module_v2'))(
       db,
       zName,
       p,
@@ -6454,7 +6334,7 @@
     );
   }
 
-  _dart_sqlite3_create_module_v2 _sqlite3_create_module_v2;
+  _dart_sqlite3_create_module_v2? _sqlite3_create_module_v2;
 
   /// CAPI3REF: Remove Unnecessary Virtual Table Implementations
   /// METHOD: sqlite3
@@ -6470,15 +6350,15 @@
     ffi.Pointer<sqlite3> db,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> azKeep,
   ) {
-    _sqlite3_drop_modules ??= _dylib.lookupFunction<_c_sqlite3_drop_modules,
-        _dart_sqlite3_drop_modules>('sqlite3_drop_modules');
-    return _sqlite3_drop_modules(
+    return (_sqlite3_drop_modules ??= _dylib.lookupFunction<
+        _c_sqlite3_drop_modules,
+        _dart_sqlite3_drop_modules>('sqlite3_drop_modules'))(
       db,
       azKeep,
     );
   }
 
-  _dart_sqlite3_drop_modules _sqlite3_drop_modules;
+  _dart_sqlite3_drop_modules? _sqlite3_drop_modules;
 
   /// CAPI3REF: Declare The Schema Of A Virtual Table
   ///
@@ -6490,15 +6370,15 @@
     ffi.Pointer<sqlite3> arg0,
     ffi.Pointer<ffi.Int8> zSQL,
   ) {
-    _sqlite3_declare_vtab ??= _dylib.lookupFunction<_c_sqlite3_declare_vtab,
-        _dart_sqlite3_declare_vtab>('sqlite3_declare_vtab');
-    return _sqlite3_declare_vtab(
+    return (_sqlite3_declare_vtab ??= _dylib.lookupFunction<
+        _c_sqlite3_declare_vtab,
+        _dart_sqlite3_declare_vtab>('sqlite3_declare_vtab'))(
       arg0,
       zSQL,
     );
   }
 
-  _dart_sqlite3_declare_vtab _sqlite3_declare_vtab;
+  _dart_sqlite3_declare_vtab? _sqlite3_declare_vtab;
 
   /// CAPI3REF: Overload A Function For A Virtual Table
   /// METHOD: sqlite3
@@ -6520,17 +6400,16 @@
     ffi.Pointer<ffi.Int8> zFuncName,
     int nArg,
   ) {
-    _sqlite3_overload_function ??= _dylib.lookupFunction<
+    return (_sqlite3_overload_function ??= _dylib.lookupFunction<
         _c_sqlite3_overload_function,
-        _dart_sqlite3_overload_function>('sqlite3_overload_function');
-    return _sqlite3_overload_function(
+        _dart_sqlite3_overload_function>('sqlite3_overload_function'))(
       arg0,
       zFuncName,
       nArg,
     );
   }
 
-  _dart_sqlite3_overload_function _sqlite3_overload_function;
+  _dart_sqlite3_overload_function? _sqlite3_overload_function;
 
   /// CAPI3REF: Open A BLOB For Incremental I/O
   /// METHOD: sqlite3
@@ -6622,10 +6501,9 @@
     int flags,
     ffi.Pointer<ffi.Pointer<sqlite3_blob>> ppBlob,
   ) {
-    _sqlite3_blob_open ??=
+    return (_sqlite3_blob_open ??=
         _dylib.lookupFunction<_c_sqlite3_blob_open, _dart_sqlite3_blob_open>(
-            'sqlite3_blob_open');
-    return _sqlite3_blob_open(
+            'sqlite3_blob_open'))(
       arg0,
       zDb,
       zTable,
@@ -6636,7 +6514,7 @@
     );
   }
 
-  _dart_sqlite3_blob_open _sqlite3_blob_open;
+  _dart_sqlite3_blob_open? _sqlite3_blob_open;
 
   /// CAPI3REF: Move a BLOB Handle to a New Row
   /// METHOD: sqlite3_blob
@@ -6663,15 +6541,15 @@
     ffi.Pointer<sqlite3_blob> arg0,
     int arg1,
   ) {
-    _sqlite3_blob_reopen ??= _dylib.lookupFunction<_c_sqlite3_blob_reopen,
-        _dart_sqlite3_blob_reopen>('sqlite3_blob_reopen');
-    return _sqlite3_blob_reopen(
+    return (_sqlite3_blob_reopen ??= _dylib.lookupFunction<
+        _c_sqlite3_blob_reopen,
+        _dart_sqlite3_blob_reopen>('sqlite3_blob_reopen'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_blob_reopen _sqlite3_blob_reopen;
+  _dart_sqlite3_blob_reopen? _sqlite3_blob_reopen;
 
   /// CAPI3REF: Close A BLOB Handle
   /// DESTRUCTOR: sqlite3_blob
@@ -6695,15 +6573,14 @@
   int sqlite3_blob_close(
     ffi.Pointer<sqlite3_blob> arg0,
   ) {
-    _sqlite3_blob_close ??=
+    return (_sqlite3_blob_close ??=
         _dylib.lookupFunction<_c_sqlite3_blob_close, _dart_sqlite3_blob_close>(
-            'sqlite3_blob_close');
-    return _sqlite3_blob_close(
+            'sqlite3_blob_close'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_blob_close _sqlite3_blob_close;
+  _dart_sqlite3_blob_close? _sqlite3_blob_close;
 
   /// CAPI3REF: Return The Size Of An Open BLOB
   /// METHOD: sqlite3_blob
@@ -6720,15 +6597,14 @@
   int sqlite3_blob_bytes(
     ffi.Pointer<sqlite3_blob> arg0,
   ) {
-    _sqlite3_blob_bytes ??=
+    return (_sqlite3_blob_bytes ??=
         _dylib.lookupFunction<_c_sqlite3_blob_bytes, _dart_sqlite3_blob_bytes>(
-            'sqlite3_blob_bytes');
-    return _sqlite3_blob_bytes(
+            'sqlite3_blob_bytes'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_blob_bytes _sqlite3_blob_bytes;
+  _dart_sqlite3_blob_bytes? _sqlite3_blob_bytes;
 
   /// CAPI3REF: Read Data From A BLOB Incrementally
   /// METHOD: sqlite3_blob
@@ -6761,10 +6637,9 @@
     int N,
     int iOffset,
   ) {
-    _sqlite3_blob_read ??=
+    return (_sqlite3_blob_read ??=
         _dylib.lookupFunction<_c_sqlite3_blob_read, _dart_sqlite3_blob_read>(
-            'sqlite3_blob_read');
-    return _sqlite3_blob_read(
+            'sqlite3_blob_read'))(
       arg0,
       Z,
       N,
@@ -6772,7 +6647,7 @@
     );
   }
 
-  _dart_sqlite3_blob_read _sqlite3_blob_read;
+  _dart_sqlite3_blob_read? _sqlite3_blob_read;
 
   /// CAPI3REF: Write Data Into A BLOB Incrementally
   /// METHOD: sqlite3_blob
@@ -6818,10 +6693,9 @@
     int n,
     int iOffset,
   ) {
-    _sqlite3_blob_write ??=
+    return (_sqlite3_blob_write ??=
         _dylib.lookupFunction<_c_sqlite3_blob_write, _dart_sqlite3_blob_write>(
-            'sqlite3_blob_write');
-    return _sqlite3_blob_write(
+            'sqlite3_blob_write'))(
       arg0,
       z,
       n,
@@ -6829,7 +6703,7 @@
     );
   }
 
-  _dart_sqlite3_blob_write _sqlite3_blob_write;
+  _dart_sqlite3_blob_write? _sqlite3_blob_write;
 
   /// CAPI3REF: Virtual File System Objects
   ///
@@ -6861,41 +6735,40 @@
   ffi.Pointer<sqlite3_vfs> sqlite3_vfs_find(
     ffi.Pointer<ffi.Int8> zVfsName,
   ) {
-    _sqlite3_vfs_find ??=
+    return (_sqlite3_vfs_find ??=
         _dylib.lookupFunction<_c_sqlite3_vfs_find, _dart_sqlite3_vfs_find>(
-            'sqlite3_vfs_find');
-    return _sqlite3_vfs_find(
+            'sqlite3_vfs_find'))(
       zVfsName,
     );
   }
 
-  _dart_sqlite3_vfs_find _sqlite3_vfs_find;
+  _dart_sqlite3_vfs_find? _sqlite3_vfs_find;
 
   int sqlite3_vfs_register(
     ffi.Pointer<sqlite3_vfs> arg0,
     int makeDflt,
   ) {
-    _sqlite3_vfs_register ??= _dylib.lookupFunction<_c_sqlite3_vfs_register,
-        _dart_sqlite3_vfs_register>('sqlite3_vfs_register');
-    return _sqlite3_vfs_register(
+    return (_sqlite3_vfs_register ??= _dylib.lookupFunction<
+        _c_sqlite3_vfs_register,
+        _dart_sqlite3_vfs_register>('sqlite3_vfs_register'))(
       arg0,
       makeDflt,
     );
   }
 
-  _dart_sqlite3_vfs_register _sqlite3_vfs_register;
+  _dart_sqlite3_vfs_register? _sqlite3_vfs_register;
 
   int sqlite3_vfs_unregister(
     ffi.Pointer<sqlite3_vfs> arg0,
   ) {
-    _sqlite3_vfs_unregister ??= _dylib.lookupFunction<_c_sqlite3_vfs_unregister,
-        _dart_sqlite3_vfs_unregister>('sqlite3_vfs_unregister');
-    return _sqlite3_vfs_unregister(
+    return (_sqlite3_vfs_unregister ??= _dylib.lookupFunction<
+        _c_sqlite3_vfs_unregister,
+        _dart_sqlite3_vfs_unregister>('sqlite3_vfs_unregister'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_vfs_unregister _sqlite3_vfs_unregister;
+  _dart_sqlite3_vfs_unregister? _sqlite3_vfs_unregister;
 
   /// CAPI3REF: Mutexes
   ///
@@ -7012,89 +6885,86 @@
   ffi.Pointer<sqlite3_mutex> sqlite3_mutex_alloc(
     int arg0,
   ) {
-    _sqlite3_mutex_alloc ??= _dylib.lookupFunction<_c_sqlite3_mutex_alloc,
-        _dart_sqlite3_mutex_alloc>('sqlite3_mutex_alloc');
-    return _sqlite3_mutex_alloc(
+    return (_sqlite3_mutex_alloc ??= _dylib.lookupFunction<
+        _c_sqlite3_mutex_alloc,
+        _dart_sqlite3_mutex_alloc>('sqlite3_mutex_alloc'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mutex_alloc _sqlite3_mutex_alloc;
+  _dart_sqlite3_mutex_alloc? _sqlite3_mutex_alloc;
 
   void sqlite3_mutex_free(
     ffi.Pointer<sqlite3_mutex> arg0,
   ) {
-    _sqlite3_mutex_free ??=
+    return (_sqlite3_mutex_free ??=
         _dylib.lookupFunction<_c_sqlite3_mutex_free, _dart_sqlite3_mutex_free>(
-            'sqlite3_mutex_free');
-    return _sqlite3_mutex_free(
+            'sqlite3_mutex_free'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mutex_free _sqlite3_mutex_free;
+  _dart_sqlite3_mutex_free? _sqlite3_mutex_free;
 
   void sqlite3_mutex_enter(
     ffi.Pointer<sqlite3_mutex> arg0,
   ) {
-    _sqlite3_mutex_enter ??= _dylib.lookupFunction<_c_sqlite3_mutex_enter,
-        _dart_sqlite3_mutex_enter>('sqlite3_mutex_enter');
-    return _sqlite3_mutex_enter(
+    return (_sqlite3_mutex_enter ??= _dylib.lookupFunction<
+        _c_sqlite3_mutex_enter,
+        _dart_sqlite3_mutex_enter>('sqlite3_mutex_enter'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mutex_enter _sqlite3_mutex_enter;
+  _dart_sqlite3_mutex_enter? _sqlite3_mutex_enter;
 
   int sqlite3_mutex_try(
     ffi.Pointer<sqlite3_mutex> arg0,
   ) {
-    _sqlite3_mutex_try ??=
+    return (_sqlite3_mutex_try ??=
         _dylib.lookupFunction<_c_sqlite3_mutex_try, _dart_sqlite3_mutex_try>(
-            'sqlite3_mutex_try');
-    return _sqlite3_mutex_try(
+            'sqlite3_mutex_try'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mutex_try _sqlite3_mutex_try;
+  _dart_sqlite3_mutex_try? _sqlite3_mutex_try;
 
   void sqlite3_mutex_leave(
     ffi.Pointer<sqlite3_mutex> arg0,
   ) {
-    _sqlite3_mutex_leave ??= _dylib.lookupFunction<_c_sqlite3_mutex_leave,
-        _dart_sqlite3_mutex_leave>('sqlite3_mutex_leave');
-    return _sqlite3_mutex_leave(
+    return (_sqlite3_mutex_leave ??= _dylib.lookupFunction<
+        _c_sqlite3_mutex_leave,
+        _dart_sqlite3_mutex_leave>('sqlite3_mutex_leave'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mutex_leave _sqlite3_mutex_leave;
+  _dart_sqlite3_mutex_leave? _sqlite3_mutex_leave;
 
   int sqlite3_mutex_held(
     ffi.Pointer<sqlite3_mutex> arg0,
   ) {
-    _sqlite3_mutex_held ??=
+    return (_sqlite3_mutex_held ??=
         _dylib.lookupFunction<_c_sqlite3_mutex_held, _dart_sqlite3_mutex_held>(
-            'sqlite3_mutex_held');
-    return _sqlite3_mutex_held(
+            'sqlite3_mutex_held'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mutex_held _sqlite3_mutex_held;
+  _dart_sqlite3_mutex_held? _sqlite3_mutex_held;
 
   int sqlite3_mutex_notheld(
     ffi.Pointer<sqlite3_mutex> arg0,
   ) {
-    _sqlite3_mutex_notheld ??= _dylib.lookupFunction<_c_sqlite3_mutex_notheld,
-        _dart_sqlite3_mutex_notheld>('sqlite3_mutex_notheld');
-    return _sqlite3_mutex_notheld(
+    return (_sqlite3_mutex_notheld ??= _dylib.lookupFunction<
+        _c_sqlite3_mutex_notheld,
+        _dart_sqlite3_mutex_notheld>('sqlite3_mutex_notheld'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_mutex_notheld _sqlite3_mutex_notheld;
+  _dart_sqlite3_mutex_notheld? _sqlite3_mutex_notheld;
 
   /// CAPI3REF: Retrieve the mutex for a database connection
   /// METHOD: sqlite3
@@ -7107,15 +6977,14 @@
   ffi.Pointer<sqlite3_mutex> sqlite3_db_mutex(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_db_mutex ??=
+    return (_sqlite3_db_mutex ??=
         _dylib.lookupFunction<_c_sqlite3_db_mutex, _dart_sqlite3_db_mutex>(
-            'sqlite3_db_mutex');
-    return _sqlite3_db_mutex(
+            'sqlite3_db_mutex'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_db_mutex _sqlite3_db_mutex;
+  _dart_sqlite3_db_mutex? _sqlite3_db_mutex;
 
   /// CAPI3REF: Low-Level Control Of Database Files
   /// METHOD: sqlite3
@@ -7162,9 +7031,9 @@
     int op,
     ffi.Pointer<ffi.Void> arg3,
   ) {
-    _sqlite3_file_control ??= _dylib.lookupFunction<_c_sqlite3_file_control,
-        _dart_sqlite3_file_control>('sqlite3_file_control');
-    return _sqlite3_file_control(
+    return (_sqlite3_file_control ??= _dylib.lookupFunction<
+        _c_sqlite3_file_control,
+        _dart_sqlite3_file_control>('sqlite3_file_control'))(
       arg0,
       zDbName,
       op,
@@ -7172,7 +7041,7 @@
     );
   }
 
-  _dart_sqlite3_file_control _sqlite3_file_control;
+  _dart_sqlite3_file_control? _sqlite3_file_control;
 
   /// CAPI3REF: Testing Interface
   ///
@@ -7192,14 +7061,14 @@
   int sqlite3_test_control(
     int op,
   ) {
-    _sqlite3_test_control ??= _dylib.lookupFunction<_c_sqlite3_test_control,
-        _dart_sqlite3_test_control>('sqlite3_test_control');
-    return _sqlite3_test_control(
+    return (_sqlite3_test_control ??= _dylib.lookupFunction<
+        _c_sqlite3_test_control,
+        _dart_sqlite3_test_control>('sqlite3_test_control'))(
       op,
     );
   }
 
-  _dart_sqlite3_test_control _sqlite3_test_control;
+  _dart_sqlite3_test_control? _sqlite3_test_control;
 
   /// CAPI3REF: SQL Keyword Checking
   ///
@@ -7247,42 +7116,42 @@
   /// SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option.  Also,
   /// new keywords may be added to future releases of SQLite.
   int sqlite3_keyword_count() {
-    _sqlite3_keyword_count ??= _dylib.lookupFunction<_c_sqlite3_keyword_count,
-        _dart_sqlite3_keyword_count>('sqlite3_keyword_count');
-    return _sqlite3_keyword_count();
+    return (_sqlite3_keyword_count ??= _dylib.lookupFunction<
+        _c_sqlite3_keyword_count,
+        _dart_sqlite3_keyword_count>('sqlite3_keyword_count'))();
   }
 
-  _dart_sqlite3_keyword_count _sqlite3_keyword_count;
+  _dart_sqlite3_keyword_count? _sqlite3_keyword_count;
 
   int sqlite3_keyword_name(
     int arg0,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> arg1,
     ffi.Pointer<ffi.Int32> arg2,
   ) {
-    _sqlite3_keyword_name ??= _dylib.lookupFunction<_c_sqlite3_keyword_name,
-        _dart_sqlite3_keyword_name>('sqlite3_keyword_name');
-    return _sqlite3_keyword_name(
+    return (_sqlite3_keyword_name ??= _dylib.lookupFunction<
+        _c_sqlite3_keyword_name,
+        _dart_sqlite3_keyword_name>('sqlite3_keyword_name'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_keyword_name _sqlite3_keyword_name;
+  _dart_sqlite3_keyword_name? _sqlite3_keyword_name;
 
   int sqlite3_keyword_check(
     ffi.Pointer<ffi.Int8> arg0,
     int arg1,
   ) {
-    _sqlite3_keyword_check ??= _dylib.lookupFunction<_c_sqlite3_keyword_check,
-        _dart_sqlite3_keyword_check>('sqlite3_keyword_check');
-    return _sqlite3_keyword_check(
+    return (_sqlite3_keyword_check ??= _dylib.lookupFunction<
+        _c_sqlite3_keyword_check,
+        _dart_sqlite3_keyword_check>('sqlite3_keyword_check'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_keyword_check _sqlite3_keyword_check;
+  _dart_sqlite3_keyword_check? _sqlite3_keyword_check;
 
   /// CAPI3REF: Create A New Dynamic String Object
   /// CONSTRUCTOR: sqlite3_str
@@ -7310,15 +7179,14 @@
   ffi.Pointer<sqlite3_str> sqlite3_str_new(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_str_new ??=
+    return (_sqlite3_str_new ??=
         _dylib.lookupFunction<_c_sqlite3_str_new, _dart_sqlite3_str_new>(
-            'sqlite3_str_new');
-    return _sqlite3_str_new(
+            'sqlite3_str_new'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_str_new _sqlite3_str_new;
+  _dart_sqlite3_str_new? _sqlite3_str_new;
 
   /// CAPI3REF: Finalize A Dynamic String
   /// DESTRUCTOR: sqlite3_str
@@ -7334,15 +7202,14 @@
   ffi.Pointer<ffi.Int8> sqlite3_str_finish(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
-    _sqlite3_str_finish ??=
+    return (_sqlite3_str_finish ??=
         _dylib.lookupFunction<_c_sqlite3_str_finish, _dart_sqlite3_str_finish>(
-            'sqlite3_str_finish');
-    return _sqlite3_str_finish(
+            'sqlite3_str_finish'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_str_finish _sqlite3_str_finish;
+  _dart_sqlite3_str_finish? _sqlite3_str_finish;
 
   /// CAPI3REF: Add Content To A Dynamic String
   /// METHOD: sqlite3_str
@@ -7378,75 +7245,73 @@
     ffi.Pointer<sqlite3_str> arg0,
     ffi.Pointer<ffi.Int8> zFormat,
   ) {
-    _sqlite3_str_appendf ??= _dylib.lookupFunction<_c_sqlite3_str_appendf,
-        _dart_sqlite3_str_appendf>('sqlite3_str_appendf');
-    return _sqlite3_str_appendf(
+    return (_sqlite3_str_appendf ??= _dylib.lookupFunction<
+        _c_sqlite3_str_appendf,
+        _dart_sqlite3_str_appendf>('sqlite3_str_appendf'))(
       arg0,
       zFormat,
     );
   }
 
-  _dart_sqlite3_str_appendf _sqlite3_str_appendf;
+  _dart_sqlite3_str_appendf? _sqlite3_str_appendf;
 
   void sqlite3_str_append(
     ffi.Pointer<sqlite3_str> arg0,
     ffi.Pointer<ffi.Int8> zIn,
     int N,
   ) {
-    _sqlite3_str_append ??=
+    return (_sqlite3_str_append ??=
         _dylib.lookupFunction<_c_sqlite3_str_append, _dart_sqlite3_str_append>(
-            'sqlite3_str_append');
-    return _sqlite3_str_append(
+            'sqlite3_str_append'))(
       arg0,
       zIn,
       N,
     );
   }
 
-  _dart_sqlite3_str_append _sqlite3_str_append;
+  _dart_sqlite3_str_append? _sqlite3_str_append;
 
   void sqlite3_str_appendall(
     ffi.Pointer<sqlite3_str> arg0,
     ffi.Pointer<ffi.Int8> zIn,
   ) {
-    _sqlite3_str_appendall ??= _dylib.lookupFunction<_c_sqlite3_str_appendall,
-        _dart_sqlite3_str_appendall>('sqlite3_str_appendall');
-    return _sqlite3_str_appendall(
+    return (_sqlite3_str_appendall ??= _dylib.lookupFunction<
+        _c_sqlite3_str_appendall,
+        _dart_sqlite3_str_appendall>('sqlite3_str_appendall'))(
       arg0,
       zIn,
     );
   }
 
-  _dart_sqlite3_str_appendall _sqlite3_str_appendall;
+  _dart_sqlite3_str_appendall? _sqlite3_str_appendall;
 
   void sqlite3_str_appendchar(
     ffi.Pointer<sqlite3_str> arg0,
     int N,
     int C,
   ) {
-    _sqlite3_str_appendchar ??= _dylib.lookupFunction<_c_sqlite3_str_appendchar,
-        _dart_sqlite3_str_appendchar>('sqlite3_str_appendchar');
-    return _sqlite3_str_appendchar(
+    return (_sqlite3_str_appendchar ??= _dylib.lookupFunction<
+        _c_sqlite3_str_appendchar,
+        _dart_sqlite3_str_appendchar>('sqlite3_str_appendchar'))(
       arg0,
       N,
       C,
     );
   }
 
-  _dart_sqlite3_str_appendchar _sqlite3_str_appendchar;
+  _dart_sqlite3_str_appendchar? _sqlite3_str_appendchar;
 
   void sqlite3_str_reset(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
-    _sqlite3_str_reset ??=
+    return (_sqlite3_str_reset ??=
         _dylib.lookupFunction<_c_sqlite3_str_reset, _dart_sqlite3_str_reset>(
-            'sqlite3_str_reset');
-    return _sqlite3_str_reset(
+            'sqlite3_str_reset'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_str_reset _sqlite3_str_reset;
+  _dart_sqlite3_str_reset? _sqlite3_str_reset;
 
   /// CAPI3REF: Status Of A Dynamic String
   /// METHOD: sqlite3_str
@@ -7478,40 +7343,38 @@
   int sqlite3_str_errcode(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
-    _sqlite3_str_errcode ??= _dylib.lookupFunction<_c_sqlite3_str_errcode,
-        _dart_sqlite3_str_errcode>('sqlite3_str_errcode');
-    return _sqlite3_str_errcode(
+    return (_sqlite3_str_errcode ??= _dylib.lookupFunction<
+        _c_sqlite3_str_errcode,
+        _dart_sqlite3_str_errcode>('sqlite3_str_errcode'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_str_errcode _sqlite3_str_errcode;
+  _dart_sqlite3_str_errcode? _sqlite3_str_errcode;
 
   int sqlite3_str_length(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
-    _sqlite3_str_length ??=
+    return (_sqlite3_str_length ??=
         _dylib.lookupFunction<_c_sqlite3_str_length, _dart_sqlite3_str_length>(
-            'sqlite3_str_length');
-    return _sqlite3_str_length(
+            'sqlite3_str_length'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_str_length _sqlite3_str_length;
+  _dart_sqlite3_str_length? _sqlite3_str_length;
 
   ffi.Pointer<ffi.Int8> sqlite3_str_value(
     ffi.Pointer<sqlite3_str> arg0,
   ) {
-    _sqlite3_str_value ??=
+    return (_sqlite3_str_value ??=
         _dylib.lookupFunction<_c_sqlite3_str_value, _dart_sqlite3_str_value>(
-            'sqlite3_str_value');
-    return _sqlite3_str_value(
+            'sqlite3_str_value'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_str_value _sqlite3_str_value;
+  _dart_sqlite3_str_value? _sqlite3_str_value;
 
   /// CAPI3REF: SQLite Runtime Status
   ///
@@ -7543,10 +7406,9 @@
     ffi.Pointer<ffi.Int32> pHighwater,
     int resetFlag,
   ) {
-    _sqlite3_status ??=
+    return (_sqlite3_status ??=
         _dylib.lookupFunction<_c_sqlite3_status, _dart_sqlite3_status>(
-            'sqlite3_status');
-    return _sqlite3_status(
+            'sqlite3_status'))(
       op,
       pCurrent,
       pHighwater,
@@ -7554,7 +7416,7 @@
     );
   }
 
-  _dart_sqlite3_status _sqlite3_status;
+  _dart_sqlite3_status? _sqlite3_status;
 
   int sqlite3_status64(
     int op,
@@ -7562,10 +7424,9 @@
     ffi.Pointer<ffi.Int64> pHighwater,
     int resetFlag,
   ) {
-    _sqlite3_status64 ??=
+    return (_sqlite3_status64 ??=
         _dylib.lookupFunction<_c_sqlite3_status64, _dart_sqlite3_status64>(
-            'sqlite3_status64');
-    return _sqlite3_status64(
+            'sqlite3_status64'))(
       op,
       pCurrent,
       pHighwater,
@@ -7573,7 +7434,7 @@
     );
   }
 
-  _dart_sqlite3_status64 _sqlite3_status64;
+  _dart_sqlite3_status64? _sqlite3_status64;
 
   /// CAPI3REF: Database Connection Status
   /// METHOD: sqlite3
@@ -7603,10 +7464,9 @@
     ffi.Pointer<ffi.Int32> pHiwtr,
     int resetFlg,
   ) {
-    _sqlite3_db_status ??=
+    return (_sqlite3_db_status ??=
         _dylib.lookupFunction<_c_sqlite3_db_status, _dart_sqlite3_db_status>(
-            'sqlite3_db_status');
-    return _sqlite3_db_status(
+            'sqlite3_db_status'))(
       arg0,
       op,
       pCur,
@@ -7615,7 +7475,7 @@
     );
   }
 
-  _dart_sqlite3_db_status _sqlite3_db_status;
+  _dart_sqlite3_db_status? _sqlite3_db_status;
 
   /// CAPI3REF: Prepared Statement Status
   /// METHOD: sqlite3_stmt
@@ -7644,16 +7504,16 @@
     int op,
     int resetFlg,
   ) {
-    _sqlite3_stmt_status ??= _dylib.lookupFunction<_c_sqlite3_stmt_status,
-        _dart_sqlite3_stmt_status>('sqlite3_stmt_status');
-    return _sqlite3_stmt_status(
+    return (_sqlite3_stmt_status ??= _dylib.lookupFunction<
+        _c_sqlite3_stmt_status,
+        _dart_sqlite3_stmt_status>('sqlite3_stmt_status'))(
       arg0,
       op,
       resetFlg,
     );
   }
 
-  _dart_sqlite3_stmt_status _sqlite3_stmt_status;
+  _dart_sqlite3_stmt_status? _sqlite3_stmt_status;
 
   /// CAPI3REF: Online Backup API.
   ///
@@ -7845,9 +7705,9 @@
     ffi.Pointer<sqlite3> pSource,
     ffi.Pointer<ffi.Int8> zSourceName,
   ) {
-    _sqlite3_backup_init ??= _dylib.lookupFunction<_c_sqlite3_backup_init,
-        _dart_sqlite3_backup_init>('sqlite3_backup_init');
-    return _sqlite3_backup_init(
+    return (_sqlite3_backup_init ??= _dylib.lookupFunction<
+        _c_sqlite3_backup_init,
+        _dart_sqlite3_backup_init>('sqlite3_backup_init'))(
       pDest,
       zDestName,
       pSource,
@@ -7855,59 +7715,57 @@
     );
   }
 
-  _dart_sqlite3_backup_init _sqlite3_backup_init;
+  _dart_sqlite3_backup_init? _sqlite3_backup_init;
 
   int sqlite3_backup_step(
     ffi.Pointer<sqlite3_backup> p,
     int nPage,
   ) {
-    _sqlite3_backup_step ??= _dylib.lookupFunction<_c_sqlite3_backup_step,
-        _dart_sqlite3_backup_step>('sqlite3_backup_step');
-    return _sqlite3_backup_step(
+    return (_sqlite3_backup_step ??= _dylib.lookupFunction<
+        _c_sqlite3_backup_step,
+        _dart_sqlite3_backup_step>('sqlite3_backup_step'))(
       p,
       nPage,
     );
   }
 
-  _dart_sqlite3_backup_step _sqlite3_backup_step;
+  _dart_sqlite3_backup_step? _sqlite3_backup_step;
 
   int sqlite3_backup_finish(
     ffi.Pointer<sqlite3_backup> p,
   ) {
-    _sqlite3_backup_finish ??= _dylib.lookupFunction<_c_sqlite3_backup_finish,
-        _dart_sqlite3_backup_finish>('sqlite3_backup_finish');
-    return _sqlite3_backup_finish(
+    return (_sqlite3_backup_finish ??= _dylib.lookupFunction<
+        _c_sqlite3_backup_finish,
+        _dart_sqlite3_backup_finish>('sqlite3_backup_finish'))(
       p,
     );
   }
 
-  _dart_sqlite3_backup_finish _sqlite3_backup_finish;
+  _dart_sqlite3_backup_finish? _sqlite3_backup_finish;
 
   int sqlite3_backup_remaining(
     ffi.Pointer<sqlite3_backup> p,
   ) {
-    _sqlite3_backup_remaining ??= _dylib.lookupFunction<
+    return (_sqlite3_backup_remaining ??= _dylib.lookupFunction<
         _c_sqlite3_backup_remaining,
-        _dart_sqlite3_backup_remaining>('sqlite3_backup_remaining');
-    return _sqlite3_backup_remaining(
+        _dart_sqlite3_backup_remaining>('sqlite3_backup_remaining'))(
       p,
     );
   }
 
-  _dart_sqlite3_backup_remaining _sqlite3_backup_remaining;
+  _dart_sqlite3_backup_remaining? _sqlite3_backup_remaining;
 
   int sqlite3_backup_pagecount(
     ffi.Pointer<sqlite3_backup> p,
   ) {
-    _sqlite3_backup_pagecount ??= _dylib.lookupFunction<
+    return (_sqlite3_backup_pagecount ??= _dylib.lookupFunction<
         _c_sqlite3_backup_pagecount,
-        _dart_sqlite3_backup_pagecount>('sqlite3_backup_pagecount');
-    return _sqlite3_backup_pagecount(
+        _dart_sqlite3_backup_pagecount>('sqlite3_backup_pagecount'))(
       p,
     );
   }
 
-  _dart_sqlite3_backup_pagecount _sqlite3_backup_pagecount;
+  _dart_sqlite3_backup_pagecount? _sqlite3_backup_pagecount;
 
   /// CAPI3REF: Unlock Notification
   /// METHOD: sqlite3
@@ -8027,16 +7885,16 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_69>> xNotify,
     ffi.Pointer<ffi.Void> pNotifyArg,
   ) {
-    _sqlite3_unlock_notify ??= _dylib.lookupFunction<_c_sqlite3_unlock_notify,
-        _dart_sqlite3_unlock_notify>('sqlite3_unlock_notify');
-    return _sqlite3_unlock_notify(
+    return (_sqlite3_unlock_notify ??= _dylib.lookupFunction<
+        _c_sqlite3_unlock_notify,
+        _dart_sqlite3_unlock_notify>('sqlite3_unlock_notify'))(
       pBlocked,
       xNotify,
       pNotifyArg,
     );
   }
 
-  _dart_sqlite3_unlock_notify _sqlite3_unlock_notify;
+  _dart_sqlite3_unlock_notify? _sqlite3_unlock_notify;
 
   /// CAPI3REF: String Comparison
   ///
@@ -8048,33 +7906,31 @@
     ffi.Pointer<ffi.Int8> arg0,
     ffi.Pointer<ffi.Int8> arg1,
   ) {
-    _sqlite3_stricmp ??=
+    return (_sqlite3_stricmp ??=
         _dylib.lookupFunction<_c_sqlite3_stricmp, _dart_sqlite3_stricmp>(
-            'sqlite3_stricmp');
-    return _sqlite3_stricmp(
+            'sqlite3_stricmp'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_stricmp _sqlite3_stricmp;
+  _dart_sqlite3_stricmp? _sqlite3_stricmp;
 
   int sqlite3_strnicmp(
     ffi.Pointer<ffi.Int8> arg0,
     ffi.Pointer<ffi.Int8> arg1,
     int arg2,
   ) {
-    _sqlite3_strnicmp ??=
+    return (_sqlite3_strnicmp ??=
         _dylib.lookupFunction<_c_sqlite3_strnicmp, _dart_sqlite3_strnicmp>(
-            'sqlite3_strnicmp');
-    return _sqlite3_strnicmp(
+            'sqlite3_strnicmp'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_strnicmp _sqlite3_strnicmp;
+  _dart_sqlite3_strnicmp? _sqlite3_strnicmp;
 
   /// CAPI3REF: String Globbing
   ///
@@ -8093,16 +7949,15 @@
     ffi.Pointer<ffi.Int8> zGlob,
     ffi.Pointer<ffi.Int8> zStr,
   ) {
-    _sqlite3_strglob ??=
+    return (_sqlite3_strglob ??=
         _dylib.lookupFunction<_c_sqlite3_strglob, _dart_sqlite3_strglob>(
-            'sqlite3_strglob');
-    return _sqlite3_strglob(
+            'sqlite3_strglob'))(
       zGlob,
       zStr,
     );
   }
 
-  _dart_sqlite3_strglob _sqlite3_strglob;
+  _dart_sqlite3_strglob? _sqlite3_strglob;
 
   /// CAPI3REF: String LIKE Matching
   ///
@@ -8128,17 +7983,16 @@
     ffi.Pointer<ffi.Int8> zStr,
     int cEsc,
   ) {
-    _sqlite3_strlike ??=
+    return (_sqlite3_strlike ??=
         _dylib.lookupFunction<_c_sqlite3_strlike, _dart_sqlite3_strlike>(
-            'sqlite3_strlike');
-    return _sqlite3_strlike(
+            'sqlite3_strlike'))(
       zGlob,
       zStr,
       cEsc,
     );
   }
 
-  _dart_sqlite3_strlike _sqlite3_strlike;
+  _dart_sqlite3_strlike? _sqlite3_strlike;
 
   /// CAPI3REF: Error Logging Interface
   ///
@@ -8163,15 +8017,14 @@
     int iErrCode,
     ffi.Pointer<ffi.Int8> zFormat,
   ) {
-    _sqlite3_log ??=
-        _dylib.lookupFunction<_c_sqlite3_log, _dart_sqlite3_log>('sqlite3_log');
-    return _sqlite3_log(
+    return (_sqlite3_log ??= _dylib
+        .lookupFunction<_c_sqlite3_log, _dart_sqlite3_log>('sqlite3_log'))(
       iErrCode,
       zFormat,
     );
   }
 
-  _dart_sqlite3_log _sqlite3_log;
+  _dart_sqlite3_log? _sqlite3_log;
 
   /// CAPI3REF: Write-Ahead Log Commit Hook
   /// METHOD: sqlite3
@@ -8210,17 +8063,16 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_70>> arg1,
     ffi.Pointer<ffi.Void> arg2,
   ) {
-    _sqlite3_wal_hook ??=
+    return (_sqlite3_wal_hook ??=
         _dylib.lookupFunction<_c_sqlite3_wal_hook, _dart_sqlite3_wal_hook>(
-            'sqlite3_wal_hook');
-    return _sqlite3_wal_hook(
+            'sqlite3_wal_hook'))(
       arg0,
       arg1,
       arg2,
     );
   }
 
-  _dart_sqlite3_wal_hook _sqlite3_wal_hook;
+  _dart_sqlite3_wal_hook? _sqlite3_wal_hook;
 
   /// CAPI3REF: Configure an auto-checkpoint
   /// METHOD: sqlite3
@@ -8253,16 +8105,15 @@
     ffi.Pointer<sqlite3> db,
     int N,
   ) {
-    _sqlite3_wal_autocheckpoint ??= _dylib.lookupFunction<
+    return (_sqlite3_wal_autocheckpoint ??= _dylib.lookupFunction<
         _c_sqlite3_wal_autocheckpoint,
-        _dart_sqlite3_wal_autocheckpoint>('sqlite3_wal_autocheckpoint');
-    return _sqlite3_wal_autocheckpoint(
+        _dart_sqlite3_wal_autocheckpoint>('sqlite3_wal_autocheckpoint'))(
       db,
       N,
     );
   }
 
-  _dart_sqlite3_wal_autocheckpoint _sqlite3_wal_autocheckpoint;
+  _dart_sqlite3_wal_autocheckpoint? _sqlite3_wal_autocheckpoint;
 
   /// CAPI3REF: Checkpoint a database
   /// METHOD: sqlite3
@@ -8286,15 +8137,15 @@
     ffi.Pointer<sqlite3> db,
     ffi.Pointer<ffi.Int8> zDb,
   ) {
-    _sqlite3_wal_checkpoint ??= _dylib.lookupFunction<_c_sqlite3_wal_checkpoint,
-        _dart_sqlite3_wal_checkpoint>('sqlite3_wal_checkpoint');
-    return _sqlite3_wal_checkpoint(
+    return (_sqlite3_wal_checkpoint ??= _dylib.lookupFunction<
+        _c_sqlite3_wal_checkpoint,
+        _dart_sqlite3_wal_checkpoint>('sqlite3_wal_checkpoint'))(
       db,
       zDb,
     );
   }
 
-  _dart_sqlite3_wal_checkpoint _sqlite3_wal_checkpoint;
+  _dart_sqlite3_wal_checkpoint? _sqlite3_wal_checkpoint;
 
   /// CAPI3REF: Checkpoint a database
   /// METHOD: sqlite3
@@ -8393,10 +8244,9 @@
     ffi.Pointer<ffi.Int32> pnLog,
     ffi.Pointer<ffi.Int32> pnCkpt,
   ) {
-    _sqlite3_wal_checkpoint_v2 ??= _dylib.lookupFunction<
+    return (_sqlite3_wal_checkpoint_v2 ??= _dylib.lookupFunction<
         _c_sqlite3_wal_checkpoint_v2,
-        _dart_sqlite3_wal_checkpoint_v2>('sqlite3_wal_checkpoint_v2');
-    return _sqlite3_wal_checkpoint_v2(
+        _dart_sqlite3_wal_checkpoint_v2>('sqlite3_wal_checkpoint_v2'))(
       db,
       zDb,
       eMode,
@@ -8405,7 +8255,7 @@
     );
   }
 
-  _dart_sqlite3_wal_checkpoint_v2 _sqlite3_wal_checkpoint_v2;
+  _dart_sqlite3_wal_checkpoint_v2? _sqlite3_wal_checkpoint_v2;
 
   /// CAPI3REF: Virtual Table Interface Configuration
   ///
@@ -8427,15 +8277,15 @@
     ffi.Pointer<sqlite3> arg0,
     int op,
   ) {
-    _sqlite3_vtab_config ??= _dylib.lookupFunction<_c_sqlite3_vtab_config,
-        _dart_sqlite3_vtab_config>('sqlite3_vtab_config');
-    return _sqlite3_vtab_config(
+    return (_sqlite3_vtab_config ??= _dylib.lookupFunction<
+        _c_sqlite3_vtab_config,
+        _dart_sqlite3_vtab_config>('sqlite3_vtab_config'))(
       arg0,
       op,
     );
   }
 
-  _dart_sqlite3_vtab_config _sqlite3_vtab_config;
+  _dart_sqlite3_vtab_config? _sqlite3_vtab_config;
 
   /// CAPI3REF: Determine The Virtual Table Conflict Policy
   ///
@@ -8448,15 +8298,14 @@
   int sqlite3_vtab_on_conflict(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_vtab_on_conflict ??= _dylib.lookupFunction<
+    return (_sqlite3_vtab_on_conflict ??= _dylib.lookupFunction<
         _c_sqlite3_vtab_on_conflict,
-        _dart_sqlite3_vtab_on_conflict>('sqlite3_vtab_on_conflict');
-    return _sqlite3_vtab_on_conflict(
+        _dart_sqlite3_vtab_on_conflict>('sqlite3_vtab_on_conflict'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_vtab_on_conflict _sqlite3_vtab_on_conflict;
+  _dart_sqlite3_vtab_on_conflict? _sqlite3_vtab_on_conflict;
 
   /// CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE
   ///
@@ -8476,14 +8325,14 @@
   int sqlite3_vtab_nochange(
     ffi.Pointer<sqlite3_context> arg0,
   ) {
-    _sqlite3_vtab_nochange ??= _dylib.lookupFunction<_c_sqlite3_vtab_nochange,
-        _dart_sqlite3_vtab_nochange>('sqlite3_vtab_nochange');
-    return _sqlite3_vtab_nochange(
+    return (_sqlite3_vtab_nochange ??= _dylib.lookupFunction<
+        _c_sqlite3_vtab_nochange,
+        _dart_sqlite3_vtab_nochange>('sqlite3_vtab_nochange'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_vtab_nochange _sqlite3_vtab_nochange;
+  _dart_sqlite3_vtab_nochange? _sqlite3_vtab_nochange;
 
   /// CAPI3REF: Determine The Collation For a Virtual Table Constraint
   ///
@@ -8500,15 +8349,15 @@
     ffi.Pointer<sqlite3_index_info> arg0,
     int arg1,
   ) {
-    _sqlite3_vtab_collation ??= _dylib.lookupFunction<_c_sqlite3_vtab_collation,
-        _dart_sqlite3_vtab_collation>('sqlite3_vtab_collation');
-    return _sqlite3_vtab_collation(
+    return (_sqlite3_vtab_collation ??= _dylib.lookupFunction<
+        _c_sqlite3_vtab_collation,
+        _dart_sqlite3_vtab_collation>('sqlite3_vtab_collation'))(
       arg0,
       arg1,
     );
   }
 
-  _dart_sqlite3_vtab_collation _sqlite3_vtab_collation;
+  _dart_sqlite3_vtab_collation? _sqlite3_vtab_collation;
 
   /// CAPI3REF: Prepared Statement Scan Status
   /// METHOD: sqlite3_stmt
@@ -8545,10 +8394,9 @@
     int iScanStatusOp,
     ffi.Pointer<ffi.Void> pOut,
   ) {
-    _sqlite3_stmt_scanstatus ??= _dylib.lookupFunction<
+    return (_sqlite3_stmt_scanstatus ??= _dylib.lookupFunction<
         _c_sqlite3_stmt_scanstatus,
-        _dart_sqlite3_stmt_scanstatus>('sqlite3_stmt_scanstatus');
-    return _sqlite3_stmt_scanstatus(
+        _dart_sqlite3_stmt_scanstatus>('sqlite3_stmt_scanstatus'))(
       pStmt,
       idx,
       iScanStatusOp,
@@ -8556,7 +8404,7 @@
     );
   }
 
-  _dart_sqlite3_stmt_scanstatus _sqlite3_stmt_scanstatus;
+  _dart_sqlite3_stmt_scanstatus? _sqlite3_stmt_scanstatus;
 
   /// CAPI3REF: Zero Scan-Status Counters
   /// METHOD: sqlite3_stmt
@@ -8568,15 +8416,14 @@
   void sqlite3_stmt_scanstatus_reset(
     ffi.Pointer<sqlite3_stmt> arg0,
   ) {
-    _sqlite3_stmt_scanstatus_reset ??= _dylib.lookupFunction<
+    return (_sqlite3_stmt_scanstatus_reset ??= _dylib.lookupFunction<
         _c_sqlite3_stmt_scanstatus_reset,
-        _dart_sqlite3_stmt_scanstatus_reset>('sqlite3_stmt_scanstatus_reset');
-    return _sqlite3_stmt_scanstatus_reset(
+        _dart_sqlite3_stmt_scanstatus_reset>('sqlite3_stmt_scanstatus_reset'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_stmt_scanstatus_reset _sqlite3_stmt_scanstatus_reset;
+  _dart_sqlite3_stmt_scanstatus_reset? _sqlite3_stmt_scanstatus_reset;
 
   /// CAPI3REF: Flush caches to disk mid-transaction
   ///
@@ -8609,14 +8456,14 @@
   int sqlite3_db_cacheflush(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_db_cacheflush ??= _dylib.lookupFunction<_c_sqlite3_db_cacheflush,
-        _dart_sqlite3_db_cacheflush>('sqlite3_db_cacheflush');
-    return _sqlite3_db_cacheflush(
+    return (_sqlite3_db_cacheflush ??= _dylib.lookupFunction<
+        _c_sqlite3_db_cacheflush,
+        _dart_sqlite3_db_cacheflush>('sqlite3_db_cacheflush'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_db_cacheflush _sqlite3_db_cacheflush;
+  _dart_sqlite3_db_cacheflush? _sqlite3_db_cacheflush;
 
   /// CAPI3REF: Low-level system error code
   ///
@@ -8629,14 +8476,14 @@
   int sqlite3_system_errno(
     ffi.Pointer<sqlite3> arg0,
   ) {
-    _sqlite3_system_errno ??= _dylib.lookupFunction<_c_sqlite3_system_errno,
-        _dart_sqlite3_system_errno>('sqlite3_system_errno');
-    return _sqlite3_system_errno(
+    return (_sqlite3_system_errno ??= _dylib.lookupFunction<
+        _c_sqlite3_system_errno,
+        _dart_sqlite3_system_errno>('sqlite3_system_errno'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_system_errno _sqlite3_system_errno;
+  _dart_sqlite3_system_errno? _sqlite3_system_errno;
 
   /// CAPI3REF: Record A Database Snapshot
   /// CONSTRUCTOR: sqlite3_snapshot
@@ -8684,16 +8531,16 @@
     ffi.Pointer<ffi.Int8> zSchema,
     ffi.Pointer<ffi.Pointer<sqlite3_snapshot>> ppSnapshot,
   ) {
-    _sqlite3_snapshot_get ??= _dylib.lookupFunction<_c_sqlite3_snapshot_get,
-        _dart_sqlite3_snapshot_get>('sqlite3_snapshot_get');
-    return _sqlite3_snapshot_get(
+    return (_sqlite3_snapshot_get ??= _dylib.lookupFunction<
+        _c_sqlite3_snapshot_get,
+        _dart_sqlite3_snapshot_get>('sqlite3_snapshot_get'))(
       db,
       zSchema,
       ppSnapshot,
     );
   }
 
-  _dart_sqlite3_snapshot_get _sqlite3_snapshot_get;
+  _dart_sqlite3_snapshot_get? _sqlite3_snapshot_get;
 
   /// CAPI3REF: Start a read transaction on an historical snapshot
   /// METHOD: sqlite3_snapshot
@@ -8741,16 +8588,16 @@
     ffi.Pointer<ffi.Int8> zSchema,
     ffi.Pointer<sqlite3_snapshot> pSnapshot,
   ) {
-    _sqlite3_snapshot_open ??= _dylib.lookupFunction<_c_sqlite3_snapshot_open,
-        _dart_sqlite3_snapshot_open>('sqlite3_snapshot_open');
-    return _sqlite3_snapshot_open(
+    return (_sqlite3_snapshot_open ??= _dylib.lookupFunction<
+        _c_sqlite3_snapshot_open,
+        _dart_sqlite3_snapshot_open>('sqlite3_snapshot_open'))(
       db,
       zSchema,
       pSnapshot,
     );
   }
 
-  _dart_sqlite3_snapshot_open _sqlite3_snapshot_open;
+  _dart_sqlite3_snapshot_open? _sqlite3_snapshot_open;
 
   /// CAPI3REF: Destroy a snapshot
   /// DESTRUCTOR: sqlite3_snapshot
@@ -8764,14 +8611,14 @@
   void sqlite3_snapshot_free(
     ffi.Pointer<sqlite3_snapshot> arg0,
   ) {
-    _sqlite3_snapshot_free ??= _dylib.lookupFunction<_c_sqlite3_snapshot_free,
-        _dart_sqlite3_snapshot_free>('sqlite3_snapshot_free');
-    return _sqlite3_snapshot_free(
+    return (_sqlite3_snapshot_free ??= _dylib.lookupFunction<
+        _c_sqlite3_snapshot_free,
+        _dart_sqlite3_snapshot_free>('sqlite3_snapshot_free'))(
       arg0,
     );
   }
 
-  _dart_sqlite3_snapshot_free _sqlite3_snapshot_free;
+  _dart_sqlite3_snapshot_free? _sqlite3_snapshot_free;
 
   /// CAPI3REF: Compare the ages of two snapshot handles.
   /// METHOD: sqlite3_snapshot
@@ -8800,15 +8647,15 @@
     ffi.Pointer<sqlite3_snapshot> p1,
     ffi.Pointer<sqlite3_snapshot> p2,
   ) {
-    _sqlite3_snapshot_cmp ??= _dylib.lookupFunction<_c_sqlite3_snapshot_cmp,
-        _dart_sqlite3_snapshot_cmp>('sqlite3_snapshot_cmp');
-    return _sqlite3_snapshot_cmp(
+    return (_sqlite3_snapshot_cmp ??= _dylib.lookupFunction<
+        _c_sqlite3_snapshot_cmp,
+        _dart_sqlite3_snapshot_cmp>('sqlite3_snapshot_cmp'))(
       p1,
       p2,
     );
   }
 
-  _dart_sqlite3_snapshot_cmp _sqlite3_snapshot_cmp;
+  _dart_sqlite3_snapshot_cmp? _sqlite3_snapshot_cmp;
 
   /// CAPI3REF: Recover snapshots from a wal file
   /// METHOD: sqlite3_snapshot
@@ -8835,16 +8682,15 @@
     ffi.Pointer<sqlite3> db,
     ffi.Pointer<ffi.Int8> zDb,
   ) {
-    _sqlite3_snapshot_recover ??= _dylib.lookupFunction<
+    return (_sqlite3_snapshot_recover ??= _dylib.lookupFunction<
         _c_sqlite3_snapshot_recover,
-        _dart_sqlite3_snapshot_recover>('sqlite3_snapshot_recover');
-    return _sqlite3_snapshot_recover(
+        _dart_sqlite3_snapshot_recover>('sqlite3_snapshot_recover'))(
       db,
       zDb,
     );
   }
 
-  _dart_sqlite3_snapshot_recover _sqlite3_snapshot_recover;
+  _dart_sqlite3_snapshot_recover? _sqlite3_snapshot_recover;
 
   /// CAPI3REF: Serialize a database
   ///
@@ -8886,10 +8732,9 @@
     ffi.Pointer<ffi.Int64> piSize,
     int mFlags,
   ) {
-    _sqlite3_serialize ??=
+    return (_sqlite3_serialize ??=
         _dylib.lookupFunction<_c_sqlite3_serialize, _dart_sqlite3_serialize>(
-            'sqlite3_serialize');
-    return _sqlite3_serialize(
+            'sqlite3_serialize'))(
       db,
       zSchema,
       piSize,
@@ -8897,7 +8742,7 @@
     );
   }
 
-  _dart_sqlite3_serialize _sqlite3_serialize;
+  _dart_sqlite3_serialize? _sqlite3_serialize;
 
   /// CAPI3REF: Deserialize a database
   ///
@@ -8934,9 +8779,9 @@
     int szBuf,
     int mFlags,
   ) {
-    _sqlite3_deserialize ??= _dylib.lookupFunction<_c_sqlite3_deserialize,
-        _dart_sqlite3_deserialize>('sqlite3_deserialize');
-    return _sqlite3_deserialize(
+    return (_sqlite3_deserialize ??= _dylib.lookupFunction<
+        _c_sqlite3_deserialize,
+        _dart_sqlite3_deserialize>('sqlite3_deserialize'))(
       db,
       zSchema,
       pData,
@@ -8946,7 +8791,7 @@
     );
   }
 
-  _dart_sqlite3_deserialize _sqlite3_deserialize;
+  _dart_sqlite3_deserialize? _sqlite3_deserialize;
 
   /// Register a geometry callback named zGeom that can be used as part of an
   /// R-Tree geometry query as follows:
@@ -8958,11 +8803,10 @@
     ffi.Pointer<ffi.NativeFunction<_typedefC_71>> xGeom,
     ffi.Pointer<ffi.Void> pContext,
   ) {
-    _sqlite3_rtree_geometry_callback ??= _dylib.lookupFunction<
+    return (_sqlite3_rtree_geometry_callback ??= _dylib.lookupFunction<
             _c_sqlite3_rtree_geometry_callback,
             _dart_sqlite3_rtree_geometry_callback>(
-        'sqlite3_rtree_geometry_callback');
-    return _sqlite3_rtree_geometry_callback(
+        'sqlite3_rtree_geometry_callback'))(
       db,
       zGeom,
       xGeom,
@@ -8970,7 +8814,7 @@
     );
   }
 
-  _dart_sqlite3_rtree_geometry_callback _sqlite3_rtree_geometry_callback;
+  _dart_sqlite3_rtree_geometry_callback? _sqlite3_rtree_geometry_callback;
 
   /// Register a 2nd-generation geometry callback named zScore that can be
   /// used as part of an R-Tree geometry query as follows:
@@ -8983,10 +8827,9 @@
     ffi.Pointer<ffi.Void> pContext,
     ffi.Pointer<ffi.NativeFunction<_typedefC_73>> xDestructor,
   ) {
-    _sqlite3_rtree_query_callback ??= _dylib.lookupFunction<
+    return (_sqlite3_rtree_query_callback ??= _dylib.lookupFunction<
         _c_sqlite3_rtree_query_callback,
-        _dart_sqlite3_rtree_query_callback>('sqlite3_rtree_query_callback');
-    return _sqlite3_rtree_query_callback(
+        _dart_sqlite3_rtree_query_callback>('sqlite3_rtree_query_callback'))(
       db,
       zQueryFunc,
       xQueryFunc,
@@ -8995,7 +8838,7 @@
     );
   }
 
-  _dart_sqlite3_rtree_query_callback _sqlite3_rtree_query_callback;
+  _dart_sqlite3_rtree_query_callback? _sqlite3_rtree_query_callback;
 }
 
 class sqlite3 extends ffi.Struct {}
@@ -9004,45 +8847,45 @@
 
 class sqlite3_io_methods extends ffi.Struct {
   @ffi.Int32()
-  int iVersion;
+  external int iVersion;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> xClose;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> xClose;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_3>> xRead;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_3>> xRead;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_4>> xWrite;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_4>> xWrite;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_5>> xTruncate;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_5>> xTruncate;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_6>> xSync;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_6>> xSync;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_7>> xFileSize;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_7>> xFileSize;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_8>> xLock;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_8>> xLock;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_9>> xUnlock;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_9>> xUnlock;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_10>> xCheckReservedLock;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_10>> xCheckReservedLock;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_11>> xFileControl;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_11>> xFileControl;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_12>> xSectorSize;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_12>> xSectorSize;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_13>> xDeviceCharacteristics;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_13>> xDeviceCharacteristics;
 
   /// Methods above are valid for version 1
-  ffi.Pointer<ffi.NativeFunction<_typedefC_14>> xShmMap;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_14>> xShmMap;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_15>> xShmLock;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_15>> xShmLock;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_16>> xShmBarrier;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_16>> xShmBarrier;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_17>> xShmUnmap;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_17>> xShmUnmap;
 
   /// Methods above are valid for version 2
-  ffi.Pointer<ffi.NativeFunction<_typedefC_18>> xFetch;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_18>> xFetch;
 
-  ffi.Pointer<ffi.NativeFunction<_typedefC_19>> xUnfetch;
+  external ffi.Pointer<ffi.NativeFunction<_typedefC_19>> xUnfetch;
 }
 
 class sqlite3_mutex extends ffi.Struct {}
@@ -9248,101 +9091,101 @@
 /// the most recent version.
 class sqlite3_snapshot extends ffi.Struct {
   @ffi.Uint8()
-  int _unique_hidden_item_0;
+  external int _unique_hidden_item_0;
   @ffi.Uint8()
-  int _unique_hidden_item_1;
+  external int _unique_hidden_item_1;
   @ffi.Uint8()
-  int _unique_hidden_item_2;
+  external int _unique_hidden_item_2;
   @ffi.Uint8()
-  int _unique_hidden_item_3;
+  external int _unique_hidden_item_3;
   @ffi.Uint8()
-  int _unique_hidden_item_4;
+  external int _unique_hidden_item_4;
   @ffi.Uint8()
-  int _unique_hidden_item_5;
+  external int _unique_hidden_item_5;
   @ffi.Uint8()
-  int _unique_hidden_item_6;
+  external int _unique_hidden_item_6;
   @ffi.Uint8()
-  int _unique_hidden_item_7;
+  external int _unique_hidden_item_7;
   @ffi.Uint8()
-  int _unique_hidden_item_8;
+  external int _unique_hidden_item_8;
   @ffi.Uint8()
-  int _unique_hidden_item_9;
+  external int _unique_hidden_item_9;
   @ffi.Uint8()
-  int _unique_hidden_item_10;
+  external int _unique_hidden_item_10;
   @ffi.Uint8()
-  int _unique_hidden_item_11;
+  external int _unique_hidden_item_11;
   @ffi.Uint8()
-  int _unique_hidden_item_12;
+  external int _unique_hidden_item_12;
   @ffi.Uint8()
-  int _unique_hidden_item_13;
+  external int _unique_hidden_item_13;
   @ffi.Uint8()
-  int _unique_hidden_item_14;
+  external int _unique_hidden_item_14;
   @ffi.Uint8()
-  int _unique_hidden_item_15;
+  external int _unique_hidden_item_15;
   @ffi.Uint8()
-  int _unique_hidden_item_16;
+  external int _unique_hidden_item_16;
   @ffi.Uint8()
-  int _unique_hidden_item_17;
+  external int _unique_hidden_item_17;
   @ffi.Uint8()
-  int _unique_hidden_item_18;
+  external int _unique_hidden_item_18;
   @ffi.Uint8()
-  int _unique_hidden_item_19;
+  external int _unique_hidden_item_19;
   @ffi.Uint8()
-  int _unique_hidden_item_20;
+  external int _unique_hidden_item_20;
   @ffi.Uint8()
-  int _unique_hidden_item_21;
+  external int _unique_hidden_item_21;
   @ffi.Uint8()
-  int _unique_hidden_item_22;
+  external int _unique_hidden_item_22;
   @ffi.Uint8()
-  int _unique_hidden_item_23;
+  external int _unique_hidden_item_23;
   @ffi.Uint8()
-  int _unique_hidden_item_24;
+  external int _unique_hidden_item_24;
   @ffi.Uint8()
-  int _unique_hidden_item_25;
+  external int _unique_hidden_item_25;
   @ffi.Uint8()
-  int _unique_hidden_item_26;
+  external int _unique_hidden_item_26;
   @ffi.Uint8()
-  int _unique_hidden_item_27;
+  external int _unique_hidden_item_27;
   @ffi.Uint8()
-  int _unique_hidden_item_28;
+  external int _unique_hidden_item_28;
   @ffi.Uint8()
-  int _unique_hidden_item_29;
+  external int _unique_hidden_item_29;
   @ffi.Uint8()
-  int _unique_hidden_item_30;
+  external int _unique_hidden_item_30;
   @ffi.Uint8()
-  int _unique_hidden_item_31;
+  external int _unique_hidden_item_31;
   @ffi.Uint8()
-  int _unique_hidden_item_32;
+  external int _unique_hidden_item_32;
   @ffi.Uint8()
-  int _unique_hidden_item_33;
+  external int _unique_hidden_item_33;
   @ffi.Uint8()
-  int _unique_hidden_item_34;
+  external int _unique_hidden_item_34;
   @ffi.Uint8()
-  int _unique_hidden_item_35;
+  external int _unique_hidden_item_35;
   @ffi.Uint8()
-  int _unique_hidden_item_36;
+  external int _unique_hidden_item_36;
   @ffi.Uint8()
-  int _unique_hidden_item_37;
+  external int _unique_hidden_item_37;
   @ffi.Uint8()
-  int _unique_hidden_item_38;
+  external int _unique_hidden_item_38;
   @ffi.Uint8()
-  int _unique_hidden_item_39;
+  external int _unique_hidden_item_39;
   @ffi.Uint8()
-  int _unique_hidden_item_40;
+  external int _unique_hidden_item_40;
   @ffi.Uint8()
-  int _unique_hidden_item_41;
+  external int _unique_hidden_item_41;
   @ffi.Uint8()
-  int _unique_hidden_item_42;
+  external int _unique_hidden_item_42;
   @ffi.Uint8()
-  int _unique_hidden_item_43;
+  external int _unique_hidden_item_43;
   @ffi.Uint8()
-  int _unique_hidden_item_44;
+  external int _unique_hidden_item_44;
   @ffi.Uint8()
-  int _unique_hidden_item_45;
+  external int _unique_hidden_item_45;
   @ffi.Uint8()
-  int _unique_hidden_item_46;
+  external int _unique_hidden_item_46;
   @ffi.Uint8()
-  int _unique_hidden_item_47;
+  external int _unique_hidden_item_47;
 
   /// Helper for array `hidden`.
   ArrayHelper_sqlite3_snapshot_hidden_level0 get hidden =>
diff --git a/test/native_test/build_test_dylib.dart b/test/native_test/build_test_dylib.dart
index e829231..5ec89ac 100644
--- a/test/native_test/build_test_dylib.dart
+++ b/test/native_test/build_test_dylib.dart
@@ -28,8 +28,6 @@
 
 import 'dart:io';
 
-import 'package:meta/meta.dart';
-
 const macOS = 'macos';
 const windows = 'windows';
 const linux = 'linux';
@@ -57,7 +55,7 @@
 
 void main(List<String> arguments) {
   print('Building Dynamic Library for Native Tests... ');
-  final options = getPlatformOptions();
+  final options = getPlatformOptions()!;
 
   // Run clang compiler to generate the dynamic library.
   // ignore: omit_local_variable_types
@@ -93,7 +91,7 @@
 }
 
 /// Get options based on current platform.
-Options getPlatformOptions() {
+Options? getPlatformOptions() {
   if (Platform.isMacOS) {
     return platformOptions[macOS];
   } else if (Platform.isWindows) {
@@ -123,9 +121,9 @@
   final String moduleDefPath;
 
   Options({
-    @required this.outputfilename,
-    @required this.sharedFlag,
-    @required this.inputHeader,
+    required this.outputfilename,
+    required this.sharedFlag,
+    required this.inputHeader,
     this.fPIC = '',
     this.moduleDefPath = '',
   });
diff --git a/test/native_test/native_test.dart b/test/native_test/native_test.dart
index baa1bac..479b910 100644
--- a/test/native_test/native_test.dart
+++ b/test/native_test/native_test.dart
@@ -14,7 +14,7 @@
 import 'native_test_bindings.dart';
 
 void main() {
-  NativeLibrary bindings;
+  late NativeLibrary bindings;
   group('native_test', () {
     setUpAll(() {
       logWarnings();
@@ -24,8 +24,8 @@
       } else if (Platform.isWindows) {
         dylibName = r'test\native_test\native_test.dll';
       }
-      bindings = NativeLibrary(
-          DynamicLibrary.open(File(dylibName).absolute?.path ?? dylibName));
+      bindings =
+          NativeLibrary(DynamicLibrary.open(File(dylibName).absolute.path));
     });
 
     test('generate_bindings', () {
@@ -46,7 +46,7 @@
           file.delete();
         }
       } catch (e) {
-        print('Failed test: Debug generated file: ${file.absolute?.path}');
+        print('Failed test: Debug generated file: ${file.absolute.path}');
         rethrow;
       }
     });
diff --git a/test/native_test/native_test_bindings.dart b/test/native_test/native_test_bindings.dart
index c5cdd81..60825f1 100644
--- a/test/native_test/native_test_bindings.dart
+++ b/test/native_test/native_test_bindings.dart
@@ -14,183 +14,172 @@
   bool Function1Bool(
     bool x,
   ) {
-    _Function1Bool ??= _dylib
-        .lookupFunction<_c_Function1Bool, _dart_Function1Bool>('Function1Bool');
-    return _Function1Bool(
+    return (_Function1Bool ??=
+            _dylib.lookupFunction<_c_Function1Bool, _dart_Function1Bool>(
+                'Function1Bool'))(
           x ? 1 : 0,
         ) !=
         0;
   }
 
-  _dart_Function1Bool _Function1Bool;
+  _dart_Function1Bool? _Function1Bool;
 
   int Function1Uint8(
     int x,
   ) {
-    _Function1Uint8 ??=
+    return (_Function1Uint8 ??=
         _dylib.lookupFunction<_c_Function1Uint8, _dart_Function1Uint8>(
-            'Function1Uint8');
-    return _Function1Uint8(
+            'Function1Uint8'))(
       x,
     );
   }
 
-  _dart_Function1Uint8 _Function1Uint8;
+  _dart_Function1Uint8? _Function1Uint8;
 
   int Function1Uint16(
     int x,
   ) {
-    _Function1Uint16 ??=
+    return (_Function1Uint16 ??=
         _dylib.lookupFunction<_c_Function1Uint16, _dart_Function1Uint16>(
-            'Function1Uint16');
-    return _Function1Uint16(
+            'Function1Uint16'))(
       x,
     );
   }
 
-  _dart_Function1Uint16 _Function1Uint16;
+  _dart_Function1Uint16? _Function1Uint16;
 
   int Function1Uint32(
     int x,
   ) {
-    _Function1Uint32 ??=
+    return (_Function1Uint32 ??=
         _dylib.lookupFunction<_c_Function1Uint32, _dart_Function1Uint32>(
-            'Function1Uint32');
-    return _Function1Uint32(
+            'Function1Uint32'))(
       x,
     );
   }
 
-  _dart_Function1Uint32 _Function1Uint32;
+  _dart_Function1Uint32? _Function1Uint32;
 
   int Function1Uint64(
     int x,
   ) {
-    _Function1Uint64 ??=
+    return (_Function1Uint64 ??=
         _dylib.lookupFunction<_c_Function1Uint64, _dart_Function1Uint64>(
-            'Function1Uint64');
-    return _Function1Uint64(
+            'Function1Uint64'))(
       x,
     );
   }
 
-  _dart_Function1Uint64 _Function1Uint64;
+  _dart_Function1Uint64? _Function1Uint64;
 
   int Function1Int8(
     int x,
   ) {
-    _Function1Int8 ??= _dylib
-        .lookupFunction<_c_Function1Int8, _dart_Function1Int8>('Function1Int8');
-    return _Function1Int8(
+    return (_Function1Int8 ??=
+        _dylib.lookupFunction<_c_Function1Int8, _dart_Function1Int8>(
+            'Function1Int8'))(
       x,
     );
   }
 
-  _dart_Function1Int8 _Function1Int8;
+  _dart_Function1Int8? _Function1Int8;
 
   int Function1Int16(
     int x,
   ) {
-    _Function1Int16 ??=
+    return (_Function1Int16 ??=
         _dylib.lookupFunction<_c_Function1Int16, _dart_Function1Int16>(
-            'Function1Int16');
-    return _Function1Int16(
+            'Function1Int16'))(
       x,
     );
   }
 
-  _dart_Function1Int16 _Function1Int16;
+  _dart_Function1Int16? _Function1Int16;
 
   int Function1Int32(
     int x,
   ) {
-    _Function1Int32 ??=
+    return (_Function1Int32 ??=
         _dylib.lookupFunction<_c_Function1Int32, _dart_Function1Int32>(
-            'Function1Int32');
-    return _Function1Int32(
+            'Function1Int32'))(
       x,
     );
   }
 
-  _dart_Function1Int32 _Function1Int32;
+  _dart_Function1Int32? _Function1Int32;
 
   int Function1Int64(
     int x,
   ) {
-    _Function1Int64 ??=
+    return (_Function1Int64 ??=
         _dylib.lookupFunction<_c_Function1Int64, _dart_Function1Int64>(
-            'Function1Int64');
-    return _Function1Int64(
+            'Function1Int64'))(
       x,
     );
   }
 
-  _dart_Function1Int64 _Function1Int64;
+  _dart_Function1Int64? _Function1Int64;
 
   int Function1IntPtr(
     int x,
   ) {
-    _Function1IntPtr ??=
+    return (_Function1IntPtr ??=
         _dylib.lookupFunction<_c_Function1IntPtr, _dart_Function1IntPtr>(
-            'Function1IntPtr');
-    return _Function1IntPtr(
+            'Function1IntPtr'))(
       x,
     );
   }
 
-  _dart_Function1IntPtr _Function1IntPtr;
+  _dart_Function1IntPtr? _Function1IntPtr;
 
   double Function1Float(
     double x,
   ) {
-    _Function1Float ??=
+    return (_Function1Float ??=
         _dylib.lookupFunction<_c_Function1Float, _dart_Function1Float>(
-            'Function1Float');
-    return _Function1Float(
+            'Function1Float'))(
       x,
     );
   }
 
-  _dart_Function1Float _Function1Float;
+  _dart_Function1Float? _Function1Float;
 
   double Function1Double(
     double x,
   ) {
-    _Function1Double ??=
+    return (_Function1Double ??=
         _dylib.lookupFunction<_c_Function1Double, _dart_Function1Double>(
-            'Function1Double');
-    return _Function1Double(
+            'Function1Double'))(
       x,
     );
   }
 
-  _dart_Function1Double _Function1Double;
+  _dart_Function1Double? _Function1Double;
 
   ffi.Pointer<Struct1> getStruct1() {
-    _getStruct1 ??=
-        _dylib.lookupFunction<_c_getStruct1, _dart_getStruct1>('getStruct1');
-    return _getStruct1();
+    return (_getStruct1 ??=
+        _dylib.lookupFunction<_c_getStruct1, _dart_getStruct1>('getStruct1'))();
   }
 
-  _dart_getStruct1 _getStruct1;
+  _dart_getStruct1? _getStruct1;
 }
 
 class Struct1 extends ffi.Struct {
   @ffi.Int8()
-  int a;
+  external int a;
 
   @ffi.Int32()
-  int _unique_data_item_0;
+  external int _unique_data_item_0;
   @ffi.Int32()
-  int _unique_data_item_1;
+  external int _unique_data_item_1;
   @ffi.Int32()
-  int _unique_data_item_2;
+  external int _unique_data_item_2;
   @ffi.Int32()
-  int _unique_data_item_3;
+  external int _unique_data_item_3;
   @ffi.Int32()
-  int _unique_data_item_4;
+  external int _unique_data_item_4;
   @ffi.Int32()
-  int _unique_data_item_5;
+  external int _unique_data_item_5;
 
   /// Helper for array `data`.
   ArrayHelper_Struct1_data_level0 get data =>
diff --git a/test/rename_tests/rename_test.dart b/test/rename_tests/rename_test.dart
index 962e545..b6fd403 100644
--- a/test/rename_tests/rename_test.dart
+++ b/test/rename_tests/rename_test.dart
@@ -11,7 +11,7 @@
 
 import '../test_utils.dart';
 
-Library actual, expected;
+late Library actual, expected;
 final functionPrefix = 'fff';
 final structPrefix = 'sss';
 final enumPrefix = 'eee';
diff --git a/test/test_coverage.dart b/test/test_coverage.dart
index a35f0f7..ede39f3 100644
--- a/test/test_coverage.dart
+++ b/test/test_coverage.dart
@@ -13,12 +13,16 @@
     as example_tests_libclang_example_test;
 import 'example_tests/simple_example_test.dart'
     as example_tests_simple_example_test;
+import 'header_parser_tests/dart_handle_test.dart'
+    as header_parser_tests_dart_handle_test;
 import 'header_parser_tests/function_n_struct_test.dart'
     as header_parser_tests_function_n_struct_test;
 import 'header_parser_tests/functions_test.dart'
     as header_parser_tests_functions_test;
 import 'header_parser_tests/macros_test.dart'
     as header_parser_tests_macros_test;
+import 'header_parser_tests/native_func_typedef_test.dart'
+    as header_parser_tests_native_func_typedef_test;
 import 'header_parser_tests/nested_parsing_test.dart'
     as header_parser_tests_nested_parsing_test;
 import 'header_parser_tests/typedef_test.dart'
@@ -37,9 +41,11 @@
   example_tests_libclang_example_test.main();
   collision_tests_decl_decl_collision_test.main();
   collision_tests_reserved_keyword_collision_test.main();
+  header_parser_tests_dart_handle_test.main();
   header_parser_tests_functions_test.main();
   header_parser_tests_macros_test.main();
   header_parser_tests_function_n_struct_test.main();
+  header_parser_tests_native_func_typedef_test.main();
   header_parser_tests_nested_parsing_test.main();
   header_parser_tests_typedef_test.main();
   header_parser_tests_unnamed_enums_test.main();
diff --git a/test/test_utils.dart b/test/test_utils.dart
index 0d94d29..1eebadb 100644
--- a/test/test_utils.dart
+++ b/test/test_utils.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io';
 
+import 'package:collection/collection.dart' show IterableExtension;
 import 'package:ffigen/src/code_generator.dart';
 import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
@@ -14,8 +15,7 @@
 extension LibraryTestExt on Library {
   /// Get a [Binding]'s generated string with a given name.
   String getBindingAsString(String name) {
-    final b = bindings.firstWhere((element) => element.name == name,
-        orElse: () => null);
+    final b = bindings.firstWhereOrNull((element) => element.name == name);
     if (b == null) {
       throw NotFoundException("Binding '$name' not found.");
     } else {
@@ -25,8 +25,7 @@
 
   /// Get a [Binding] with a given name.
   Binding getBinding(String name) {
-    final b = bindings.firstWhere((element) => element.name == name,
-        orElse: () => null);
+    final b = bindings.firstWhereOrNull((element) => element.name == name);
     if (b == null) {
       throw NotFoundException("Binding '$name' not found.");
     } else {
@@ -53,7 +52,7 @@
       file.delete();
     }
   } catch (e) {
-    print('Failed test: Debug generated file: ${file.absolute?.path}');
+    print('Failed test: Debug generated file: ${file.absolute.path}');
     rethrow;
   }
 }
diff --git a/tool/coverage.sh b/tool/coverage.sh
new file mode 100755
index 0000000..d43016d
--- /dev/null
+++ b/tool/coverage.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# Copyright (c) 2020, 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.
+
+# Fast fail the script on failures.
+set -e
+
+# Gather coverage.
+pub global activate remove_from_coverage
+pub global activate coverage
+# Generate coverage report.
+dart --no-sound-null-safety --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=3000 test/test_coverage.dart &
+dart pub global run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:3000/ -o coverage.json --resume-isolates
+dart pub global run coverage:format_coverage --lcov -i coverage.json -o lcov.info
+
+# Remove extra files from coverage report.
+pub global run remove_from_coverage -f lcov.info -r ".pub-cache"
diff --git a/tool/travis.sh b/tool/travis.sh
deleted file mode 100755
index 341aada..0000000
--- a/tool/travis.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-# Copyright (c) 2020, 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.
-
-# Fast fail the script on failures.
-set -e
-
-# Gather coverage.
-pub global activate remove_from_coverage
-pub global activate dart_coveralls
-# Generate coverage report.
-pub global run dart_coveralls calc test/test_coverage.dart > lcov.info
-# Remove extra files from coverage report.
-pub global run remove_from_coverage -f lcov.info -r ".pub-cache"
