提交 d2960f52 编写于 作者: W Wonseok Chae

VS crash during EnC around active statements (#3894)

- apply feedback: code cleanup
上级 c9f9de8e
......@@ -4912,6 +4912,35 @@ End Class
Diagnostic(RudeEditKind.UpdatingStateMachineMethodAroundActiveStatement, "Async Sub()"))
End Sub
<Fact>
Public Sub MethodToAsyncMethod_WithActiveStatementInLambda4()
Dim src1 = "
Imports System
Imports System.Threading.Tasks
Class C
Sub F()
Dim a = Function() <AS:0>Task.FromResult(1)</AS:0>
Return
End Sub
End Class
"
Dim src2 = "
Imports System
Imports System.Threading.Tasks
Class C
Async Sub F()
Dim a = Async Function() <AS:0>1</AS:0>
Return
End Sub
End Class
"
Dim edits = GetTopEdits(src1, src2)
Dim active = GetActiveStatements(src1, src2)
edits.VerifyRudeDiagnostics(active,
Diagnostic(RudeEditKind.UpdatingStateMachineMethodAroundActiveStatement, "Async Function()"))
End Sub
<Fact>
Public Sub MethodToAsyncMethod_WithoutActiveStatement1()
Dim src1 = "
......
......@@ -2869,11 +2869,12 @@ protected override void GetStateMachineInfo(SyntaxNode body, out ImmutableArray<
{
suspensionPoints = SyntaxUtilities.GetAwaitExpressions(body);
kind = StateMachineKind.Async;
return;
}
suspensionPoints = SyntaxUtilities.GetYieldStatements(body);
kind = suspensionPoints.IsEmpty ? StateMachineKind.None : StateMachineKind.Iterator;
else
{
suspensionPoints = SyntaxUtilities.GetYieldStatements(body);
kind = suspensionPoints.IsEmpty ? StateMachineKind.None : StateMachineKind.Iterator;
}
}
internal override void ReportStateMachineSuspensionPointRudeEdits(List<RudeEditDiagnostic> diagnostics, SyntaxNode oldNode, SyntaxNode newNode)
......
......@@ -141,8 +141,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EditAndContinue
Not DirectCast(propertyDeclaration, PropertyStatementSyntax).Modifiers.Any(SyntaxKind.MustOverrideKeyword)
End Function
Public Shared Function IsAsyncMethodOrLambda(declaration As SyntaxNode) As Boolean
Return GetModifiers(declaration).Any(SyntaxKind.AsyncKeyword)
Public Shared Function IsAsyncMethodOrLambda(declarationOrBody As SyntaxNode) As Boolean
Return GetModifiers(declarationOrBody).Any(SyntaxKind.AsyncKeyword)
End Function
Public Shared Function IsIteratorMethodOrLambda(declaration As SyntaxNode) As Boolean
......@@ -162,21 +162,21 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EditAndContinue
End Function
Public Shared Function GetModifiers(declaration As SyntaxNode) As SyntaxTokenList
Select Case declaration.Kind
Public Shared Function GetModifiers(declarationOrBody As SyntaxNode) As SyntaxTokenList
Select Case declarationOrBody.Kind
Case SyntaxKind.SubBlock,
SyntaxKind.FunctionBlock
Return DirectCast(declaration, MethodBlockBaseSyntax).BlockStatement.Modifiers
Return DirectCast(declarationOrBody, MethodBlockBaseSyntax).BlockStatement.Modifiers
Case SyntaxKind.MultiLineFunctionLambdaExpression,
SyntaxKind.SingleLineFunctionLambdaExpression,
SyntaxKind.MultiLineSubLambdaExpression,
SyntaxKind.SingleLineSubLambdaExpression
Return DirectCast(declaration, LambdaExpressionSyntax).SubOrFunctionHeader.Modifiers
Return DirectCast(declarationOrBody, LambdaExpressionSyntax).SubOrFunctionHeader.Modifiers
Case SyntaxKind.FunctionLambdaHeader,
SyntaxKind.SubLambdaHeader
Return DirectCast(declaration, LambdaHeaderSyntax).Modifiers
Return DirectCast(declarationOrBody, LambdaHeaderSyntax).Modifiers
End Select
Return Nothing
......
......@@ -2984,15 +2984,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EditAndContinue
If SyntaxUtilities.IsAsyncMethodOrLambda(body) Then
suspensionPoints = SyntaxUtilities.GetAwaitExpressions(body)
kind = StateMachineKind.Async
Return
ElseIf SyntaxUtilities.IsIteratorMethodOrLambda(body) Then
suspensionPoints = SyntaxUtilities.GetYieldStatements(body)
kind = StateMachineKind.Iterator
Return
Else
suspensionPoints = ImmutableArray(Of SyntaxNode).Empty
kind = StateMachineKind.None
End If
suspensionPoints = ImmutableArray(Of SyntaxNode).Empty
kind = StateMachineKind.None
End Sub
Friend Overrides Sub ReportStateMachineSuspensionPointRudeEdits(diagnostics As List(Of RudeEditDiagnostic), oldNode As SyntaxNode, newNode As SyntaxNode)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册