Skip to content

Commit d4c7580

Browse files
authored
Revert - Don't allow parameter type changes on properties (dotnet#63642)
1 parent 32e8d18 commit d4c7580

File tree

3 files changed

+77
-51
lines changed

3 files changed

+77
-51
lines changed

src/EditorFeatures/CSharpTest/EditAndContinue/TopLevelEditingTests.cs

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15548,15 +15548,19 @@ public void Indexer_ParameterUpdate()
1554815548

1554915549
var edits = GetTopEdits(src1, src2);
1555015550

15551-
edits.VerifySemantics(
15552-
new[]
15553-
{
15554-
SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_Int32)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15555-
SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_Int32)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15556-
SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_String)?.ISymbol),
15557-
SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_String)?.ISymbol)
15558-
},
15559-
capabilities: EditAndContinueCapabilities.AddMethodToExistingType);
15551+
edits.VerifySemanticDiagnostics(
15552+
Diagnostic(RudeEditKind.TypeUpdate, "string a", FeaturesResources.parameter));
15553+
15554+
// TODO:
15555+
// edits.VerifySemantics(
15556+
// new[]
15557+
// {
15558+
// SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_Int32)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15559+
// SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_Int32)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15560+
// SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_String)?.ISymbol),
15561+
// SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterTypes()[0].SpecialType == SpecialType.System_String)?.ISymbol)
15562+
// },
15563+
// capabilities: EditAndContinueCapabilities.AddMethodToExistingType);
1556015564
}
1556115565

1556215566
[Fact]
@@ -15567,15 +15571,19 @@ public void Indexer_ParameterInsert()
1556715571

1556815572
var edits = GetTopEdits(src1, src2);
1556915573

15570-
edits.VerifySemantics(
15571-
new[]
15572-
{
15573-
SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 1)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15574-
SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15575-
SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol),
15576-
SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 3)?.ISymbol)
15577-
},
15578-
capabilities: EditAndContinueCapabilities.AddMethodToExistingType);
15574+
edits.VerifySemanticDiagnostics(
15575+
Diagnostic(RudeEditKind.Insert, "string b", FeaturesResources.parameter));
15576+
15577+
// TODO:
15578+
// edits.VerifySemantics(
15579+
// new[]
15580+
// {
15581+
// SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 1)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15582+
// SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15583+
// SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol),
15584+
// SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 3)?.ISymbol)
15585+
// },
15586+
// capabilities: EditAndContinueCapabilities.AddMethodToExistingType);
1557915587
}
1558015588

1558115589
[Fact]
@@ -15586,15 +15594,19 @@ public void Indexer_ParameterDelete()
1558615594

1558715595
var edits = GetTopEdits(src1, src2);
1558815596

15589-
edits.VerifySemantics(
15590-
new[]
15591-
{
15592-
SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15593-
SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 3)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15594-
SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 1)?.ISymbol),
15595-
SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol)
15596-
},
15597-
capabilities: EditAndContinueCapabilities.AddMethodToExistingType);
15597+
edits.VerifySemanticDiagnostics(
15598+
Diagnostic(RudeEditKind.Delete, "int this[int a]", DeletedSymbolDisplay(FeaturesResources.parameter, "string b")));
15599+
15600+
// TODO:
15601+
// edits.VerifySemantics(
15602+
// new[]
15603+
// {
15604+
// SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15605+
// SemanticEdit(SemanticEditKind.Delete, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 3)?.ISymbol, deletedSymbolContainerProvider: c => c.GetMember("C")),
15606+
// SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.get_Item").FirstOrDefault(m => m.GetParameterCount() == 1)?.ISymbol),
15607+
// SemanticEdit(SemanticEditKind.Insert, c => c.GetMembers("C.set_Item").FirstOrDefault(m => m.GetParameterCount() == 2)?.ISymbol)
15608+
// },
15609+
// capabilities: EditAndContinueCapabilities.AddMethodToExistingType);
1559815610
}
1559915611

1560015612
[Fact]

src/EditorFeatures/VisualBasicTest/EditAndContinue/TopLevelEditingTests.vb

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10537,18 +10537,22 @@ End Class
1053710537
edits.VerifyEdits(
1053810538
"Update [a As Integer]@38 -> [a As Object]@38")
1053910539

