Skip to content

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

@kfertitta

Description

@kfertitta

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:

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;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions