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;
When multiple
IProjectDependenciesSubTreeProviderimplementations fireDependenciesChanged,OnSubtreeProviderDependenciesChangedposts 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):
Post(providerStateA.Update(...))→ tree shows group APost(providerStateB.Update(...))→ tree shows group B only, group A goneRepro: Register two or more
IProjectDependenciesSubTreeProviderexports from an extension. When both fireDependenciesChanged, only the last provider's group nodes remain visible in the Dependencies tree.Affected code:
LegacyDependencySubscriber.Source.OnSubtreeProviderDependenciesChangedinsrc/Microsoft.VisualSt udio.ProjectSystem.Managed/ProjectSystem/Tree/Dependencies/Legacy/LegacyDependencySubscriber.csThe current code posts the single provider's snapshot:
The following change resolved the issue for us — merging all provider states before posting:
This also requires exposing the _snapshot field from ProviderState: