Skip to content

Commit 8096a7c

Browse files
Share code in extract method (#76673)
2 parents 6638931 + e778784 commit 8096a7c

File tree

4 files changed

+22
-27
lines changed

4 files changed

+22
-27
lines changed

src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.CSharpCodeGenerator.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -573,14 +573,6 @@ protected override bool LastStatementOrHasReturnStatementInReturnableConstruct()
573573
return statements[index + 1].Kind() == SyntaxKind.ReturnStatement;
574574
}
575575

576-
protected override SyntaxToken CreateIdentifier(string name)
577-
=> name.ToIdentifierToken();
578-
579-
protected override StatementSyntax CreateReturnStatement(string[] identifierNames)
580-
=> identifierNames.Length == 0 ? ReturnStatement() :
581-
identifierNames.Length == 1 ? ReturnStatement(IdentifierName(identifierNames[0])) :
582-
ReturnStatement(TupleExpression([.. identifierNames.Select(n => Argument(n.ToIdentifierName()))]));
583-
584576
protected override ExpressionSyntax CreateCallSignature()
585577
{
586578
var methodName = CreateMethodNameForInvocation().WithAdditionalAnnotations(Simplifier.Annotation);

src/Features/Core/Portable/ExtractMethod/MethodExtractor.CodeGenerator.cs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ protected CodeGenerator(
8282
protected abstract IMethodSymbol GenerateMethodDefinition(SyntaxNode insertionPointNode, CancellationToken cancellationToken);
8383
protected abstract bool ShouldLocalFunctionCaptureParameter(SyntaxNode node);
8484

85-
protected abstract SyntaxToken CreateIdentifier(string name);
8685
protected abstract SyntaxToken CreateMethodName();
8786
protected abstract bool LastStatementOrHasReturnStatementInReturnableConstruct();
8887

@@ -93,7 +92,6 @@ protected CodeGenerator(
9392
protected abstract TExpressionSyntax CreateCallSignature();
9493
protected abstract TStatementSyntax CreateDeclarationStatement(ImmutableArray<VariableInfo> variables, TExpressionSyntax initialValue, CancellationToken cancellationToken);
9594
protected abstract TStatementSyntax CreateAssignmentExpressionStatement(ImmutableArray<VariableInfo> variables, TExpressionSyntax rvalue);
96-
protected abstract TStatementSyntax CreateReturnStatement(params string[] identifierNames);
9795

9896
protected abstract ImmutableArray<TStatementSyntax> GetInitialStatementsForMethodDefinitions();
9997

@@ -223,7 +221,22 @@ protected ImmutableArray<TStatementSyntax> AddReturnIfUnreachable(
223221
if (LastStatementOrHasReturnStatementInReturnableConstruct())
224222
return statements;
225223

226-
return statements.Concat(CreateReturnStatement());
224+
return statements.Concat(CreateReturnStatement([]));
225+
}
226+
227+
private TExecutableStatementSyntax CreateReturnStatement(ImmutableArray<TExpressionSyntax> expressions)
228+
{
229+
var generator = this.SemanticDocument.GetRequiredLanguageService<SyntaxGenerator>();
230+
return (TExecutableStatementSyntax)generator.ReturnStatement(CreateReturnExpression(expressions));
231+
}
232+
233+
private TExpressionSyntax CreateReturnExpression(ImmutableArray<TExpressionSyntax> expressions)
234+
{
235+
var generator = this.SemanticDocument.GetRequiredLanguageService<SyntaxGenerator>();
236+
return
237+
expressions.Length == 0 ? null :
238+
expressions.Length == 1 ? expressions[0] :
239+
(TExpressionSyntax)generator.TupleExpression(expressions.Select(generator.Argument));
227240
}
228241

229242
protected async Task<ImmutableArray<TStatementSyntax>> AddInvocationAtCallSiteAsync(
@@ -288,7 +301,11 @@ protected ImmutableArray<TStatementSyntax> AppendReturnStatementIfNeeded(Immutab
288301
if (AnalyzerResult.VariablesToUseAsReturnValue.IsEmpty)
289302
return statements;
290303

291-
return statements.Concat(CreateReturnStatement([.. AnalyzerResult.VariablesToUseAsReturnValue.Select(b => b.Name)]));
304+
var generator = this.SemanticDocument.GetRequiredLanguageService<SyntaxGenerator>();
305+
return statements.Concat(CreateReturnStatement(
306+
AnalyzerResult.VariablesToUseAsReturnValue.SelectAsArray(
307+
static (v, generator) => (TExpressionSyntax)generator.IdentifierName(v.Name),
308+
generator)));
292309
}
293310

294311
protected static HashSet<SyntaxAnnotation> CreateVariableDeclarationToRemoveMap(

src/Features/Core/Portable/ExtractMethod/SelectionResult.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ private bool CheckNodesInSelection(Func<ISyntaxFacts, SyntaxNode, bool> predicat
142142
if (syntaxFacts.IsAnonymousOrLocalFunction(current))
143143
continue;
144144

145-
if (current.Span.OverlapsWith(span) && predicate(syntaxFacts, current))
145+
if (predicate(syntaxFacts, current))
146146
return true;
147147

148148
// Only dive into child nodes within the span being extracted.

src/Features/VisualBasic/Portable/ExtractMethod/VisualBasicMethodExtractor.VisualBasicCodeGenerator.vb

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -309,20 +309,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod
309309
Return declStatements.Concat(statements)
310310
End Function
311311

312-
Protected Overrides Function CreateIdentifier(name As String) As SyntaxToken
313-
Return name.ToIdentifierToken()
314-
End Function
315-
316-
Protected Overrides Function CreateReturnStatement(ParamArray identifierNames As String()) As StatementSyntax
317-
Contract.ThrowIfTrue(identifierNames.Length > 1)
318-
319-
If identifierNames.Length = 0 Then
320-
Return SyntaxFactory.ReturnStatement()
321-
End If
322-
323-
Return SyntaxFactory.ReturnStatement(identifierNames(0).ToIdentifierName())
324-
End Function
325-
326312
Protected Overrides Function LastStatementOrHasReturnStatementInReturnableConstruct() As Boolean
327313
Dim lastStatement = GetLastStatementOrInitializerSelectedAtCallSite()
328314
Dim container = lastStatement.GetAncestorsOrThis(Of SyntaxNode).Where(Function(n) n.IsReturnableConstruct()).FirstOrDefault()

0 commit comments

Comments
 (0)