public override Task RegisterRefactoringsAsync(MSBuildRefactoringContext context)
        {
            if (context.SelectedSpan.Length == 0)
            {
                return(Task.CompletedTask);
            }

            ExpressionNode expr = GetExpressionExtractionContext(context, out string exprStr, out int exprOffset);

            if (expr == null)
            {
                return(Task.CompletedTask);
            }

            var span = GetValidExtractionSpan(context.SelectedSpan, expr);

            if (!(span is TextSpan s))
            {
                return(Task.CompletedTask);
            }
            exprStr = exprStr.Substring(s.Start - exprOffset, s.Length);

            bool isFirst = true;

            foreach (var pt in GetExtractionPoints(context))
            {
                context.RegisterRefactoring(new ExtractExpressionAction(exprStr, s, "MyNewProperty", isFirst? null: pt.scopeName, pt.span, pt.create));
                isFirst = false;
            }

            return(Task.CompletedTask);
        }
        static ExpressionNode GetExpressionExtractionContext(MSBuildRefactoringContext context, out string exprText, out int exprOffset)
        {
            if (context.XObject is XText t)
            {
                if (t.Span.Contains(context.SelectedSpan))
                {
                    switch (context.ElementSyntax?.SyntaxKind)
                    {
                    case MSBuildSyntaxKind.Property:
                    case MSBuildSyntaxKind.Metadata:
                        exprText   = t.Text;
                        exprOffset = t.Span.Start;
                        return(ExpressionParser.Parse(t.Text, ExpressionOptions.ItemsMetadataAndLists, t.Span.Start));

                    default:
                        break;
                    }
                }
                exprText   = null;
                exprOffset = 0;
                return(null);
            }

            if (context.XObject is XAttribute att)
            {
                if (att.Span.Contains(context.SelectedSpan))
                {
                    switch (context.AttributeSyntax?.SyntaxKind)
                    {
                    case MSBuildSyntaxKind.Item_Metadata:
                    case MSBuildSyntaxKind.Item_Include:
                    case MSBuildSyntaxKind.Item_Exclude:
                    case MSBuildSyntaxKind.Item_Update:
                    case MSBuildSyntaxKind.Item_Remove:
                    case MSBuildSyntaxKind.Task_Parameter:
                    case MSBuildSyntaxKind.Target_AfterTargets:
                    case MSBuildSyntaxKind.Target_BeforeTargets:
                    case MSBuildSyntaxKind.Target_DependsOnTargets:
                    case MSBuildSyntaxKind.Target_Inputs:
                        exprText   = att.Value;
                        exprOffset = att.ValueOffset;
                        return(ExpressionParser.Parse(att.Value, ExpressionOptions.ItemsMetadataAndLists, att.ValueOffset));

                    default:
                        if ((context.AttributeSyntax?.SyntaxKind & MSBuildSyntaxKind.ConditionAttribute) != 0)
                        {
                            exprText   = att.Value;
                            exprOffset = att.ValueOffset;
                            return(ExpressionParser.ParseCondition(att.Value, att.ValueOffset));
                        }
                        break;
                    }
                }
            }

            exprText   = null;
            exprOffset = 0;
            return(null);
        }
        public override Task RegisterRefactoringsAsync(MSBuildRefactoringContext context)
        {
            if (context.SelectedSpan.Length > 0)
            {
                return(Task.CompletedTask);
            }

            XElement element;

            switch (context.ElementSyntax?.SyntaxKind)
            {
            case MSBuildSyntaxKind.Item:
                element = context.XObject.SelfAndParentsOfType <XElement> ().First();
                break;

            case MSBuildSyntaxKind.Metadata:
                element = context.XObject.SelfAndParentsOfType <XElement> ().Skip(1).First();
                break;

            case MSBuildSyntaxKind.Property:
                element = context.XObject.SelfAndParentsOfType <XElement> ().First();
                break;

            default:
                return(Task.CompletedTask);
            }

            var      group           = (XElement)element.Parent;
            XElement previousElement = null;

            foreach (var c in group.Elements)
            {
                if (c == element)
                {
                    break;
                }
                previousElement = c;
            }

            if (previousElement == null)
            {
                return(Task.CompletedTask);
            }

            //check name is cased correctly
            var groupName = MSBuildElementSyntax.Get(group.Name.FullName)?.Name;

            context.RegisterRefactoring(new SplitGroupAction(previousElement, groupName));

            return(Task.CompletedTask);
        }
Exemplo n.º 4
0
        public override Task RegisterRefactoringsAsync(MSBuildRefactoringContext context)
        {
            if (context.SelectedSpan.Length > 0)
            {
                return(Task.CompletedTask);
            }

            XElement itemElement;

            switch (context.ElementSyntax?.SyntaxKind)
            {
            case MSBuildSyntaxKind.Item:
                itemElement = context.XObject.SelfAndParentsOfType <XElement> ().First();
                break;

            case MSBuildSyntaxKind.Metadata:
                itemElement = context.XObject.SelfAndParentsOfType <XElement> ().Skip(1).First();
                break;

            default:
                return(Task.CompletedTask);
            }

            // check it isn't in an ItemDefinitionGroup
            if (!(itemElement?.Parent is XElement pe && pe.NameEquals("ItemGroup", true)))
            {
                return(Task.CompletedTask);
            }

            if (!IsTransformable(itemElement))
            {
                return(Task.CompletedTask);
            }

            context.RegisterRefactoring(new UseAttributeForMetadataAction(itemElement));

            return(Task.CompletedTask);
        }