Skip to content

Commit 0abf794

Browse files
Go back to statements
1 parent 4951fd3 commit 0abf794

5 files changed

+34
-14
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ private OperationStatus GetOperationStatus(
242242
? OperationStatus.UnsafeAddressTaken
243243
: OperationStatus.SucceededStatus;
244244

245+
var asyncRefOutParameterStatus = CheckAsyncMethodRefOutParameters(variables);
246+
245247
var variableMapStatus = failedVariables.Count == 0
246248
? OperationStatus.SucceededStatus
247249
: new OperationStatus(succeeded: true,
@@ -256,10 +258,26 @@ private OperationStatus GetOperationStatus(
256258
return readonlyFieldStatus
257259
.With(anonymousTypeStatus)
258260
.With(unsafeAddressStatus)
261+
.With(asyncRefOutParameterStatus)
259262
.With(variableMapStatus)
260263
.With(localFunctionStatus);
261264
}
262265

266+
private OperationStatus CheckAsyncMethodRefOutParameters(IList<VariableInfo> parameters)
267+
{
268+
if (SelectionResult.ContainsAwaitExpression())
269+
{
270+
var names = parameters
271+
.Where(v => v is { UseAsReturnValue: false, ParameterModifier: ParameterBehavior.Out or ParameterBehavior.Ref })
272+
.Select(p => p.Name ?? string.Empty);
273+
274+
if (names.Any())
275+
return new OperationStatus(succeeded: true, string.Format(FeaturesResources.Asynchronous_method_cannot_have_ref_out_parameters_colon_bracket_0_bracket, string.Join(", ", names)));
276+
}
277+
278+
return OperationStatus.SucceededStatus;
279+
}
280+
263281
private MultiDictionary<ISymbol, SyntaxToken> GetSymbolMap()
264282
{
265283
var symbolMap = new MultiDictionary<ISymbol, SyntaxToken>();

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod
8686
End If
8787
End Function
8888

89-
Protected Overrides Function GetFirstStatementOrInitializerSelectedAtCallSite() As ExecutableStatementSyntax
90-
Return Me.SelectionResult.GetContainingScopeOf(Of ExecutableStatementSyntax)()
89+
Protected Overrides Function GetFirstStatementOrInitializerSelectedAtCallSite() As StatementSyntax
90+
Return Me.SelectionResult.GetContainingScopeOf(Of StatementSyntax)()
9191
End Function
9292

93-
Protected Overrides Function GetLastStatementOrInitializerSelectedAtCallSite() As ExecutableStatementSyntax
93+
Protected Overrides Function GetLastStatementOrInitializerSelectedAtCallSite() As StatementSyntax
9494
Return GetFirstStatementOrInitializerSelectedAtCallSite()
9595
End Function
9696

97-
Protected Overrides Async Function GetStatementOrInitializerContainingInvocationToExtractedMethodAsync(cancellationToken As CancellationToken) As Task(Of ExecutableStatementSyntax)
97+
Protected Overrides Async Function GetStatementOrInitializerContainingInvocationToExtractedMethodAsync(cancellationToken As CancellationToken) As Task(Of StatementSyntax)
9898
Dim enclosingStatement = GetFirstStatementOrInitializerSelectedAtCallSite()
9999
Dim callSignature = CreateCallSignature().WithAdditionalAnnotations(CallSiteAnnotation)
100100

@@ -117,7 +117,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod
117117
Dim updatedDocument = Await Me.SemanticDocument.Document.ReplaceNodeAsync(enclosingStatement, newEnclosingStatement, cancellationToken).ConfigureAwait(False)
118118
Dim updatedRoot = Await updatedDocument.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(False)
119119

120-
newEnclosingStatement = DirectCast(updatedRoot.GetAnnotatedNodesAndTokens(enclosingStatementAnnotation).Single().AsNode(), ExecutableStatementSyntax)
120+
newEnclosingStatement = DirectCast(updatedRoot.GetAnnotatedNodesAndTokens(enclosingStatementAnnotation).Single().AsNode(), StatementSyntax)
121121

122122
' because of the complexification we cannot guarantee that there is only one annotation.
123123
' however complexification of names is prepended, so the last annotation should be the original one.

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod
4949
Return nodes.ToImmutableArray()
5050
End Function
5151

52-
Protected Overrides Function GetFirstStatementOrInitializerSelectedAtCallSite() As ExecutableStatementSyntax
52+
Protected Overrides Function GetFirstStatementOrInitializerSelectedAtCallSite() As StatementSyntax
5353
Return Me.SelectionResult.GetFirstStatementUnderContainer()
5454
End Function
5555

56-
Protected Overrides Function GetLastStatementOrInitializerSelectedAtCallSite() As ExecutableStatementSyntax
56+
Protected Overrides Function GetLastStatementOrInitializerSelectedAtCallSite() As StatementSyntax
5757
Return Me.SelectionResult.GetLastStatementUnderContainer()
5858
End Function
5959

60-
Protected Overrides Function GetStatementOrInitializerContainingInvocationToExtractedMethodAsync(cancellationToken As CancellationToken) As Task(Of ExecutableStatementSyntax)
61-
Return Task.FromResult(GetStatementContainingInvocationToExtractedMethodWorker().WithAdditionalAnnotations(CallSiteAnnotation))
60+
Protected Overrides Function GetStatementOrInitializerContainingInvocationToExtractedMethodAsync(cancellationToken As CancellationToken) As Task(Of StatementSyntax)
61+
Return Task.FromResult(Of StatementSyntax)(
62+
GetStatementContainingInvocationToExtractedMethodWorker().WithAdditionalAnnotations(CallSiteAnnotation))
6263
End Function
6364
End Class
6465
End Class

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod
3737
Return ImmutableArray.Create(Of StatementSyntax)(Me.SelectionResult.GetFirstStatement())
3838
End Function
3939

40-
Protected Overrides Function GetFirstStatementOrInitializerSelectedAtCallSite() As ExecutableStatementSyntax
40+
Protected Overrides Function GetFirstStatementOrInitializerSelectedAtCallSite() As StatementSyntax
4141
Return Me.SelectionResult.GetFirstStatement()
4242
End Function
4343

44-
Protected Overrides Function GetLastStatementOrInitializerSelectedAtCallSite() As ExecutableStatementSyntax
44+
Protected Overrides Function GetLastStatementOrInitializerSelectedAtCallSite() As StatementSyntax
4545
' it is a single statement case. either first statement is same as last statement or
4646
' last statement belongs (embedded statement) to the first statement.
4747
Return Me.SelectionResult.GetFirstStatement()
4848
End Function
4949

50-
Protected Overrides Function GetStatementOrInitializerContainingInvocationToExtractedMethodAsync(cancellationToken As CancellationToken) As Task(Of ExecutableStatementSyntax)
51-
Return Task.FromResult(GetStatementContainingInvocationToExtractedMethodWorker().WithAdditionalAnnotations(CallSiteAnnotation))
50+
Protected Overrides Function GetStatementOrInitializerContainingInvocationToExtractedMethodAsync(cancellationToken As CancellationToken) As Task(Of StatementSyntax)
51+
Return Task.FromResult(Of StatementSyntax)(
52+
GetStatementContainingInvocationToExtractedMethodWorker().WithAdditionalAnnotations(CallSiteAnnotation))
5253
End Function
5354
End Class
5455
End Class

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod
1919
Partial Friend NotInheritable Class VisualBasicExtractMethodService
2020
Partial Friend Class VisualBasicMethodExtractor
2121
Partial Private MustInherit Class VisualBasicCodeGenerator
22-
Inherits CodeGenerator(Of ExecutableStatementSyntax, VisualBasicCodeGenerationOptions)
22+
Inherits CodeGenerator(Of StatementSyntax, VisualBasicCodeGenerationOptions)
2323

2424
Private ReadOnly _methodName As SyntaxToken
2525

0 commit comments

Comments
 (0)