diff --git a/packages/riverpod_analyzer_utils/CHANGELOG.md b/packages/riverpod_analyzer_utils/CHANGELOG.md index fec82a744..d724fe1c5 100644 --- a/packages/riverpod_analyzer_utils/CHANGELOG.md +++ b/packages/riverpod_analyzer_utils/CHANGELOG.md @@ -1,6 +1,7 @@ ## Unreleased fix - Handle cascade operators in ref expressions +- Fix ref.watch/read/... not being decoded inside Notifier methods of generated providers. ## 0.2.0 - 2023-03-13 diff --git a/packages/riverpod_analyzer_utils/lib/src/riverpod_ast/generator_provider_declaration.dart b/packages/riverpod_analyzer_utils/lib/src/riverpod_ast/generator_provider_declaration.dart index bfe7e793b..00e082c58 100644 --- a/packages/riverpod_analyzer_utils/lib/src/riverpod_ast/generator_provider_declaration.dart +++ b/packages/riverpod_analyzer_utils/lib/src/riverpod_ast/generator_provider_declaration.dart @@ -161,7 +161,7 @@ class StatefulProviderDeclaration extends GeneratorProviderDeclaration { valueType: _getValueType(createdType), ); riverpodAnnotation._parent = statefulProviderDeclaration; - buildMethod.accept( + node.accept( _GeneratorRefInvocationVisitor(statefulProviderDeclaration, parent), ); diff --git a/packages/riverpod_analyzer_utils_tests/test/ref_invocation_test.dart b/packages/riverpod_analyzer_utils_tests/test/ref_invocation_test.dart index 377d832a8..e3871e8ca 100644 --- a/packages/riverpod_analyzer_utils_tests/test/ref_invocation_test.dart +++ b/packages/riverpod_analyzer_utils_tests/test/ref_invocation_test.dart @@ -36,6 +36,44 @@ final dependency = Provider((ref) { expect(result.refWatchInvocations.single.provider.providerElement, null); }); + testSource('Decodes ref expressions in Notifier methods', + runGenerator: true, source: r''' +import 'package:riverpod/riverpod.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'foo.g.dart'; + +@riverpod +class MyNotifier extends _$MyNotifier { + @override + int build() => 0; + + void method() { + ref.watch(generatedScopedProvider); + } +} + +''', (resolver) async { +// Regression test for https://github.com/rrousselGit/riverpod/issues/2417 + final result = await resolver.resolveRiverpodAnalyssiResult(); + + final notifier = result.statefulProviderDeclarations.single; + + expect(result.refInvocations, hasLength(1)); + expect( + result.refWatchInvocations.single.provider.node.toSource(), + 'generatedScopedProvider', + ); + expect( + notifier.refInvocations.single, + isA().having( + (e) => e.provider.node.toSource(), + 'provider', + 'generatedScopedProvider', + ), + ); + }); + testSource('Decodes ..watch', runGenerator: true, source: r''' import 'package:riverpod/riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; diff --git a/packages/riverpod_lint/CHANGELOG.md b/packages/riverpod_lint/CHANGELOG.md index f64b87269..56a51426e 100644 --- a/packages/riverpod_lint/CHANGELOG.md +++ b/packages/riverpod_lint/CHANGELOG.md @@ -3,6 +3,8 @@ - Disable unsupported_provider_value when a notifier returns "this" - Fix scoped_providers_should_specify_dependencies incorrectly triggering on functions other than "main" - Handle cascade operators in ref expressions +- Fix `provider_dependencies` not considering dependencies inside methods + other than `build` of a notifier. ## 1.1.7 - 2023-04-06 diff --git a/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.dart b/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.dart index eadeff3f4..99a63402d 100644 --- a/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.dart +++ b/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.dart @@ -175,3 +175,13 @@ int regression2348(Regression2348Ref ref) { ref..watch(generatedScopedProvider); return 0; } + +@Riverpod(dependencies: [generatedScoped]) +class Regression2417 extends _$Regression2417 { + @override + int build() => 0; + + void method() { + ref.watch(generatedScopedProvider); + } +} diff --git a/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.g.dart b/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.g.dart index 30f704b76..0850cd3a8 100644 --- a/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.g.dart +++ b/packages/riverpod_lint_flutter_test/test/goldens/lints/dependencies.g.dart @@ -399,4 +399,20 @@ final classWatchGeneratedScopedButMissingDependenciesProvider = typedef _$ClassWatchGeneratedScopedButMissingDependencies = AutoDisposeNotifier; +String _$regression2417Hash() => r'c9ac0ba44e849ea1460c79c1f676feba1b5400da'; + +/// See also [Regression2417]. +@ProviderFor(Regression2417) +final regression2417Provider = + AutoDisposeNotifierProvider.internal( + Regression2417.new, + name: r'regression2417Provider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$regression2417Hash, + dependencies: [generatedScopedProvider], + allTransitiveDependencies: [generatedScopedProvider], +); + +typedef _$Regression2417 = AutoDisposeNotifier; // ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions