diff --git a/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.cs b/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.cs index 3d95cc700e404c868661ef994138432fbcb42d48..d86fd4cb781233395aca3cae22f52389b91a1b11 100644 --- a/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.cs +++ b/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.cs @@ -20,6 +20,9 @@ public ArgumentFixer(CSharpAddExplicitCastCodeFixProvider provider) : base(provi { } + protected override ExpressionSyntax GetExpressionOfArgument(ArgumentSyntax argument) + => argument.Expression; + protected override ArgumentSyntax GenerateNewArgument(ArgumentSyntax oldArgument, ITypeSymbol conversionType) => oldArgument.WithExpression(oldArgument.Expression.Cast(conversionType)); diff --git a/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/AttributeArgumentFixer.cs b/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/AttributeArgumentFixer.cs index f75e93ade173f6288f6280ccbb74818f8daa212b..edf40ee9c78bad9e88e11db642706128996b2af5 100644 --- a/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/AttributeArgumentFixer.cs +++ b/src/Features/CSharp/Portable/CodeFixes/AddExplicitCast/AttributeArgumentFixer.cs @@ -20,6 +20,9 @@ public AttributeArgumentFixer(CSharpAddExplicitCastCodeFixProvider provider) : b { } + protected override ExpressionSyntax GetExpressionOfArgument(AttributeArgumentSyntax argument) + => argument.Expression; + protected override AttributeArgumentSyntax GenerateNewArgument(AttributeArgumentSyntax oldArgument, ITypeSymbol conversionType) => oldArgument.WithExpression(oldArgument.Expression.Cast(conversionType)); diff --git a/src/Features/Core/Portable/CodeFixes/AddExplicitCast/Fixer.cs b/src/Features/Core/Portable/CodeFixes/AddExplicitCast/Fixer.cs index 90a273de0db2bd05a43bd77e99671480e2cc6c82..a2ecec83d3eed6c3031d6c72f3502b047a4c8cac 100644 --- a/src/Features/Core/Portable/CodeFixes/AddExplicitCast/Fixer.cs +++ b/src/Features/Core/Portable/CodeFixes/AddExplicitCast/Fixer.cs @@ -26,6 +26,7 @@ protected abstract class Fixer provider) => _provider = provider; + protected abstract TExpressionSyntax GetExpressionOfArgument(TArgumentSyntax argument); protected abstract TArgumentSyntax GenerateNewArgument(TArgumentSyntax oldArgument, ITypeSymbol conversionType); protected abstract TArgumentListSyntax GenerateNewArgumentList(TArgumentListSyntax oldArgumentList, ArrayBuilder newArguments); protected abstract SeparatedSyntaxList GetArgumentsOfArgumentList(TArgumentListSyntax argumentList); @@ -67,7 +68,7 @@ protected Fixer(AbstractAddExplicitCastCodeFixProvider provid if (CanArgumentTypesBeConvertedToParameterTypes( semanticModel, root, argumentList, candidateSymbol.Parameters, targetArgument, cancellationToken, out var targetArgumentConversionType) - && _provider.SyntaxFacts.GetExpressionOfArgument(targetArgument) is TExpressionSyntax argumentExpression) + && GetExpressionOfArgument(targetArgument) is TExpressionSyntax argumentExpression) { mutablePotentialConversionTypes.Add((argumentExpression, targetArgumentConversionType)); } @@ -144,7 +145,7 @@ protected Fixer(AbstractAddExplicitCastCodeFixProvider provid } // The argument is either in order with parameters, or have a matched name with parameters. - var argumentExpression = syntaxFacts.GetExpressionOfArgument(arguments[i]) as TExpressionSyntax; + var argumentExpression = GetExpressionOfArgument(arguments[i]); if (argumentExpression == null) { // argumentExpression is null when it is an omitted argument in VB .NET diff --git a/src/Features/VisualBasic/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.vb b/src/Features/VisualBasic/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.vb index da12de966b7a561ab0a2b4f210ead20cd8de7623..93cfcf453cb533135c382fe86ac641370000e9aa 100644 --- a/src/Features/VisualBasic/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.vb +++ b/src/Features/VisualBasic/Portable/CodeFixes/AddExplicitCast/ArgumentFixer.vb @@ -14,6 +14,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.AddExplicitCast MyBase.New(provider) End Sub + Protected Overrides Function GetExpressionOfArgument(argument As ArgumentSyntax) As ExpressionSyntax + Return argument.GetArgumentExpression() + End Function + Protected Overrides Function GenerateNewArgument(oldArgument As ArgumentSyntax, conversionType As ITypeSymbol) As ArgumentSyntax Select Case oldArgument.Kind Case SyntaxKind.SimpleArgument diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs index 6ec11cc6fc4789399b2911be1a5325c90cbea0a0..a140b691a456a2ad9cf1593a441eb4ef2372da25 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs @@ -570,17 +570,7 @@ public bool IsBaseTypeList(SyntaxNode node) => node.IsKind(SyntaxKind.BaseList); public SyntaxNode GetExpressionOfArgument(SyntaxNode node) - { - if (node is ArgumentSyntax) - { - return ((ArgumentSyntax)node).Expression; - } - else - { - // node is AttributeArgumentSyntax - return ((AttributeArgumentSyntax)node).Expression; - } - } + => (node as ArgumentSyntax)?.Expression; public RefKind GetRefKindOfArgument(SyntaxNode node) => (node as ArgumentSyntax).GetRefKind();