- Notifications
You must be signed in to change notification settings - Fork 412
Description
When multiple IProjectDependenciesSubTreeProvider implementations fire DependenciesChanged, OnSubtreeProviderDependenciesChanged posts only the updated provider's snapshot to the broadcast block, discarding data from all other providers. This means whichever provider fires last wins — all other group nodes disappear from the Dependencies tree.
For example, given two providers (A and B):
- Provider A fires →
Post(providerStateA.Update(...))→ tree shows group A - Provider B fires →
Post(providerStateB.Update(...))→ tree shows group B only, group A gone
Repro: Register two or more IProjectDependenciesSubTreeProvider exports from an extension. When both fire
DependenciesChanged, only the last provider's group nodes remain visible in the Dependencies tree.
Affected code: LegacyDependencySubscriber.Source.OnSubtreeProviderDependenciesChanged in src/Microsoft.VisualSt udio.ProjectSystem.Managed/ProjectSystem/Tree/Dependencies/Legacy/LegacyDependencySubscriber.cs
The current code posts the single provider's snapshot:
ProviderState providerState = GetProviderState(e.Provider); Post(providerState.Update(e.Changes));The following change resolved the issue for us — merging all provider states before posting:
ProviderState providerState = GetProviderState(e.Provider); providerState.Update(e.Changes); ImmutableDictionary<DependencyGroupType, ImmutableArray<IDependency>>.Builder merged = ImmutableDictionary.CreateBuilder<DependencyGroupType, ImmutableArray<IDependency>>(); foreach (ProviderState state in _stateByProvider.Values) { foreach (KeyValuePair<DependencyGroupType, ImmutableArray<IDependency>> pair in state.Snapshot) { merged[pair.Key] = pair.Value; } } Post(merged.ToImmutable());This also requires exposing the _snapshot field from ProviderState:
public ImmutableDictionary<DependencyGroupType, ImmutableArray<IDependency>> Snapshot => _snapshot;