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); }
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); }