dotnet / dotnet/project-system
LegacyDependencySubscriber discards other providers' data when one provider posts an update
- Dominant language
- C#
- Stars
- 1k
- Forks
- 415
- PR merge metrics
- No merged PRs in 30d
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):
1. Provider A fires → `Post(providerStateA.Update(...))` → tree shows group A
2. 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:
```csharp
ProviderState providerState = GetProviderState(e.Provider);
Post(providerState.Update(e.Changes));
```
The following change resolved the issue for us — merging all provider states before posting:
```csharp
ProviderState providerState = GetProviderState(e.Provider);
providerState.Update(e.Changes);
ImmutableDictionary>.Builder merged =
ImmutableDictionary.CreateBuilder>();
foreach (ProviderState state in _stateByProvider.Values)
{
foreach (KeyValuePair> pair in state.Snapshot)
{
merged[pair.Key] = pair.Value;
}
}
Post(merged.ToImmutable());
```
This also requires exposing the _snapshot field from ProviderState:
```csharp
public ImmutableDictionary> Snapshot => _snapshot;
```
Contributor guide
Assessment
This issue has not been assessed yet.