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
                };
            }));
Ejemplo n.º 4
0
        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;
                }
            }));
        }