提交 2d01c15a 编写于 作者: P Petr Houska

Revert removal of special handling of ArgService (reason #37295)

上级 d49329fb
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
namespace Microsoft.CodeAnalysis.CSharp.CodeRefactorings namespace Microsoft.CodeAnalysis.CSharp.CodeRefactorings
{ {
[ExportLanguageService(typeof(IRefactoringHelpersService), LanguageNames.CSharp), Shared] [ExportLanguageService(typeof(IRefactoringHelpersService), LanguageNames.CSharp), Shared]
internal class CSharpRefactoringHelpersService : AbstractRefactoringHelpersService<ExpressionSyntax> internal class CSharpRefactoringHelpersService : AbstractRefactoringHelpersService<ExpressionSyntax, ArgumentSyntax>
{ {
protected override IEnumerable<SyntaxNode> ExtractNodesSimple(SyntaxNode node, ISyntaxFactsService syntaxFacts) protected override IEnumerable<SyntaxNode> ExtractNodesSimple(SyntaxNode node, ISyntaxFactsService syntaxFacts)
{ {
......
...@@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.CSharp.NameTupleElement ...@@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.CSharp.NameTupleElement
{ {
[ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.IntroduceVariable)] [ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.IntroduceVariable)]
[ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = nameof(CSharpNameTupleElementCodeRefactoringProvider)), Shared] [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = nameof(CSharpNameTupleElementCodeRefactoringProvider)), Shared]
internal class CSharpNameTupleElementCodeRefactoringProvider : AbstractNameTupleElementCodeRefactoringProvider<ArgumentSyntax, TupleExpressionSyntax, ExpressionSyntax> internal class CSharpNameTupleElementCodeRefactoringProvider : AbstractNameTupleElementCodeRefactoringProvider<ArgumentSyntax, TupleExpressionSyntax>
{ {
[ImportingConstructor] [ImportingConstructor]
public CSharpNameTupleElementCodeRefactoringProvider() public CSharpNameTupleElementCodeRefactoringProvider()
......
...@@ -15,7 +15,7 @@ namespace Microsoft.CodeAnalysis.CSharp.UseNamedArguments ...@@ -15,7 +15,7 @@ namespace Microsoft.CodeAnalysis.CSharp.UseNamedArguments
[ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = nameof(CSharpUseNamedArgumentsCodeRefactoringProvider)), Shared] [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = nameof(CSharpUseNamedArgumentsCodeRefactoringProvider)), Shared]
internal class CSharpUseNamedArgumentsCodeRefactoringProvider : AbstractUseNamedArgumentsCodeRefactoringProvider internal class CSharpUseNamedArgumentsCodeRefactoringProvider : AbstractUseNamedArgumentsCodeRefactoringProvider
{ {
private abstract class BaseAnalyzer<TSyntax, TSyntaxList> : Analyzer<TSyntax, TSyntax, TSyntaxList, ExpressionSyntax> private abstract class BaseAnalyzer<TSyntax, TSyntaxList> : Analyzer<TSyntax, TSyntax, TSyntaxList>
where TSyntax : SyntaxNode where TSyntax : SyntaxNode
where TSyntaxList : SyntaxNode where TSyntaxList : SyntaxNode
{ {
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.LanguageServices;
...@@ -14,8 +13,9 @@ ...@@ -14,8 +13,9 @@
namespace Microsoft.CodeAnalysis.CodeRefactorings namespace Microsoft.CodeAnalysis.CodeRefactorings
{ {
internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : IRefactoringHelpersService internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax, TArgumentSyntax> : IRefactoringHelpersService
where TExpressionSyntax : SyntaxNode where TExpressionSyntax : SyntaxNode
where TArgumentSyntax : SyntaxNode
{ {
public async Task<ImmutableArray<TSyntaxNode>> GetRelevantNodesAsync<TSyntaxNode>( public async Task<ImmutableArray<TSyntaxNode>> GetRelevantNodesAsync<TSyntaxNode>(
Document document, TextSpan selectionRaw, Document document, TextSpan selectionRaw,
...@@ -105,9 +105,10 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I ...@@ -105,9 +105,10 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I
AddNodesForTokenToLeft(syntaxFacts, relevantNodesBuilder, location, tokenToLeft, cancellationToken); AddNodesForTokenToLeft(syntaxFacts, relevantNodesBuilder, location, tokenToLeft, cancellationToken);
// If the wanted node is an expression syntax -> traverse upwards even if location is deep within a SyntaxNode. // If the wanted node is an expression syntax -> traverse upwards even if location is deep within a SyntaxNode.
if (typeof(TSyntaxNode).IsSubclassOf(typeof(TExpressionSyntax)) || typeof(TSyntaxNode) == typeof(TExpressionSyntax)) // We want to treat more types like expressions, e.g.: ArgumentSyntax should still trigger even if deep-in.
if (IsWantedTypeExpressionLike<TSyntaxNode>())
{ {
await AddNodesDeepInExpression(document, location, relevantNodesBuilder, cancellationToken).ConfigureAwait(false); await AddNodesDeepIn(document, location, relevantNodesBuilder, cancellationToken).ConfigureAwait(false);
} }
} }
...@@ -119,6 +120,20 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I ...@@ -119,6 +120,20 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I
} }
} }
private static bool IsWantedTypeExpressionLike<TSyntaxNode>() where TSyntaxNode : SyntaxNode
{
var wantedType = typeof(TSyntaxNode);
var expressionType = typeof(TExpressionSyntax);
var argumentType = typeof(TArgumentSyntax);
return IsAEqualOrSubclassOfB(wantedType, expressionType) || IsAEqualOrSubclassOfB(wantedType, argumentType);
static bool IsAEqualOrSubclassOfB(Type a, Type b)
{
return a.IsSubclassOf(b) || a == b;
}
}
private async Task<(SyntaxToken tokenToRightOrIn, SyntaxToken tokenToLeft, int location)> GetTokensToRightOrInToLeftAndUpdatedLocation( private async Task<(SyntaxToken tokenToRightOrIn, SyntaxToken tokenToLeft, int location)> GetTokensToRightOrInToLeftAndUpdatedLocation(
Document document, Document document,
SyntaxNode root, SyntaxNode root,
...@@ -404,7 +419,7 @@ protected virtual IEnumerable<SyntaxNode> ExtractNodesInHeader(SyntaxNode root, ...@@ -404,7 +419,7 @@ protected virtual IEnumerable<SyntaxNode> ExtractNodesInHeader(SyntaxNode root,
} }
} }
protected virtual async Task AddNodesDeepInExpression<TSyntaxNode>( protected virtual async Task AddNodesDeepIn<TSyntaxNode>(
Document document, int position, Document document, int position,
ArrayBuilder<TSyntaxNode> relevantNodesBuilder, ArrayBuilder<TSyntaxNode> relevantNodesBuilder,
CancellationToken cancellationToken) where TSyntaxNode : SyntaxNode CancellationToken cancellationToken) where TSyntaxNode : SyntaxNode
......
...@@ -12,10 +12,9 @@ ...@@ -12,10 +12,9 @@
namespace Microsoft.CodeAnalysis.NameTupleElement namespace Microsoft.CodeAnalysis.NameTupleElement
{ {
abstract class AbstractNameTupleElementCodeRefactoringProvider<TArgumentSyntax, TTupleExpressionSyntax, TExpresionSyntax> : CodeRefactoringProvider abstract class AbstractNameTupleElementCodeRefactoringProvider<TArgumentSyntax, TTupleExpressionSyntax> : CodeRefactoringProvider
where TArgumentSyntax : SyntaxNode where TArgumentSyntax : SyntaxNode
where TExpresionSyntax : SyntaxNode where TTupleExpressionSyntax : SyntaxNode
where TTupleExpressionSyntax : TExpresionSyntax
{ {
protected abstract bool IsCloseParenOrComma(SyntaxToken token); protected abstract bool IsCloseParenOrComma(SyntaxToken token);
protected abstract TArgumentSyntax WithName(TArgumentSyntax argument, string argumentName); protected abstract TArgumentSyntax WithName(TArgumentSyntax argument, string argumentName);
...@@ -45,9 +44,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte ...@@ -45,9 +44,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
} }
var syntaxFacts = document.GetLanguageService<ISyntaxFactsService>(); var syntaxFacts = document.GetLanguageService<ISyntaxFactsService>();
var expressions = await document.TryGetRelevantNodesAsync<TExpresionSyntax>(span, cancellationToken).ConfigureAwait(false); var potentialArguments = await document.TryGetRelevantNodesAsync<TArgumentSyntax>(span, cancellationToken).ConfigureAwait(false);
var argument = expressions.FirstOrDefault( var argument = potentialArguments.FirstOrDefault(n => n?.Parent is TTupleExpressionSyntax);
n => n.Parent is TArgumentSyntax && n.Parent.Parent is TTupleExpressionSyntax)?.Parent as TArgumentSyntax;
if (argument == null || !syntaxFacts.IsSimpleArgument(argument)) if (argument == null || !syntaxFacts.IsSimpleArgument(argument))
{ {
return default; return default;
...@@ -63,7 +61,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte ...@@ -63,7 +61,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
} }
syntaxFacts.GetPartsOfTupleExpression<TArgumentSyntax>(tuple, out _, out var arguments, out _); syntaxFacts.GetPartsOfTupleExpression<TArgumentSyntax>(tuple, out _, out var arguments, out _);
var argumentIndex = arguments.IndexOf(argument); var argumentIndex = potentialArguments.IndexOf(argument);
var elements = tupleType.TupleElements; var elements = tupleType.TupleElements;
if (elements.IsDefaultOrEmpty || argumentIndex >= elements.Length) if (elements.IsDefaultOrEmpty || argumentIndex >= elements.Length)
{ {
......
...@@ -20,19 +20,17 @@ protected interface IAnalyzer ...@@ -20,19 +20,17 @@ protected interface IAnalyzer
Task ComputeRefactoringsAsync(CodeRefactoringContext context, SyntaxNode root); Task ComputeRefactoringsAsync(CodeRefactoringContext context, SyntaxNode root);
} }
protected abstract class Analyzer<TBaseArgumentSyntax, TSimpleArgumentSyntax, TArgumentListSyntax, TExpressionSyntax> : IAnalyzer protected abstract class Analyzer<TBaseArgumentSyntax, TSimpleArgumentSyntax, TArgumentListSyntax> : IAnalyzer
where TBaseArgumentSyntax : SyntaxNode where TBaseArgumentSyntax : SyntaxNode
where TSimpleArgumentSyntax : TBaseArgumentSyntax where TSimpleArgumentSyntax : TBaseArgumentSyntax
where TArgumentListSyntax : SyntaxNode where TArgumentListSyntax : SyntaxNode
where TExpressionSyntax : SyntaxNode
{ {
public async Task ComputeRefactoringsAsync( public async Task ComputeRefactoringsAsync(
CodeRefactoringContext context, SyntaxNode root) CodeRefactoringContext context, SyntaxNode root)
{ {
var (document, textSpan, cancellationToken) = context; var (document, textSpan, cancellationToken) = context;
var expressions = await context.TryGetSelectedNodesAsync<TExpressionSyntax>().ConfigureAwait(false); var argument = await context.TryGetSelectedNodeAsync<TBaseArgumentSyntax>().ConfigureAwait(false) as TSimpleArgumentSyntax;
var argument = expressions.FirstOrDefault(n => n.Parent is TSimpleArgumentSyntax)?.Parent as TSimpleArgumentSyntax;
if (argument == null) if (argument == null)
{ {
return; return;
......
...@@ -9,7 +9,7 @@ Imports Microsoft.CodeAnalysis.LanguageServices ...@@ -9,7 +9,7 @@ Imports Microsoft.CodeAnalysis.LanguageServices
Namespace Microsoft.CodeAnalysis.VisualBasic.CodeRefactorings Namespace Microsoft.CodeAnalysis.VisualBasic.CodeRefactorings
<ExportLanguageService(GetType(IRefactoringHelpersService), LanguageNames.VisualBasic), [Shared]> <ExportLanguageService(GetType(IRefactoringHelpersService), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicRefactoringHelpersService Friend Class VisualBasicRefactoringHelpersService
Inherits AbstractRefactoringHelpersService(Of ExpressionSyntax) Inherits AbstractRefactoringHelpersService(Of ExpressionSyntax, ArgumentSyntax)
Protected Overrides Iterator Function ExtractNodesSimple(node As SyntaxNode, syntaxFacts As ISyntaxFactsService) As IEnumerable(Of SyntaxNode) Protected Overrides Iterator Function ExtractNodesSimple(node As SyntaxNode, syntaxFacts As ISyntaxFactsService) As IEnumerable(Of SyntaxNode)
For Each baseExtraction In MyBase.ExtractNodesSimple(node, syntaxFacts) For Each baseExtraction In MyBase.ExtractNodesSimple(node, syntaxFacts)
......
...@@ -9,7 +9,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.NameTupleElement ...@@ -9,7 +9,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.NameTupleElement
<ExtensionOrder(After:=PredefinedCodeRefactoringProviderNames.IntroduceVariable)> <ExtensionOrder(After:=PredefinedCodeRefactoringProviderNames.IntroduceVariable)>
<ExportCodeRefactoringProvider(LanguageNames.VisualBasic, Name:=NameOf(VisualBasicNameTupleElementCodeRefactoringProvider)), [Shared]> <ExportCodeRefactoringProvider(LanguageNames.VisualBasic, Name:=NameOf(VisualBasicNameTupleElementCodeRefactoringProvider)), [Shared]>
Friend Class VisualBasicNameTupleElementCodeRefactoringProvider Friend Class VisualBasicNameTupleElementCodeRefactoringProvider
Inherits AbstractNameTupleElementCodeRefactoringProvider(Of SimpleArgumentSyntax, TupleExpressionSyntax, ExpressionSyntax) Inherits AbstractNameTupleElementCodeRefactoringProvider(Of SimpleArgumentSyntax, TupleExpressionSyntax)
<ImportingConstructor> <ImportingConstructor>
Public Sub New() Public Sub New()
......
...@@ -14,7 +14,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseNamedArguments ...@@ -14,7 +14,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseNamedArguments
Inherits AbstractUseNamedArgumentsCodeRefactoringProvider Inherits AbstractUseNamedArgumentsCodeRefactoringProvider
Private Class ArgumentAnalyzer Private Class ArgumentAnalyzer
Inherits Analyzer(Of ArgumentSyntax, SimpleArgumentSyntax, ArgumentListSyntax, ExpressionSyntax) Inherits Analyzer(Of ArgumentSyntax, SimpleArgumentSyntax, ArgumentListSyntax)
Protected Overrides Function IsPositionalArgument(argument As SimpleArgumentSyntax) As Boolean Protected Overrides Function IsPositionalArgument(argument As SimpleArgumentSyntax) As Boolean
Return argument.NameColonEquals Is Nothing Return argument.NameColonEquals Is Nothing
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册