From 0d5fa630290d06b8ecac03c04c15f927cfee61a6 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Tue, 6 Dec 2022 13:27:27 +0100 Subject: [PATCH 1/2] Enable strict mode for all SDKs but dart --- dio/analysis_options.yaml | 5 ++--- flutter/analysis_options.yaml | 4 ++++ .../src/integrations/load_contexts_integration.dart | 6 +++--- .../src/integrations/load_image_list_integration.dart | 3 ++- flutter/lib/src/sentry_asset_bundle.dart | 1 + flutter/lib/src/sentry_native_channel.dart | 10 +++++----- .../integrations/flutter_error_integration_test.dart | 2 +- .../integrations/init_native_sdk_integration_test.dart | 4 ++-- flutter/test/mocks.dart | 2 ++ flutter/test/sentry_flutter_util.dart | 2 +- flutter/test/sentry_native_channel_test.dart | 2 ++ flutter/test/sentry_navigator_observer_test.dart | 6 +++--- logging/analysis_options.yaml | 5 ++--- 13 files changed, 30 insertions(+), 22 deletions(-) diff --git a/dio/analysis_options.yaml b/dio/analysis_options.yaml index 0dd5cf84d..3956674c7 100644 --- a/dio/analysis_options.yaml +++ b/dio/analysis_options.yaml @@ -1,10 +1,9 @@ include: package:lints/recommended.yaml analyzer: - strong-mode: - implicit-casts: false - implicit-dynamic: false language: + strict-casts: true + strict-inference: true strict-raw-types: true errors: # treat missing required parameters as a warning (not a hint) diff --git a/flutter/analysis_options.yaml b/flutter/analysis_options.yaml index 99bd87e8d..47255eaaa 100644 --- a/flutter/analysis_options.yaml +++ b/flutter/analysis_options.yaml @@ -1,6 +1,10 @@ include: package:flutter_lints/flutter.yaml analyzer: + language: + strict-casts: true + strict-inference: true + strict-raw-types: true errors: # treat missing required parameters as a warning (not a hint) missing_required_param: error diff --git a/flutter/lib/src/integrations/load_contexts_integration.dart b/flutter/lib/src/integrations/load_contexts_integration.dart index cd4cbf23f..2bd3cb65c 100644 --- a/flutter/lib/src/integrations/load_contexts_integration.dart +++ b/flutter/lib/src/integrations/load_contexts_integration.dart @@ -42,9 +42,9 @@ class _LoadContextsIntegrationEventProcessor extends EventProcessor { @override FutureOr apply(SentryEvent event, {hint}) async { try { + final loadContexts = await _channel.invokeMethod('loadContexts'); final infos = Map.from( - await (_channel.invokeMethod('loadContexts')), - ); + loadContexts is Map ? loadContexts : {}); final contextsMap = infos['contexts'] as Map?; if (contextsMap != null && contextsMap.isNotEmpty) { final contexts = Contexts.fromJson( @@ -138,7 +138,7 @@ class _LoadContextsIntegrationEventProcessor extends EventProcessor { final breadcrumbsList = infos['breadcrumbs'] as List?; if (breadcrumbsList != null && breadcrumbsList.isNotEmpty) { final breadcrumbs = event.breadcrumbs ?? []; - final newBreadcrumbs = List.from(breadcrumbsList); + final newBreadcrumbs = List>.from(breadcrumbsList); for (final breadcrumb in newBreadcrumbs) { final newBreadcrumb = Map.from(breadcrumb); diff --git a/flutter/lib/src/integrations/load_image_list_integration.dart b/flutter/lib/src/integrations/load_image_list_integration.dart index 600c8a237..7a748861b 100644 --- a/flutter/lib/src/integrations/load_image_list_integration.dart +++ b/flutter/lib/src/integrations/load_image_list_integration.dart @@ -41,8 +41,9 @@ class _LoadImageListIntegrationEventProcessor extends EventProcessor { try { // we call on every event because the loaded image list is cached // and it could be changed on the Native side. + final loadImageList = await _channel.invokeMethod('loadImageList'); final imageList = List>.from( - await _channel.invokeMethod('loadImageList'), + loadImageList is List> ? loadImageList : [], ); return copyWithDebugImages(event, imageList); } catch (exception, stackTrace) { diff --git a/flutter/lib/src/sentry_asset_bundle.dart b/flutter/lib/src/sentry_asset_bundle.dart index 0f5b66dd9..df4403198 100644 --- a/flutter/lib/src/sentry_asset_bundle.dart +++ b/flutter/lib/src/sentry_asset_bundle.dart @@ -219,6 +219,7 @@ class SentryAssetBundle implements AssetBundle { Future _loadBuffer(String key) async { try { + // ignore: return_of_invalid_type return (_bundle as dynamic).loadBuffer(key); } on NoSuchMethodError catch (_) { // The loadBuffer method exists as of Flutter greater than 3.1 diff --git a/flutter/lib/src/sentry_native_channel.dart b/flutter/lib/src/sentry_native_channel.dart index 1dc1db7af..575e43b61 100644 --- a/flutter/lib/src/sentry_native_channel.dart +++ b/flutter/lib/src/sentry_native_channel.dart @@ -138,8 +138,8 @@ class NativeAppStart { factory NativeAppStart.fromJson(Map json) { return NativeAppStart( - json['appStartTime'], - json['isColdStart'], + json['appStartTime'] as double, + json['isColdStart'] as bool, ); } } @@ -153,9 +153,9 @@ class NativeFrames { factory NativeFrames.fromJson(Map json) { return NativeFrames( - json['totalFrames'], - json['slowFrames'], - json['frozenFrames'], + json['totalFrames'] as int, + json['slowFrames'] as int, + json['frozenFrames'] as int, ); } } diff --git a/flutter/test/integrations/flutter_error_integration_test.dart b/flutter/test/integrations/flutter_error_integration_test.dart index 856f931a7..9f78ae593 100644 --- a/flutter/test/integrations/flutter_error_integration_test.dart +++ b/flutter/test/integrations/flutter_error_integration_test.dart @@ -33,7 +33,7 @@ void main() { final throwable = exception ?? StateError('error'); final details = FlutterErrorDetails( - exception: throwable, + exception: throwable as Object, silent: silent, context: DiagnosticsNode.message('while handling a gesture'), library: 'sentry', diff --git a/flutter/test/integrations/init_native_sdk_integration_test.dart b/flutter/test/integrations/init_native_sdk_integration_test.dart index adce28542..d33f845d9 100644 --- a/flutter/test/integrations/init_native_sdk_integration_test.dart +++ b/flutter/test/integrations/init_native_sdk_integration_test.dart @@ -41,7 +41,7 @@ void main() { 'attachThreads': false, 'autoSessionTrackingIntervalMillis': 30000, 'dist': null, - 'integrations': [], + 'integrations': [], 'packages': [ {'name': 'pub:sentry', 'version': sdkVersion} ], @@ -149,7 +149,7 @@ void main() { final options = createOptions(); await sut.call(NoOpHub(), options); - expect(options.sdk.integrations, []); + expect(options.sdk.integrations, []); channel.setMethodCallHandler(null); }); diff --git a/flutter/test/mocks.dart b/flutter/test/mocks.dart index 6aad52500..dc86fdedc 100644 --- a/flutter/test/mocks.dart +++ b/flutter/test/mocks.dart @@ -1,3 +1,5 @@ +// ignore_for_file: inference_failure_on_function_return_type + import 'dart:async'; import 'package:flutter/services.dart'; diff --git a/flutter/test/sentry_flutter_util.dart b/flutter/test/sentry_flutter_util.dart index 154ea359a..792bbf511 100644 --- a/flutter/test/sentry_flutter_util.dart +++ b/flutter/test/sentry_flutter_util.dart @@ -4,7 +4,7 @@ import 'package:sentry_flutter/src/file_system_transport.dart'; void testTransport({ required Transport transport, - required hasFileSystemTransport, + required bool hasFileSystemTransport, }) { expect( transport is FileSystemTransport, diff --git a/flutter/test/sentry_native_channel_test.dart b/flutter/test/sentry_native_channel_test.dart index 8585d4425..1d99ba277 100644 --- a/flutter/test/sentry_native_channel_test.dart +++ b/flutter/test/sentry_native_channel_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: inference_failure_on_function_invocation + @TestOn('vm') import 'package:flutter_test/flutter_test.dart'; diff --git a/flutter/test/sentry_navigator_observer_test.dart b/flutter/test/sentry_navigator_observer_test.dart index 9895535d5..fb221f243 100644 --- a/flutter/test/sentry_navigator_observer_test.dart +++ b/flutter/test/sentry_navigator_observer_test.dart @@ -15,7 +15,7 @@ import 'mocks.mocks.dart'; void main() { late Fixture fixture; - PageRoute route(RouteSettings? settings) => PageRouteBuilder( + PageRoute route(RouteSettings? settings) => PageRouteBuilder( pageBuilder: (_, __, ___) => Container(), settings: settings, ); @@ -92,7 +92,7 @@ void main() { actualTransaction = scope.span as SentryTracer; }); - await Future.delayed(Duration(milliseconds: 500)); + await Future.delayed(Duration(milliseconds: 500)); expect(mockNativeChannel.numberOfEndNativeFramesCalls, 1); @@ -569,7 +569,7 @@ void main() { }); test('No RouteSettings', () { - PageRoute route() => PageRouteBuilder( + PageRoute route() => PageRouteBuilder( pageBuilder: (_, __, ___) => Container(), ); diff --git a/logging/analysis_options.yaml b/logging/analysis_options.yaml index f80d2938b..5cffd7c48 100644 --- a/logging/analysis_options.yaml +++ b/logging/analysis_options.yaml @@ -1,10 +1,9 @@ include: package:lints/recommended.yaml analyzer: - strong-mode: - implicit-casts: false - implicit-dynamic: false language: + strict-casts: true + strict-inference: true strict-raw-types: true errors: # treat missing required parameters as a warning (not a hint) From 14e42b326d29486b1a48776812b5a48a306b3330 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Wed, 7 Dec 2022 14:23:41 +0100 Subject: [PATCH 2/2] fixes --- flutter/example/lib/main.dart | 2 +- flutter/lib/src/file_system_transport.dart | 2 +- .../lib/src/integrations/load_contexts_integration.dart | 8 +++++--- .../lib/src/integrations/load_image_list_integration.dart | 2 +- flutter/lib/src/integrations/native_sdk_integration.dart | 4 ++-- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/flutter/example/lib/main.dart b/flutter/example/lib/main.dart index 46665eadf..fe577b451 100644 --- a/flutter/example/lib/main.dart +++ b/flutter/example/lib/main.dart @@ -683,5 +683,5 @@ class ThemeProvider extends ChangeNotifier { } Future execute(String method) async { - await _channel.invokeMethod(method); + await _channel.invokeMethod(method); } diff --git a/flutter/lib/src/file_system_transport.dart b/flutter/lib/src/file_system_transport.dart index 047517c0c..cf073a38e 100644 --- a/flutter/lib/src/file_system_transport.dart +++ b/flutter/lib/src/file_system_transport.dart @@ -18,7 +18,7 @@ class FileSystemTransport implements Transport { // https://flutter.dev/docs/development/platform-integration/platform-channels#codec final args = [Uint8List.fromList(envelopeData)]; try { - await _channel.invokeMethod('captureEnvelope', args); + await _channel.invokeMethod('captureEnvelope', args); } catch (exception, stackTrace) { _options.logger( SentryLevel.error, diff --git a/flutter/lib/src/integrations/load_contexts_integration.dart b/flutter/lib/src/integrations/load_contexts_integration.dart index 2bd3cb65c..eaff186e7 100644 --- a/flutter/lib/src/integrations/load_contexts_integration.dart +++ b/flutter/lib/src/integrations/load_contexts_integration.dart @@ -43,8 +43,9 @@ class _LoadContextsIntegrationEventProcessor extends EventProcessor { FutureOr apply(SentryEvent event, {hint}) async { try { final loadContexts = await _channel.invokeMethod('loadContexts'); - final infos = Map.from( - loadContexts is Map ? loadContexts : {}); + + final infos = + Map.from(loadContexts is Map ? loadContexts : {}); final contextsMap = infos['contexts'] as Map?; if (contextsMap != null && contextsMap.isNotEmpty) { final contexts = Contexts.fromJson( @@ -138,7 +139,8 @@ class _LoadContextsIntegrationEventProcessor extends EventProcessor { final breadcrumbsList = infos['breadcrumbs'] as List?; if (breadcrumbsList != null && breadcrumbsList.isNotEmpty) { final breadcrumbs = event.breadcrumbs ?? []; - final newBreadcrumbs = List>.from(breadcrumbsList); + final newBreadcrumbs = + List>.from(breadcrumbsList); for (final breadcrumb in newBreadcrumbs) { final newBreadcrumb = Map.from(breadcrumb); diff --git a/flutter/lib/src/integrations/load_image_list_integration.dart b/flutter/lib/src/integrations/load_image_list_integration.dart index 7a748861b..e7832d018 100644 --- a/flutter/lib/src/integrations/load_image_list_integration.dart +++ b/flutter/lib/src/integrations/load_image_list_integration.dart @@ -43,7 +43,7 @@ class _LoadImageListIntegrationEventProcessor extends EventProcessor { // and it could be changed on the Native side. final loadImageList = await _channel.invokeMethod('loadImageList'); final imageList = List>.from( - loadImageList is List> ? loadImageList : [], + loadImageList is List ? loadImageList : [], ); return copyWithDebugImages(event, imageList); } catch (exception, stackTrace) { diff --git a/flutter/lib/src/integrations/native_sdk_integration.dart b/flutter/lib/src/integrations/native_sdk_integration.dart index a8f4c678f..091a4607d 100644 --- a/flutter/lib/src/integrations/native_sdk_integration.dart +++ b/flutter/lib/src/integrations/native_sdk_integration.dart @@ -18,7 +18,7 @@ class NativeSdkIntegration extends Integration { return; } try { - await _channel.invokeMethod('initNativeSdk', { + await _channel.invokeMethod('initNativeSdk', { 'dsn': options.dsn, 'debug': options.debug, 'environment': options.environment, @@ -64,7 +64,7 @@ class NativeSdkIntegration extends Integration { return; } try { - await _channel.invokeMethod('closeNativeSdk'); + await _channel.invokeMethod('closeNativeSdk'); } catch (exception, stackTrace) { _options?.logger( SentryLevel.fatal,