diff --git a/src/EditorFeatures/CSharpTest/EditAndContinue/ActiveStatementTests.cs b/src/EditorFeatures/CSharpTest/EditAndContinue/ActiveStatementTests.cs index 62f77c29d5b22e18c41aae3ec6709d03b59987b0..018de093b6b5f9a5123371cebd18410cbe841b80 100644 --- a/src/EditorFeatures/CSharpTest/EditAndContinue/ActiveStatementTests.cs +++ b/src/EditorFeatures/CSharpTest/EditAndContinue/ActiveStatementTests.cs @@ -7856,6 +7856,76 @@ static async void F() edits.VerifyRudeDiagnostics(active); } + [Fact] + public void AsyncMethodEdit_Semantics() + { + string src1 = @" +using System; +using System.Threading.Tasks; + +class C +{ + static async Task F() + { + Console.WriteLine(1); + return await Task.FromResult(1); + } +} +"; + string src2 = @" +using System; +using System.Threading.Tasks; + +class C +{ + static async Task F() + { + Console.WriteLine(2); + return await Task.FromResult(1); + } +} +"; + var edits = GetTopEdits(src1, src2); + var active = GetActiveStatements(src1, src2); + + edits.VerifySemanticDiagnostics(); + } + + [Fact] + public void IteratorMethodEdit_Semantics() + { + string src1 = @" +using System; +using System.Collections.Generic; + +class C +{ + static IEnumerable F() + { + Console.WriteLine(1); + yield return 1; + } +} +"; + string src2 = @" +using System; +using System.Collections.Generic; + +class C +{ + static IEnumerable F() + { + Console.WriteLine(2); + yield return 2; + } +} +"; + var edits = GetTopEdits(src1, src2); + var active = GetActiveStatements(src1, src2); + + edits.VerifySemanticDiagnostics(); + } + #endregion #region Misplaced AS diff --git a/src/EditorFeatures/VisualBasicTest/EditAndContinue/ActiveStatementTests.vb b/src/EditorFeatures/VisualBasicTest/EditAndContinue/ActiveStatementTests.vb index 14f8c38cf2e6e9af468e21e818fcd5a11e07ec85..030872158bf651c3411abcf9db773044878536fb 100644 --- a/src/EditorFeatures/VisualBasicTest/EditAndContinue/ActiveStatementTests.vb +++ b/src/EditorFeatures/VisualBasicTest/EditAndContinue/ActiveStatementTests.vb @@ -5143,6 +5143,60 @@ End Class edits.VerifyRudeDiagnostics(active) End Sub + + + Public Sub AsyncMethodEdit_Semantics() + Dim src1 = " +Imports System +Imports System.Threading.Tasks +Class C + Async Function F() As Task(Of Integer) + Console.WriteLine(1) + Await Task.FromResult(1) + End Function +End Class +" + Dim src2 = " +Imports System +Imports System.Threading.Tasks +Class C + Async Function F() As Task(Of Integer) + Console.WriteLine(2) + Await Task.FromResult(1) + End Function +End Class +" + Dim edits = GetTopEdits(src1, src2) + + edits.VerifySemanticDiagnostics() + End Sub + + + Public Sub IteratorMethodEdit_Semantics() + Dim src1 = " +Imports System +Imports System.Collections.Generic +Class C + Iterator Function F() As IEnumerable(Of Integer) + Console.WriteLine(1) + Yield 1 + End Function +End Class +" + Dim src2 = " +Imports System +Imports System.Collections.Generic +Class C + Iterator Function F() As IEnumerable(Of Integer) + Console.WriteLine(2) + Yield 1 + End Function +End Class +" + Dim edits = GetTopEdits(src1, src2) + + edits.VerifySemanticDiagnostics() + End Sub #End Region #Region "On Error" diff --git a/src/Features/Core/Portable/EditAndContinue/AbstractEditAndContinueAnalyzer.cs b/src/Features/Core/Portable/EditAndContinue/AbstractEditAndContinueAnalyzer.cs index 9d4657dd8155b257566feaf1b9dae97621b7a97d..245e6d7322627850e10209c388db5a54571275e2 100644 --- a/src/Features/Core/Portable/EditAndContinue/AbstractEditAndContinueAnalyzer.cs +++ b/src/Features/Core/Portable/EditAndContinue/AbstractEditAndContinueAnalyzer.cs @@ -2312,7 +2312,7 @@ public ConstructorEdit(INamedTypeSymbol oldType) { var updatedMember = updatedMembers[updatedMemberIndex]; - ReportStateMachineRudeEdits(updatedMember, oldSymbol, diagnostics); + ReportStateMachineRudeEdits(oldModel.Compilation, updatedMember, oldSymbol, diagnostics); bool newBodyHasLambdas; ReportLambdaAndClosureRudeEdits( @@ -3703,6 +3703,7 @@ private bool AreEquivalentClosureScopes(SyntaxNode oldScopeOpt, SyntaxNode newSc #region State Machines private void ReportStateMachineRudeEdits( + Compilation oldCompilation, UpdatedMemberInfo updatedInfo, ISymbol oldMember, List diagnostics) @@ -3719,7 +3720,7 @@ private bool AreEquivalentClosureScopes(SyntaxNode oldScopeOpt, SyntaxNode newSc // We assume that the attributes, if exist, are well formed. // If not an error will be reported during EnC delta emit. - if (oldMember.ContainingAssembly.GetTypeByMetadataName(stateMachineAttributeQualifiedName) == null) + if (oldCompilation.GetTypeByMetadataName(stateMachineAttributeQualifiedName) == null) { diagnostics.Add(new RudeEditDiagnostic( RudeEditKind.UpdatingStateMachineMethodMissingAttribute,