Allow to apply code fix in top-level statements

This commit is contained in:
Gérald Barré
2023-02-19 15:03:45 -05:00
committed by Phil Scott
parent 819b948e78
commit 955fe07bac
4 changed files with 45 additions and 10 deletions

View File

@ -69,8 +69,8 @@ public class SwitchToAnsiConsoleAction : CodeAction
{
return _originalInvocation
.Ancestors().OfType<MethodDeclarationSyntax>()
.First()
.ParameterList.Parameters
.FirstOrDefault()
?.ParameterList.Parameters
.FirstOrDefault(i => i.Type?.NormalizeWhitespace()?.ToString() == "IAnsiConsole")
?.Identifier.Text;
}
@ -79,12 +79,19 @@ public class SwitchToAnsiConsoleAction : CodeAction
{
// let's look to see if our call is in a static method.
// if so we'll only want to look for static IAnsiConsoles
// and vice-versa if we aren't.
// and vice-versa if we aren't.
// If there is no parent method, the SyntaxNode should be in
// a top-level statement, so there is no field anyway.
var isStatic = _originalInvocation
.Ancestors()
.OfType<MethodDeclarationSyntax>()
.First()
.Modifiers.Any(i => i.IsKind(SyntaxKind.StaticKeyword));
.FirstOrDefault()
?.Modifiers.Any(i => i.IsKind(SyntaxKind.StaticKeyword));
if (isStatic == null)
{
return null;
}
return _originalInvocation
.Ancestors().OfType<ClassDeclarationSyntax>()
@ -93,7 +100,7 @@ public class SwitchToAnsiConsoleAction : CodeAction
.OfType<FieldDeclarationSyntax>()
.FirstOrDefault(i =>
i.Declaration.Type.NormalizeWhitespace().ToString() == "IAnsiConsole" &&
(!isStatic ^ i.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.StaticKeyword))))
(!isStatic.GetValueOrDefault() ^ i.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.StaticKeyword))))
?.Declaration.Variables.First().Identifier.Text;
}

View File

@ -20,7 +20,7 @@ public class StaticAnsiConsoleToInstanceFix : CodeFixProvider
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
if (root != null)
{
var methodDeclaration = root.FindNode(context.Span).FirstAncestorOrSelf<InvocationExpressionSyntax>();
var methodDeclaration = root.FindNode(context.Span, getInnermostNodeForTie: true).FirstAncestorOrSelf<InvocationExpressionSyntax>();
if (methodDeclaration != null)
{
context.RegisterCodeFix(