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

[EnC] Make it a rude edit to change the value of a constant field

上级 84d8c5aa
......@@ -1804,7 +1804,7 @@ class C
var active = GetActiveStatements(src1, src2);
edits.VerifyRudeDiagnostics(active,
Diagnostic(RudeEditKind.ModifiersUpdate, "const int a = 1", "field"));
Diagnostic(RudeEditKind.ModifiersUpdate, "const int a = 1", "const field"));
}
[Fact]
......@@ -1854,7 +1854,7 @@ class C
var active = GetActiveStatements(src1, src2);
edits.VerifyRudeDiagnostics(active,
Diagnostic(RudeEditKind.ModifiersUpdate, "const int a = 1, b = 2", "field"));
Diagnostic(RudeEditKind.ModifiersUpdate, "const int a = 1, b = 2", "const field"));
}
[Fact]
......
......@@ -5777,6 +5777,49 @@ class SampleCollection<T>
Diagnostic(RudeEditKind.Delete, "public T this[int i]", "indexer setter"));
}
[WorkItem(1120407)]
[Fact]
public void ConstField_Update()
{
var src1 = "class C { const int x = 0; }";
var src2 = "class C { const int x = 1; }";
var edits = GetTopEdits(src1, src2);
edits.VerifyEdits("Update [x = 0]@20 -> [x = 1]@20");
edits.VerifyRudeDiagnostics(
Diagnostic(RudeEditKind.Update, "x = 1", "const field"));
}
[Fact]
public void ConstField_Delete()
{
var src1 = "class C { const int x = 0; }";
var src2 = "class C { int x = 0; }";
var edits = GetTopEdits(src1, src2);
edits.VerifyEdits("Update [const int x = 0;]@10 -> [int x = 0;]@10");
edits.VerifyRudeDiagnostics(
Diagnostic(RudeEditKind.ModifiersUpdate, "int x = 0", "field"));
}
[Fact]
public void ConstField_Add()
{
var src1 = "class C { int x = 0; }";
var src2 = "class C { const int x = 0; }";
var edits = GetTopEdits(src1, src2);
edits.VerifyEdits("Update [int x = 0;]@10 -> [const int x = 0;]@10");
edits.VerifyRudeDiagnostics(
Diagnostic(RudeEditKind.ModifiersUpdate, "const int x = 0", "const field"));
}
#endregion
#region Events
......
......@@ -1893,7 +1893,7 @@ End Class
Dim active = GetActiveStatements(src1, src2)
edits.VerifyRudeDiagnostics(active,
Diagnostic(RudeEditKind.ModifiersUpdate, "Private Const a As Integer = 1", "field"))
Diagnostic(RudeEditKind.ModifiersUpdate, "Private Const a As Integer = 1", "const field"))
End Sub
<Fact>
......@@ -1938,7 +1938,7 @@ End Class
Dim active = GetActiveStatements(src1, src2)
edits.VerifyRudeDiagnostics(active,
Diagnostic(RudeEditKind.ModifiersUpdate, "Private Const a As Integer = 1, b As Integer = 2", "field"))
Diagnostic(RudeEditKind.ModifiersUpdate, "Private Const a As Integer = 1, b As Integer = 2", "const field"))
End Sub
<Fact>
......
......@@ -4698,6 +4698,37 @@ End Class
edits.VerifyRudeDiagnostics()
End Sub
<Fact>
Public Sub ConstField_Update()
Dim src1 = "Class C : Const x = 0 : End Class"
Dim src2 = "Class C : Const x = 1 : End Class"
Dim edits = GetTopEdits(src1, src2)
edits.VerifyRudeDiagnostics(
Diagnostic(RudeEditKind.Update, "x = 1", "const field"))
End Sub
<Fact>
Public Sub ConstField_Delete()
Dim src1 = "Class C : Const x = 0 : End Class"
Dim src2 = "Class C : Dim x = 0 : End Class"
Dim edits = GetTopEdits(src1, src2)
edits.VerifyRudeDiagnostics(
Diagnostic(RudeEditKind.ModifiersUpdate, "Dim x = 0", "field"))
End Sub
<Fact>
Public Sub ConstField_Add()
Dim src1 = "Class C : Dim x = 0 : End Class"
Dim src2 = "Class C : Const x = 0 : End Class"
Dim edits = GetTopEdits(src1, src2)
edits.VerifyRudeDiagnostics(
Diagnostic(RudeEditKind.ModifiersUpdate, "Const x = 0", "const field"))
End Sub
#End Region
#Region "Events"
......
......@@ -1250,7 +1250,8 @@ internal static string GetTopLevelDisplayNameImpl(SyntaxNode node, EditKind edit
return "delegate";
case SyntaxKind.FieldDeclaration:
return "field";
var declaration = (FieldDeclarationSyntax)node;
return declaration.Modifiers.Any(SyntaxKind.ConstKeyword) ? "const field" : "field";
case SyntaxKind.EventFieldDeclaration:
return "event field";
......@@ -2108,6 +2109,14 @@ private void ClassifyUpdate(VariableDeclaratorSyntax oldNode, VariableDeclarator
return;
}
// Check if a constant field is updated:
var fieldDeclaration = oldNode.Parent.Parent as FieldDeclarationSyntax;
if (fieldDeclaration != null && fieldDeclaration.Modifiers.Any(SyntaxKind.ConstKeyword))
{
ReportError(RudeEditKind.Update);
return;
}
// TODO (#749): handle lambdas in initializers & constructors
ClassifyDeclarationBodyRudeUpdates(newNode, allowLambdas: false);
}
......
......@@ -1341,7 +1341,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EditAndContinue
Case SyntaxKind.FieldDeclaration
Dim declaration = DirectCast(node, FieldDeclarationSyntax)
Return If(declaration.Modifiers.Any(SyntaxKind.WithEventsKeyword), "WithEvents field", "field")
Return If(declaration.Modifiers.Any(SyntaxKind.WithEventsKeyword), "WithEvents field",
If(declaration.Modifiers.Any(SyntaxKind.ConstKeyword), "const field", "field"))
Case SyntaxKind.VariableDeclarator,
SyntaxKind.ModifiedIdentifier
......@@ -2269,10 +2270,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EditAndContinue
Return
End If
ClassifyTypeAndInitializerUpdates(oldNode.Initializer,
If ClassifyTypeAndInitializerUpdates(oldNode.Initializer,
oldNode.AsClause,
newNode.Initializer,
newNode.AsClause)
newNode.AsClause) Then
' Check if a constant field is updated:
Dim fieldDeclaration = TryCast(oldNode.Parent, FieldDeclarationSyntax)
If fieldDeclaration IsNot Nothing AndAlso fieldDeclaration.Modifiers.Any(SyntaxKind.ConstKeyword) Then
ReportError(RudeEditKind.Update)
Return
End If
End If
End Sub
Private Sub ClassifyUpdate(oldNode As PropertyStatementSyntax, newNode As PropertyStatementSyntax)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册