diff --git a/packages/riverpod/lib/src/core/element.dart b/packages/riverpod/lib/src/core/element.dart index f8c6480cb..63a082fc6 100644 --- a/packages/riverpod/lib/src/core/element.dart +++ b/packages/riverpod/lib/src/core/element.dart @@ -537,7 +537,7 @@ depending on itself. /// - `overrideWithValue`, which relies on [update] to handle /// the scenario where the value changed. @visibleForOverriding - void update($ProviderBaseImpl newProvider) {} + void update(ProviderBase newProvider) {} /// Initialize a provider and track dependencies used during the initialization. /// diff --git a/packages/riverpod/lib/src/core/family.dart b/packages/riverpod/lib/src/core/family.dart index 91032f85e..7f7e0166d 100644 --- a/packages/riverpod/lib/src/core/family.dart +++ b/packages/riverpod/lib/src/core/family.dart @@ -58,6 +58,10 @@ final class Family extends ProviderOrFamily implements _FamilyOverride { @override Family get from => this; + @visibleForTesting + @override + Family get origin => from; + @override String toString() => name ?? describeIdentity(this); } diff --git a/packages/riverpod/lib/src/core/override.dart b/packages/riverpod/lib/src/core/override.dart index 1337b16c9..0662a501d 100644 --- a/packages/riverpod/lib/src/core/override.dart +++ b/packages/riverpod/lib/src/core/override.dart @@ -6,25 +6,30 @@ part of '../framework.dart'; /// Do not extend or implement. @publicInCodegen @publicInMisc -sealed class Override {} - -sealed class _ProviderOverride implements Override {} +sealed class Override { + /// The provider that is overridden. + @visibleForTesting + Override get origin; +} -extension on _ProviderOverride { +sealed class _ProviderOverride implements Override { /// The provider that is overridden. - $ProviderBaseImpl get origin { + @override + ProviderBase get origin { final that = this; return switch (that) { - $ProviderBaseImpl() => that, + ProviderBase() => that, $ProviderOverride() => that.origin, }; } +} +extension on _ProviderOverride { /// The new provider behavior. - $ProviderBaseImpl get providerOverride { + ProviderBase get providerOverride { final that = this; return switch (that) { - $ProviderBaseImpl() => that, + ProviderBase() => that, $ProviderOverride() => that.providerOverride, }; } @@ -58,10 +63,11 @@ class $ProviderOverride implements _ProviderOverride { $ProviderOverride({required this.origin, required this.providerOverride}); /// The provider that is overridden. - final $ProviderBaseImpl origin; + @override + final ProviderBase origin; /// The new provider behavior. - final $ProviderBaseImpl providerOverride; + final ProviderBase providerOverride; @mustBeOverridden @override @@ -81,10 +87,10 @@ class TransitiveProviderOverride implements $ProviderOverride { TransitiveProviderOverride(this.origin); @override - final $ProviderBaseImpl origin; + final ProviderBase origin; @override - $ProviderBaseImpl get providerOverride => origin; + ProviderBase get providerOverride => origin; @override String toString() => '$origin'; @@ -120,6 +126,9 @@ class TransitiveFamilyOverride implements $FamilyOverride { @override final Family from; + @override + Family get origin => from; + @override ProviderElement createElement($ProviderPointer pointer) { return pointer.origin.$createElement(pointer); @@ -141,6 +150,9 @@ class _FamilyOverrideImpl implements $FamilyOverride { @override final Family from; + @override + Family get origin => from; + final ProviderElement Function($ProviderPointer pointer) _createElement; @override diff --git a/packages/riverpod/lib/src/core/provider/provider.dart b/packages/riverpod/lib/src/core/provider/provider.dart index 29de23c90..a3b59dfa8 100644 --- a/packages/riverpod/lib/src/core/provider/provider.dart +++ b/packages/riverpod/lib/src/core/provider/provider.dart @@ -46,6 +46,10 @@ sealed class ProviderBase extends ProviderOrFamily @override final Family? from; + @visibleForTesting + @override + ProviderBase get origin => this; + /// If this provider was created with the `.family` modifier, [argument] is /// the variable that was used. /// diff --git a/packages/riverpod/lib/src/core/provider_container.dart b/packages/riverpod/lib/src/core/provider_container.dart index e7ee45f19..a18b6bbb1 100644 --- a/packages/riverpod/lib/src/core/provider_container.dart +++ b/packages/riverpod/lib/src/core/provider_container.dart @@ -43,7 +43,7 @@ class $ProviderPointer implements _PointerBase { providerOverride == null && (origin.$allTransitiveDependencies?.isNotEmpty ?? false)); - final $ProviderBaseImpl origin; + final ProviderBase origin; /// The override associated with this provider, if any. /// @@ -146,7 +146,7 @@ class ProviderDirectory implements _PointerBase { /// This override may be implicitly created by [ProviderOrFamily.$allTransitiveDependencies]. // ignore: library_private_types_in_public_api, not public API _FamilyOverride? familyOverride; - final HashMap<$ProviderBaseImpl, $ProviderPointer> pointers; + final HashMap, $ProviderPointer> pointers; @override ProviderContainer targetContainer; @@ -165,7 +165,7 @@ class ProviderDirectory implements _PointerBase { } $ProviderPointer upsertPointer( - $ProviderBaseImpl provider, { + ProviderBase provider, { required ProviderContainer currentContainer, }) { return pointers._upsert( @@ -194,7 +194,7 @@ class ProviderDirectory implements _PointerBase { /// /// Non-overridden providers are mounted in the root container. $ProviderPointer mount( - $ProviderBaseImpl origin, { + ProviderBase origin, { required ProviderContainer currentContainer, }) { final pointer = upsertPointer(origin, currentContainer: currentContainer); @@ -447,7 +447,7 @@ class ProviderPointerManager { ); } - ProviderDirectory? readDirectory($ProviderBaseImpl provider) { + ProviderDirectory? readDirectory(ProviderBase provider) { final from = provider.from; if (from == null) { @@ -457,15 +457,15 @@ class ProviderPointerManager { } } - $ProviderPointer? readPointer($ProviderBaseImpl provider) { + $ProviderPointer? readPointer(ProviderBase provider) { return readDirectory(provider)?.pointers[provider]; } - ProviderElement? readElement($ProviderBaseImpl provider) { + ProviderElement? readElement(ProviderBase provider) { return readPointer(provider)?.element; } - ProviderDirectory upsertDirectory($ProviderBaseImpl provider) { + ProviderDirectory upsertDirectory(ProviderBase provider) { final from = provider.from; if (from == null) { @@ -475,13 +475,13 @@ class ProviderPointerManager { } } - $ProviderPointer upsertPointer($ProviderBaseImpl provider) { + $ProviderPointer upsertPointer(ProviderBase provider) { return upsertDirectory( provider, ).mount(provider, currentContainer: container); } - ProviderElement upsertElement($ProviderBaseImpl provider) { + ProviderElement upsertElement(ProviderBase provider) { return upsertPointer(provider).element!; } @@ -509,7 +509,7 @@ class ProviderPointerManager { /// Noop if the provider is from an override or doesn't exist. /// /// Returns the associated pointer, even if it was not removed. - $ProviderPointer? remove($ProviderBaseImpl provider) { + $ProviderPointer? remove(ProviderBase provider) { final directory = readDirectory(provider); if (directory == null) return null; @@ -975,7 +975,7 @@ final class ProviderContainer implements Node, MutationTarget { /// {@macro riverpod.invalidate} void invalidate(ProviderOrFamily provider, {bool asReload = false}) { switch (provider) { - case $ProviderBaseImpl(): + case ProviderBase(): _pointerManager .readElement(provider) ?.invalidateSelf(asReload: asReload); @@ -989,7 +989,7 @@ final class ProviderContainer implements Node, MutationTarget { /// {@macro riverpod.refresh} StateT refresh(Refreshable refreshable) { final providerToRefresh = switch (refreshable) { - final $ProviderBaseImpl p => p, + final ProviderBase p => p, _ProviderRefreshable(:final provider) => provider, }; invalidate(providerToRefresh); @@ -998,7 +998,7 @@ final class ProviderContainer implements Node, MutationTarget { } void _recursivePointerRemoval( - $ProviderBaseImpl provider, + ProviderBase provider, $ProviderPointer pointer, ) { for (final child in _children) { @@ -1014,7 +1014,7 @@ final class ProviderContainer implements Node, MutationTarget { _pointerManager.remove(provider); } - void _disposeProvider($ProviderBaseImpl provider) { + void _disposeProvider(ProviderBase provider) { final pointer = _pointerManager.remove(provider); // The provider is already disposed, so we don't need to do anything if (pointer == null) return; @@ -1311,8 +1311,8 @@ abstract base class ProviderObserver { @internal typedef SetupOverride = void Function({ - required $ProviderBaseImpl origin, - required $ProviderBaseImpl override, + required ProviderBase origin, + required ProviderBase override, }); /// An error thrown when a call to [Ref.read]/[Ref.watch] diff --git a/packages/riverpod/test/src/core/overrides_test.dart b/packages/riverpod/test/src/core/overrides_test.dart index 6b59579b5..36bedf88e 100644 --- a/packages/riverpod/test/src/core/overrides_test.dart +++ b/packages/riverpod/test/src/core/overrides_test.dart @@ -40,6 +40,13 @@ void main() { 'myName(42).overrideWith(...)', ); }); + + test('exposes origin in tests', () { + final provider = Provider((_) => 42); + final override = provider.overrideWith((ref) => 42); + + expect(override.origin, provider); + }); }); group('overrideWithValue', () { @@ -69,6 +76,13 @@ void main() { 'myName(42).overrideWithValue(21)', ); }); + + test('exposes origin in tests', () { + final provider = Provider((_) => 42); + final override = provider.overrideWithValue(21); + + expect(override.origin, provider); + }); }); }); @@ -102,6 +116,13 @@ void main() { 'myName.overrideWith(...)', ); }); + + test('exposes origin in tests', () { + final family = Provider.family((_, __) => 42); + final override = family.overrideWith((ref, _) => 42); + + expect(override.origin, family); + }); }); }); }