@@ -47,10 +47,14 @@ internal sealed partial class DependenciesTreeProvider : ProjectTreeProviderBase
4747 private readonly OrderPrecedenceImportCollection < IProjectTreeActionHandler > _removalActionHandlers ;
4848
4949 private readonly DependenciesSnapshotProvider _dependenciesSnapshotProvider ;
50+ private readonly IActiveConfiguredValue < IConfiguredProjectExports > _activeConfiguredProjectExports ;
5051 private readonly CancellationSeries _treeUpdateCancellationSeries ;
5152 private readonly IProjectAccessor _projectAccessor ;
52- private readonly ITaskDelayScheduler _debounce ;
53+ private readonly TaskDelayScheduler _debounce ;
5354
55+ // NOTE we use a property import here as importing this via the constructor creates a loop between
56+ // DependenciesTreeProvider and DependenciesTreeBuilder. A property import allows MEF to break that
57+ // circular dependency.
5458 [ Import ]
5559 private DependenciesTreeBuilder TreeBuilder { get ; set ; } = null ! ;
5660
@@ -68,11 +72,13 @@ public DependenciesTreeProvider(
6872 IProjectThreadingService threadingService ,
6973 IUnconfiguredProjectTasksService tasksService ,
7074 IProjectAccessor projectAccessor ,
71- DependenciesSnapshotProvider dependenciesSnapshotProvider )
75+ DependenciesSnapshotProvider dependenciesSnapshotProvider ,
76+ IActiveConfiguredValue < IConfiguredProjectExports > activeConfiguredProjectExports )
7277 : base ( threadingService , unconfiguredProject )
7378 {
7479 _dependenciesSnapshotProvider = dependenciesSnapshotProvider ;
7580 _projectAccessor = projectAccessor ;
81+ _activeConfiguredProjectExports = activeConfiguredProjectExports ;
7682
7783 _removalActionHandlers = new OrderPrecedenceImportCollection < IProjectTreeActionHandler > (
7884 ImportOrderPrecedenceComparer . PreferenceOrder . PreferredComesFirst ,
@@ -377,7 +383,7 @@ await _projectAccessor.OpenProjectForWriteAsync(ActiveConfiguredProject, project
377383
378384 protected override ConfiguredProjectExports GetActiveConfiguredProjectExports ( ConfiguredProject newActiveConfiguredProject )
379385 {
380- return GetActiveConfiguredProjectExports < MyConfiguredProjectExports > ( newActiveConfiguredProject ) ;
386+ return ( ConfiguredProjectExports ) _activeConfiguredProjectExports . Value ;
381387 }
382388
383389 #region ITreeConstruction
@@ -479,29 +485,25 @@ IProjectItemTree2 IProjectTreeOperations.NewTree(string caption, IProjectPropert
479485 /// <summary>
480486 /// Describes services collected from the active configured project.
481487 /// </summary>
482- [ Export ]
483- private sealed class MyConfiguredProjectExports : ConfiguredProjectExports
488+ [ Export ( typeof ( IConfiguredProjectExports ) ) ]
489+ [ method: ImportingConstructor ]
490+ private sealed class MyConfiguredProjectExports ( ConfiguredProject configuredProject )
491+ : ConfiguredProjectExports ( configuredProject ) ,
492+ IConfiguredProjectExports
484493 {
485- [ ImportingConstructor ]
486- public MyConfiguredProjectExports ( ConfiguredProject configuredProject )
487- : base ( configuredProject )
488- {
489- }
490494 }
491495
492496 /// <summary>
493497 /// A private implementation of <see cref="IProjectTreeActionHandlerContext"/> for use with
494498 /// <see cref="IProjectTreeActionHandler"/> exports.
495499 /// </summary>
496- private sealed class ProjectDependencyTreeRemovalActionHandlerContext : IProjectTreeActionHandlerContext
500+ private sealed class ProjectDependencyTreeRemovalActionHandlerContext ( IProjectTreeProvider treeProvider ) : IProjectTreeActionHandlerContext
497501 {
498- public IProjectTreeProvider TreeProvider { get ; }
502+ public IProjectTreeProvider TreeProvider { get ; } = treeProvider ;
499503
500504 public IProjectTreeActionHandler SuccessorHandlerDelegator => throw new NotImplementedException ( ) ;
501-
502- public ProjectDependencyTreeRemovalActionHandlerContext ( IProjectTreeProvider treeProvider )
503- {
504- TreeProvider = treeProvider ;
505- }
506505 }
506+
507+ // NOTE this interface is needed to work around accessiblity issues when making MyConfiguredProjectExports non-private
508+ internal interface IConfiguredProjectExports { }
507509}
0 commit comments