提交 8bd2dc2d 编写于 作者: P Petr Houska

Add extraction of ExpressionStatement to refa helpers.

上级 87b2e9f9
......@@ -365,6 +365,20 @@ protected virtual IEnumerable<SyntaxNode> ExtractNodesSimple(SyntaxNode node, IS
syntaxFacts.GetPartsOfAssignmentExpressionOrStatement(node, out _, out _, out var rightSide);
yield return rightSide;
}
// `a();`
// -> a()
if (syntaxFacts.IsExpressionStatement(node))
{
yield return syntaxFacts.GetExpressionOfExpressionStatement(node);
}
// `a()`;
// -> `a();`
if (node.Parent != null && syntaxFacts.IsExpressionStatement(node.Parent))
{
yield return node.Parent;
}
}
/// <summary>
......
......@@ -58,14 +58,6 @@ public sealed override async Task ComputeRefactoringsAsync(CodeRefactoringContex
protected async Task<TExpressionStatementSyntax> GetExpressionStatementAsync(CodeRefactoringContext context)
{
var expressionStatement = await context.TryGetRelevantNodeAsync<TExpressionStatementSyntax>().ConfigureAwait(false);
if (expressionStatement == null)
{
// If an expression-statement wasn't selected, see if they're selecting
// an expression belonging to an expression-statement instead.
var expression = await context.TryGetRelevantNodeAsync<TExpressionSyntax>().ConfigureAwait(false);
expressionStatement = expression?.Parent as TExpressionStatementSyntax;
}
return expressionStatement != null && IsValid(expressionStatement, context.Span)
? expressionStatement
: null;
......
......@@ -28,5 +28,7 @@ private CSharpSyntaxKindsService()
public override int UsingStatement => (int)SyntaxKind.UsingStatement;
public override int ReturnStatement => (int)SyntaxKind.ReturnStatement;
public override int HashToken => (int)SyntaxKind.HashToken;
public override int ExpressionStatement => (int)SyntaxKind.ExpressionStatement;
}
}
......@@ -571,5 +571,8 @@ public bool IsUsingStatement(SyntaxNode node)
public bool IsReturnStatement(SyntaxNode node)
=> node.RawKind == SyntaxKinds.ReturnStatement;
public bool IsExpressionStatement(SyntaxNode node)
=> node.RawKind == SyntaxKinds.ExpressionStatement;
}
}
......@@ -105,6 +105,8 @@ internal interface ISyntaxFactsService : ILanguageService
bool IsTrueLiteralExpression(SyntaxNode node);
bool IsThisExpression(SyntaxNode node);
bool IsBaseExpression(SyntaxNode node);
bool IsExpressionStatement(SyntaxNode node);
string GetText(int kind);
bool IsInInactiveRegion(SyntaxTree syntaxTree, int position, CancellationToken cancellationToken);
......
......@@ -33,6 +33,7 @@ internal interface ISyntaxKindsService : ILanguageService
int UsingStatement { get; }
int ReturnStatement { get; }
int HashToken { get; }
int ExpressionStatement { get; }
}
internal abstract class AbstractSyntaxKindsService : ISyntaxKindsService
......@@ -53,5 +54,6 @@ internal abstract class AbstractSyntaxKindsService : ISyntaxKindsService
public abstract int UsingStatement { get; }
public abstract int ReturnStatement { get; }
public abstract int HashToken { get; }
public abstract int ExpressionStatement { get; }
}
}
......@@ -2037,5 +2037,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return IsOnHeader(position, node, node.ForEachStatement)
End Function
Private Function ISyntaxFactsService_IsExpressionStatement(node As SyntaxNode) As Boolean Implements ISyntaxFactsService.IsExpressionStatement
Return MyBase.IsExpressionStatement(node)
End Function
End Class
End Namespace
......@@ -28,5 +28,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.LanguageServices
Public Overrides ReadOnly Property UsingStatement As Integer = SyntaxKind.UsingStatement
Public Overrides ReadOnly Property ReturnStatement As Integer = SyntaxKind.ReturnStatement
Public Overrides ReadOnly Property HashToken As Integer = SyntaxKind.HashToken
Public Overrides ReadOnly Property ExpressionStatement As Integer = SyntaxKind.ExpressionStatement
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册