private void Reset() { _action = OrderingMoveAction.NoOp; _target = null; _previousIncludes = ImmutableHashSet <string> .Empty; _isHinting = false; }
/// <summary> /// When the task runs, if the receiver picks up that we will be adding an item, it will capture the MSBuild project's includes. /// If any items were added as a result of the task running, the hint receiver will perform the specified action on those items. /// </summary> public async Task Capture(OrderingMoveAction action, IProjectTree target, Func <Task> task) { Requires.NotNull(target, nameof(target)); Requires.NotNull(task, nameof(task)); _action = action; _target = target; await task().ConfigureAwait(false); // We need to be sure we are not hinting before we reset, otherwise everything would get reset before HintedAsync gets called. // This is for sanity. if (!_isHinting) { Reset(); } }
/// <summary> /// Performs a move on any items that were added based on the previous includes. /// </summary> public static Task MoveAsync(ConfiguredProject configuredProject, IProjectAccessor accessor, ImmutableHashSet <string> previousIncludes, IProjectTree target, OrderingMoveAction action) { Requires.NotNull(configuredProject, nameof(configuredProject)); Requires.NotNull(accessor, nameof(accessor)); Requires.NotNull(previousIncludes, nameof(previousIncludes)); Requires.NotNull(target, nameof(target)); return(accessor.OpenProjectForWriteAsync(configuredProject, project => { // We do a sanity re-evaluation to absolutely ensure changes were met. project.ReevaluateIfNecessary(); ImmutableArray <ProjectItemElement> addedElements = GetAddedItemElements(previousIncludes, project); // TODO: Should the result (success or failure) be ignored? _ = action switch { OrderingMoveAction.MoveToTop => TryMoveElementsToTop(project, addedElements, target), OrderingMoveAction.MoveAbove => TryMoveElementsAbove(project, addedElements, target), OrderingMoveAction.MoveBelow => TryMoveElementsBelow(project, addedElements, target), _ => false }; }));
public static Task Move(ConfiguredProject configuredProject, IProjectAccessor accessor, ImmutableHashSet <string> previousIncludes, IProjectTree target, OrderingMoveAction action) { Requires.NotNull(configuredProject, nameof(configuredProject)); Requires.NotNull(accessor, nameof(accessor)); Requires.NotNull(previousIncludes, nameof(previousIncludes)); Requires.NotNull(target, nameof(target)); return(accessor.OpenProjectForWriteAsync(configuredProject, project => { // We do a sanity re-evaluation to absolutely ensure changes were met. project.ReevaluateIfNecessary(); ImmutableArray <ProjectItemElement> addedElements = GetAddedItemElements(previousIncludes, project); switch (action) { case OrderingMoveAction.MoveToTop: TryMoveElementsToTop(project, addedElements, target); break; case OrderingMoveAction.MoveAbove: TryMoveElementsAbove(project, addedElements, target); break; case OrderingMoveAction.MoveBelow: TryMoveElementsBelow(project, addedElements, target); break; default: break; } })); }