dotnet / dotnet/project-system

LegacyDependencySubscriber discards other providers' data when one provider posts an update

Open
#9,888 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.