Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/riverpod/lib/src/core/element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,7 @@ depending on itself.
/// - `overrideWithValue`, which relies on [update] to handle
/// the scenario where the value changed.
@visibleForOverriding
void update($ProviderBaseImpl<StateT> newProvider) {}
void update(ProviderBase<StateT> newProvider) {}

/// Initialize a provider and track dependencies used during the initialization.
///
Expand Down
3 changes: 3 additions & 0 deletions packages/riverpod/lib/src/core/family.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ final class Family extends ProviderOrFamily implements _FamilyOverride {
@override
Family get from => this;

@override
Family get origin => from;

@override
String toString() => name ?? describeIdentity(this);
}
Expand Down
36 changes: 24 additions & 12 deletions packages/riverpod/lib/src/core/override.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<Object?> get origin {
@override
ProviderBase<Object?> get origin {
final that = this;
return switch (that) {
$ProviderBaseImpl() => that,
ProviderBase() => that,
$ProviderOverride() => that.origin,
};
}
}

extension on _ProviderOverride {
/// The new provider behavior.
$ProviderBaseImpl<Object?> get providerOverride {
ProviderBase<Object?> get providerOverride {
final that = this;
return switch (that) {
$ProviderBaseImpl() => that,
ProviderBase() => that,
$ProviderOverride() => that.providerOverride,
};
}
Expand Down Expand Up @@ -58,10 +63,11 @@ class $ProviderOverride implements _ProviderOverride {
$ProviderOverride({required this.origin, required this.providerOverride});

/// The provider that is overridden.
final $ProviderBaseImpl<Object?> origin;
@override
final ProviderBase<Object?> origin;

/// The new provider behavior.
final $ProviderBaseImpl<Object?> providerOverride;
final ProviderBase<Object?> providerOverride;

@mustBeOverridden
@override
Expand All @@ -81,10 +87,10 @@ class TransitiveProviderOverride implements $ProviderOverride {
TransitiveProviderOverride(this.origin);

@override
final $ProviderBaseImpl<Object?> origin;
final ProviderBase<Object?> origin;

@override
$ProviderBaseImpl<Object?> get providerOverride => origin;
ProviderBase<Object?> get providerOverride => origin;

@override
String toString() => '$origin';
Expand Down Expand Up @@ -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);
Expand All @@ -141,6 +150,9 @@ class _FamilyOverrideImpl implements $FamilyOverride {
@override
final Family from;

@override
Family get origin => from;

final ProviderElement Function($ProviderPointer pointer) _createElement;

@override
Expand Down
3 changes: 3 additions & 0 deletions packages/riverpod/lib/src/core/provider/provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ sealed class ProviderBase<StateT> extends ProviderOrFamily
@override
final Family? from;

@override
ProviderBase<StateT> get origin => this;

/// If this provider was created with the `.family` modifier, [argument] is
/// the variable that was used.
///
Expand Down
34 changes: 17 additions & 17 deletions packages/riverpod/lib/src/core/provider_container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class $ProviderPointer implements _PointerBase {
bool get isTransitiveOverride =>
providerOverride is TransitiveProviderOverride;

final $ProviderBaseImpl<Object?> origin;
final ProviderBase<Object?> origin;

/// The override associated with this provider, if any.
///
Expand Down Expand Up @@ -139,7 +139,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<Object?>, $ProviderPointer> pointers;
final HashMap<ProviderBase<Object?>, $ProviderPointer> pointers;
@override
ProviderContainer targetContainer;

Expand All @@ -158,7 +158,7 @@ class ProviderDirectory implements _PointerBase {
}

$ProviderPointer upsertPointer(
$ProviderBaseImpl<Object?> provider, {
ProviderBase<Object?> provider, {
required ProviderContainer currentContainer,
}) {
return pointers._upsert(
Expand Down Expand Up @@ -187,7 +187,7 @@ class ProviderDirectory implements _PointerBase {
///
/// Non-overridden providers are mounted in the root container.
$ProviderPointer mount(
$ProviderBaseImpl<Object?> origin, {
ProviderBase<Object?> origin, {
required ProviderContainer currentContainer,
}) {
final pointer = upsertPointer(origin, currentContainer: currentContainer);
Expand Down Expand Up @@ -440,7 +440,7 @@ class ProviderPointerManager {
);
}

ProviderDirectory? readDirectory($ProviderBaseImpl<Object?> provider) {
ProviderDirectory? readDirectory(ProviderBase<Object?> provider) {
final from = provider.from;

if (from == null) {
Expand All @@ -450,15 +450,15 @@ class ProviderPointerManager {
}
}

$ProviderPointer? readPointer($ProviderBaseImpl<Object?> provider) {
$ProviderPointer? readPointer(ProviderBase<Object?> provider) {
return readDirectory(provider)?.pointers[provider];
}

ProviderElement? readElement($ProviderBaseImpl<Object?> provider) {
ProviderElement? readElement(ProviderBase<Object?> provider) {
return readPointer(provider)?.element;
}

ProviderDirectory upsertDirectory($ProviderBaseImpl<Object?> provider) {
ProviderDirectory upsertDirectory(ProviderBase<Object?> provider) {
final from = provider.from;

if (from == null) {
Expand All @@ -468,13 +468,13 @@ class ProviderPointerManager {
}
}

$ProviderPointer upsertPointer($ProviderBaseImpl<Object?> provider) {
$ProviderPointer upsertPointer(ProviderBase<Object?> provider) {
return upsertDirectory(
provider,
).mount(provider, currentContainer: container);
}

ProviderElement upsertElement($ProviderBaseImpl<Object?> provider) {
ProviderElement upsertElement(ProviderBase<Object?> provider) {
return upsertPointer(provider).element!;
}

Expand Down Expand Up @@ -502,7 +502,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<Object?> provider) {
$ProviderPointer? remove(ProviderBase<Object?> provider) {
final directory = readDirectory(provider);
if (directory == null) return null;

Expand Down Expand Up @@ -968,7 +968,7 @@ final class ProviderContainer implements Node, MutationTarget {
/// {@macro riverpod.invalidate}
void invalidate(ProviderOrFamily provider, {bool asReload = false}) {
switch (provider) {
case $ProviderBaseImpl<Object?>():
case ProviderBase<Object?>():
_pointerManager
.readElement(provider)
?.invalidateSelf(asReload: asReload);
Expand All @@ -982,7 +982,7 @@ final class ProviderContainer implements Node, MutationTarget {
/// {@macro riverpod.refresh}
StateT refresh<StateT>(Refreshable<StateT> refreshable) {
final providerToRefresh = switch (refreshable) {
final $ProviderBaseImpl<Object?> p => p,
final ProviderBase<Object?> p => p,
_ProviderRefreshable<Object?, Object?>(:final provider) => provider,
};
invalidate(providerToRefresh);
Expand All @@ -991,7 +991,7 @@ final class ProviderContainer implements Node, MutationTarget {
}

void _recursivePointerRemoval(
$ProviderBaseImpl<Object?> provider,
ProviderBase<Object?> provider,
$ProviderPointer pointer,
) {
for (final child in _children) {
Expand All @@ -1007,7 +1007,7 @@ final class ProviderContainer implements Node, MutationTarget {
_pointerManager.remove(provider);
}

void _disposeProvider($ProviderBaseImpl<Object?> provider) {
void _disposeProvider(ProviderBase<Object?> provider) {
final pointer = _pointerManager.remove(provider);
// The provider is already disposed, so we don't need to do anything
if (pointer == null) return;
Expand Down Expand Up @@ -1304,8 +1304,8 @@ abstract base class ProviderObserver {
@internal
typedef SetupOverride =
void Function({
required $ProviderBaseImpl<Object?> origin,
required $ProviderBaseImpl<Object?> override,
required ProviderBase<Object?> origin,
required ProviderBase<Object?> override,
});

/// An error thrown when a call to [Ref.read]/[Ref.watch]
Expand Down
21 changes: 21 additions & 0 deletions packages/riverpod/test/src/core/overrides_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ void main() {
'myName(42).overrideWith(...)',
);
});

test('exposes origin in tests', () {
final provider = Provider<int>((_) => 42);
final override = provider.overrideWith((ref) => 42);

expect(override.origin, provider);
});
});

group('overrideWithValue', () {
Expand Down Expand Up @@ -69,6 +76,13 @@ void main() {
'myName(42).overrideWithValue(21)',
);
});

test('exposes origin in tests', () {
final provider = Provider<int>((_) => 42);
final override = provider.overrideWithValue(21);

expect(override.origin, provider);
});
});
});

Expand Down Expand Up @@ -102,6 +116,13 @@ void main() {
'myName.overrideWith(...)',
);
});

test('exposes origin in tests', () {
final family = Provider.family<int, int>((_, __) => 42);
final override = family.overrideWith((ref, _) => 42);

expect(override.origin, family);
});
});
});
}
Loading