10540-
edits.VerifySemantics(
10541-
ActiveStatementsDescription.Empty,
10542-
semanticEdits:=
10543-
{
10544-
SemanticEdit(SemanticEditKind.Delete, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Int32)), deletedSymbolContainerProvider:=Function(c) c.GetMember("C")),
10545-
SemanticEdit(SemanticEditKind.Insert, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Object)))
10546-
},
10547-
capabilities:=EditAndContinueCapabilities.AddMethodToExistingType)
10548-
1054910540
edits.VerifySemanticDiagnostics(
10550-
{Diagnostic(RudeEditKind.ChangingTypeNotSupportedByRuntime, "a As Object", FeaturesResources.parameter)},
10551-
capabilities:=EditAndContinueCapabilities.Baseline)
10541+
Diagnostic(RudeEditKind.TypeUpdate, "a As Object", FeaturesResources.parameter))
10542+
10543+
' TODO:
10544+
' edits.VerifySemantics(
10545+
' ActiveStatementsDescription.Empty,
10546+
' semanticEdits:=
10547+
' {
10548+
' SemanticEdit(SemanticEditKind.Delete, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Int32)), deletedSymbolContainerProvider:=Function(c) c.GetMember("C")),
10549+
' SemanticEdit(SemanticEditKind.Insert, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Object)))
10550+
' },
10551+
' capabilities:=EditAndContinueCapabilities.AddMethodToExistingType)
10552+
10553+
' edits.VerifySemanticDiagnostics(
10554+
' {Diagnostic(RudeEditKind.ChangingTypeNotSupportedByRuntime, "a As Object", FeaturesResources.parameter)},
10555+
' capabilities:=EditAndContinueCapabilities.Baseline)
1055210556
End Sub
1055310557

1055410558
<Fact>
@@ -10560,18 +10564,22 @@ End Class
1056010564
edits.VerifyEdits(
1056110565
"Update [a As Integer]@38 -> [a]@38")
1056210566

10563-
edits.VerifySemantics(
10564-
ActiveStatementsDescription.Empty,
10565-
semanticEdits:=
10566-
{
10567-
SemanticEdit(SemanticEditKind.Delete, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Int32)), deletedSymbolContainerProvider:=Function(c) c.GetMember("C")),
10568-
SemanticEdit(SemanticEditKind.Insert, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Object)))
10569-
},
10570-
capabilities:=EditAndContinueCapabilities.AddMethodToExistingType)
10571-
1057210567
edits.VerifySemanticDiagnostics(
10573-
{Diagnostic(RudeEditKind.ChangingTypeNotSupportedByRuntime, "a", FeaturesResources.parameter)},
10574-
capabilities:=EditAndContinueCapabilities.Baseline)
10568+
Diagnostic(RudeEditKind.TypeUpdate, "a", FeaturesResources.parameter))
10569+
10570+
' TODO:
10571+
' edits.VerifySemantics(
10572+
' ActiveStatementsDescription.Empty,
10573+
' semanticEdits:=
10574+
' {
10575+
' SemanticEdit(SemanticEditKind.Delete, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Int32)), deletedSymbolContainerProvider:=Function(c) c.GetMember("C")),
10576+
' SemanticEdit(SemanticEditKind.Insert, Function(c) c.GetMembers("C.get_P").FirstOrDefault(Function(m) m.GetParameters().Any(Function(p) p.Type.SpecialType = SpecialType.System_Object)))
10577+
' },
10578+
' capabilities:=EditAndContinueCapabilities.AddMethodToExistingType)
10579+
10580+
' edits.VerifySemanticDiagnostics(
10581+
' {Diagnostic(RudeEditKind.ChangingTypeNotSupportedByRuntime, "a", FeaturesResources.parameter)},
10582+
' capabilities:=EditAndContinueCapabilities.Baseline)
1057510583
End Sub
1057610584

1057710585
<Fact>

src/Features/Core/Portable/EditAndContinue/AbstractEditAndContinueAnalyzer.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3289,6 +3289,12 @@ private bool TryAddParameterInsertOrDeleteEdits(ArrayBuilder<SemanticEditInfo> s
32893289
return false;
32903290
}
32913291

3292+
// We don't (for now) support parameter inserts/deletes on properties or indexers
3293+
if (containingSymbol is not IMethodSymbol)
3294+
{
3295+
return false;
3296+
}
3297+
32923298
// Find the node that matches this declaration
32933299
SyntaxNode otherContainingNode;
32943300
var containingNode = containingSymbol.DeclaringSyntaxReferences[0].GetSyntax(cancellationToken);
@@ -3888,9 +3894,9 @@ private void AnalyzeParameterType(
38883894
{
38893895
hasGeneratedAttributeChange = true;
38903896
}
3891-
else if (newParameter.ContainingType.IsDelegateType())
3897+
else if (newParameter.ContainingType.IsDelegateType() || newParameter.ContainingSymbol is not IMethodSymbol)
38923898
{
3893-
// We don't allow changing parameter types in delegates
3899+
// We don't allow changing parameter types in delegates, or in properties or indexers
38943900
rudeEdit = RudeEditKind.TypeUpdate;
38953901
}
38963902
else if (AllowsDeletion(newParameter.ContainingSymbol))

0 commit comments

Comments
 (0)