Skip to content

Commit 93aa07c

Browse files
committed
Tests upon tests
1 parent 6531ff5 commit 93aa07c

File tree

8 files changed

+433
-29
lines changed

8 files changed

+433
-29
lines changed

src/Compilers/CSharp/Test/Emit/Emit/EditAndContinue/EditAndContinueTests.cs

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,118 @@ static void Main() { }
294294
Handle(2, TableIndex.AssemblyRef));
295295
}
296296

297+
[Fact]
298+
public void ModifyMethod_RenameParameter()
299+
{
300+
var source0 =
301+
@"class C
302+
{
303+
static void Main() { }
304+
static string F(int a) { return a.ToString(); }
305+
}";
306+
var source1 =
307+
@"class C
308+
{
309+
static void Main() { }
310+
static string F(int x) { return x.ToString(); }
311+
}";
312+
var source2 =
313+
@"class C
314+
{
315+
static void Main() { }
316+
static string F(int b) { return b.ToString(); }
317+
}";
318+
319+
var compilation0 = CreateCompilation(source0, options: TestOptions.DebugExe);
320+
var compilation1 = compilation0.WithSource(source1);
321+
var compilation2 = compilation1.WithSource(source2);
322+
323+
var method0 = compilation0.GetMember<MethodSymbol>("C.F");
324+
325+
// Verify full metadata contains expected rows.
326+
var bytes0 = compilation0.EmitToArray(EmitOptions.Default.WithDebugInformationFormat(DebugInformationFormat.PortablePdb));
327+
using var md0 = ModuleMetadata.CreateFromImage(bytes0);
328+
var reader0 = md0.MetadataReader;
329+
330+
CheckNames(reader0, reader0.GetTypeDefNames(), "<Module>", "C");
331+
CheckNames(reader0, reader0.GetMethodDefNames(), "Main", "F", ".ctor");
332+
CheckNames(reader0, reader0.GetMemberRefNames(), /*CompilationRelaxationsAttribute.*/".ctor", /*RuntimeCompatibilityAttribute.*/".ctor", /*Object.*/".ctor", "ToString", /*DebuggableAttribute*/".ctor");
333+
CheckNames(reader0, reader0.GetParameterDefNames(), "a");
334+
335+
var generation0 = EmitBaseline.CreateInitialBaseline(
336+
md0,
337+
EmptyLocalsProvider);
338+
var method1 = compilation1.GetMember<MethodSymbol>("C.F");
339+
340+
var diff1 = compilation1.EmitDifference(
341+
generation0,
342+
ImmutableArray.Create(SemanticEdit.Create(SemanticEditKind.Update, method0, method1)));
343+
344+
// Verify delta metadata contains expected rows.
345+
using var md1 = diff1.GetMetadata();
346+
var reader1 = md1.Reader;
347+
var readers = new[] { reader0, reader1 };
348+
349+
EncValidation.VerifyModuleMvid(1, reader0, reader1);
350+
351+
CheckNames(readers, reader1.GetTypeDefNames());
352+
CheckNames(readers, reader1.GetMethodDefNames(), "F");
353+
CheckNames(readers, reader1.GetMemberRefNames(), "ToString");
354+
CheckNames(readers, reader1.GetParameterDefNames(), "x");
355+
356+
CheckEncLog(reader1,
357+
Row(2, TableIndex.AssemblyRef, EditAndContinueOperation.Default),
358+
Row(6, TableIndex.MemberRef, EditAndContinueOperation.Default),
359+
Row(7, TableIndex.TypeRef, EditAndContinueOperation.Default),
360+
Row(8, TableIndex.TypeRef, EditAndContinueOperation.Default),
361+
Row(2, TableIndex.StandAloneSig, EditAndContinueOperation.Default),
362+
Row(2, TableIndex.MethodDef, EditAndContinueOperation.Default),
363+
Row(1, TableIndex.Param, EditAndContinueOperation.Default));
364+
365+
CheckEncMap(reader1,
366+
Handle(7, TableIndex.TypeRef),
367+
Handle(8, TableIndex.TypeRef),
368+
Handle(2, TableIndex.MethodDef),
369+
Handle(1, TableIndex.Param),
370+
Handle(6, TableIndex.MemberRef),
371+
Handle(2, TableIndex.StandAloneSig),
372+
Handle(2, TableIndex.AssemblyRef));
373+
374+
var method2 = compilation2.GetMember<MethodSymbol>("C.F");
375+
376+
var diff2 = compilation2.EmitDifference(
377+
diff1.NextGeneration,
378+
ImmutableArray.Create(SemanticEdit.Create(SemanticEditKind.Update, method1, method2)));
379+
380+
// Verify delta metadata contains expected rows.
381+
using var md2 = diff2.GetMetadata();
382+
var reader2 = md2.Reader;
383+
readers = new[] { reader0, reader1, reader2 };
384+
385+
CheckNames(readers, reader2.GetTypeDefNames());
386+
CheckNames(readers, reader2.GetMethodDefNames(), "F");
387+
CheckNames(readers, reader2.GetMemberRefNames(), "ToString");
388+
CheckNames(readers, reader2.GetParameterDefNames(), "b");
389+
390+
CheckEncLog(reader2,
391+
Row(3, TableIndex.AssemblyRef, EditAndContinueOperation.Default),
392+
Row(7, TableIndex.MemberRef, EditAndContinueOperation.Default),
393+
Row(9, TableIndex.TypeRef, EditAndContinueOperation.Default),
394+
Row(10, TableIndex.TypeRef, EditAndContinueOperation.Default),
395+
Row(3, TableIndex.StandAloneSig, EditAndContinueOperation.Default),
396+
Row(2, TableIndex.MethodDef, EditAndContinueOperation.Default),
397+
Row(1, TableIndex.Param, EditAndContinueOperation.Default));
398+
399+
CheckEncMap(reader2,
400+
Handle(9, TableIndex.TypeRef),
401+
Handle(10, TableIndex.TypeRef),
402+
Handle(2, TableIndex.MethodDef),
403+
Handle(1, TableIndex.Param),
404+
Handle(7, TableIndex.MemberRef),
405+
Handle(3, TableIndex.StandAloneSig),
406+
Handle(3, TableIndex.AssemblyRef));
407+
}
408+
297409
[CompilerTrait(CompilerFeature.Tuples)]
298410
[Fact]
299411
public void ModifyMethod_WithTuples()
@@ -11811,5 +11923,89 @@ public void TopLevelStatement_Update()
1181111923
Handle(7, TableIndex.MemberRef),
1181211924
Handle(2, TableIndex.AssemblyRef));
1181311925
}
11926+
11927+
[Fact]
11928+
public void LambdaParameterToDiscard()
11929+
{
11930+
var source0 = MarkedSource(@"
11931+
using System;
11932+
class C
11933+
{
11934+
void M()
11935+
{
11936+
var x = new Func<int, int, int>(<N:0>(a, b) => a + b + 1</N:0>);
11937+
Console.WriteLine(x(1, 2));
11938+
}
11939+
}");
11940+
var source1 = MarkedSource(@"
11941+
using System;
11942+
class C
11943+
{
11944+
void M()
11945+
{
11946+
var x = new Func<int, int, int>(<N:0>(_, _) => 10</N:0>);
11947+
Console.WriteLine(x(1, 2));
11948+
}
11949+
}");
11950+
11951+
var compilation0 = CreateCompilation(source0.Tree, options: ComSafeDebugDll);
11952+
var compilation1 = compilation0.WithSource(source1.Tree);
11953+
11954+
var method0 = compilation0.GetMember<MethodSymbol>("C.M");
11955+
var method1 = compilation1.GetMember<MethodSymbol>("C.M");
11956+
11957+
var v0 = CompileAndVerify(compilation0, verify: Verification.Skipped);
11958+
11959+
using var md0 = ModuleMetadata.CreateFromImage(v0.EmittedAssemblyData);
11960+
11961+
var generation0 = EmitBaseline.CreateInitialBaseline(md0, v0.CreateSymReader().GetEncMethodDebugInfo);
11962+
11963+
var diff = compilation1.EmitDifference(
11964+
generation0,
11965+
ImmutableArray.Create(
11966+
SemanticEdit.Create(SemanticEditKind.Update, method0, method1, GetSyntaxMapFromMarkers(source0, source1), preserveLocalVariables: true)));
11967+
11968+
// There should be no diagnostics from rude edits
11969+
diff.EmitResult.Diagnostics.Verify();
11970+
11971+
diff.VerifySynthesizedMembers(
11972+
"C: {<>c}",
11973+
"C.<>c: {<>9__0_0, <M>b__0_0}");
11974+
11975+
diff.VerifyIL("C.M",
11976+
@"
11977+
{
11978+
// Code size 48 (0x30)
11979+
.maxstack 3
11980+
.locals init ([unchanged] V_0,
11981+
System.Func<int, int, int> V_1) //x
11982+
IL_0000: nop
11983+
IL_0001: ldsfld ""System.Func<int, int, int> C.<>c.<>9__0_0""
11984+
IL_0006: dup
11985+
IL_0007: brtrue.s IL_0020
11986+
IL_0009: pop
11987+
IL_000a: ldsfld ""C.<>c C.<>c.<>9""
11988+
IL_000f: ldftn ""int C.<>c.<M>b__0_0(int, int)""
11989+
IL_0015: newobj ""System.Func<int, int, int>..ctor(object, System.IntPtr)""
11990+
IL_001a: dup
11991+
IL_001b: stsfld ""System.Func<int, int, int> C.<>c.<>9__0_0""
11992+
IL_0020: stloc.1
11993+
IL_0021: ldloc.1
11994+
IL_0022: ldc.i4.1
11995+
IL_0023: ldc.i4.2
11996+
IL_0024: callvirt ""int System.Func<int, int, int>.Invoke(int, int)""
11997+
IL_0029: call ""void System.Console.WriteLine(int)""
11998+
IL_002e: nop
11999+
IL_002f: ret
12000+
}");
12001+
12002+
diff.VerifyIL("C.<>c.<M>b__0_0(int, int)", @"
12003+
{
12004+
// Code size 3 (0x3)
12005+
.maxstack 1
12006+
IL_0000: ldc.i4.s 10
12007+
IL_0002: ret
12008+
}");
12009+
}
1181412010
}
1181512011
}

src/Compilers/VisualBasic/Test/Emit/Emit/EditAndContinue/EditAndContinueTestBase.vb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
186186
End Sub
187187

188188
Friend Shared Sub CheckEncLogDefinitions(reader As MetadataReader, ParamArray rows As EditAndContinueLogEntry())
189-
AssertEx.Equal(rows, reader.GetEditAndContinueLogEntries().Where(Function(entry) IsDefinition(entry)), itemInspector:=AddressOf EncLogRowToString)
189+
AssertEx.Equal(rows, reader.GetEditAndContinueLogEntries().Where(Function(entry) IsDefinition(entry.Handle.Kind)), itemInspector:=AddressOf EncLogRowToString)
190190
End Sub
191191

192-
Friend Shared Function IsDefinition(entry As EditAndContinueLogEntry) As Boolean
192+
Friend Shared Function IsDefinition(kind As HandleKind) As Boolean
193193
Dim index As TableIndex
194-
Assert.True(MetadataTokens.TryGetTableIndex(entry.Handle.Kind, index))
194+
Assert.True(MetadataTokens.TryGetTableIndex(kind, index))
195195

196196
Select Case index
197197
Case TableIndex.MethodDef,
@@ -232,6 +232,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
232232
AssertEx.Equal([handles], reader.GetEditAndContinueMapEntries(), itemInspector:=AddressOf EncMapRowToString)
233233
End Sub
234234

235+
Friend Shared Sub CheckEncMapDefinitions(reader As MetadataReader, ParamArray [handles] As EntityHandle())
236+
AssertEx.Equal([handles], reader.GetEditAndContinueMapEntries().Where(Function(e) IsDefinition(e.Kind)), itemInspector:=AddressOf EncMapRowToString)
237+
End Sub
238+
235239
Friend Shared Sub CheckNames(reader As MetadataReader, [handles] As StringHandle(), ParamArray expectedNames As String())
236240
CheckNames({reader}, [handles], expectedNames)
237241
End Sub

src/Compilers/VisualBasic/Test/Emit/Emit/EditAndContinue/EditAndContinueTests.vb

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,64 @@ End Class
185185
End Using
186186
End Sub
187187

188+
<Fact>
189+
Public Sub ModifyMethod_RenameParameter()
190+
Dim source0 =
191+
"
192+
Class C
193+
Shared Sub Main
194+
End Sub
195+
Shared Function F(i As Integer) As Integer
196+
Return i
197+
End Function
198+
End Class
199+
"
200+
Dim source1 =
201+
"
202+
Class C
203+
Shared Sub Main
204+
End Sub
205+
Shared Function F(x As Integer) As Integer
206+
Return x
207+
End Function
208+
End Class
209+
"
210+
Dim compilation0 = CreateCompilationWithMscorlib40({source0}, options:=TestOptions.DebugExe, references:={ValueTupleRef, SystemRuntimeFacadeRef})
211+
Dim compilation1 = compilation0.WithSource(source1)
212+
213+
Dim bytes0 = compilation0.EmitToArray()
214+
Using md0 = ModuleMetadata.CreateFromImage(bytes0)
215+
Dim reader0 = md0.MetadataReader
216+
Dim method0 = compilation0.GetMember(Of MethodSymbol)("C.F")
217+
Dim generation0 = EmitBaseline.CreateInitialBaseline(md0, EmptyLocalsProvider)
218+
219+
CheckNames(reader0, reader0.GetParameterDefNames(), "i")
220+
221+
Dim method1 = compilation1.GetMember(Of MethodSymbol)("C.F")
222+
Dim diff1 = compilation1.EmitDifference(generation0, ImmutableArray.Create(New SemanticEdit(SemanticEditKind.Update, method0, method1)))
223+
224+
' Verify delta metadata contains expected rows.
225+
Using md1 = diff1.GetMetadata()
226+
Dim reader1 = md1.Reader
227+
Dim readers = {reader0, reader1}
228+
EncValidation.VerifyModuleMvid(1, reader0, reader1)
229+
CheckNames(readers, reader1.GetTypeDefNames())
230+
CheckNames(readers, reader1.GetMethodDefNames(), "F")
231+
CheckNames(readers, reader1.GetParameterDefNames(), "x")
232+
233+
CheckEncLogDefinitions(reader1,
234+
Row(2, TableIndex.StandAloneSig, EditAndContinueOperation.Default),
235+
Row(3, TableIndex.MethodDef, EditAndContinueOperation.Default),
236+
Row(1, TableIndex.Param, EditAndContinueOperation.Default))
237+
238+
CheckEncMapDefinitions(reader1,
239+
Handle(3, TableIndex.MethodDef),
240+
Handle(1, TableIndex.Param),
241+
Handle(2, TableIndex.StandAloneSig))
242+
End Using
243+
End Using
244+
End Sub
245+
188246
<WorkItem(962219, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/962219")>
189247
<Fact>
190248
Public Sub PartialMethod()

src/EditorFeatures/CSharpTest/EditAndContinue/ActiveStatementTests.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -897,8 +897,7 @@ class Goo
897897
var edits = GetTopEdits(src1, src2);
898898
var active = GetActiveStatements(src1, src2);
899899

900-
edits.VerifyRudeDiagnostics(active,
901-
Diagnostic(RudeEditKind.Renamed, "int b", FeaturesResources.parameter));
900+
edits.VerifySemantics(SemanticEdit(SemanticEditKind.Update, c => c.GetMember("Goo..ctor")));
902901
}
903902

904903
[WorkItem(742334, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/742334")]
@@ -8724,6 +8723,34 @@ static void Main()
87248723
edits.VerifyRudeDiagnostics(active);
87258724
}
87268725

8726+
[Fact]
8727+
public void Lambdas_ActiveStatementUpdate()
8728+
{
8729+
var src1 = @"
8730+
class C
8731+
{
8732+
static void Main(string[] args)
8733+
{
8734+
Func<int, int> f = (int a, int b) => <AS:0>a + b + 1</AS:0>;
8735+
<AS:1>f(2);</AS:1>
8736+
}
8737+
}";
8738+
var src2 = @"
8739+
class C
8740+
{
8741+
static void Main(string[] args)
8742+
{
8743+
Func<int, int> f = (_, _) => <AS:0>10</AS:0>;
8744+
<AS:1>f(2);</AS:1>
8745+
}
8746+
}
8747+
";
8748+
var edits = GetTopEdits(src1, src2);
8749+
var active = GetActiveStatements(src1, src2);
8750+
8751+
edits.VerifyRudeDiagnostics(active);
8752+
}
8753+
87278754
[Fact]
87288755
public void Lambdas_ActiveStatementRemoved1()
87298756
{

src/EditorFeatures/CSharpTest/EditAndContinue/StatementEditingTests.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4942,8 +4942,37 @@ static void Main(int X)
49424942

49434943
var edits = GetTopEdits(src1, src2);
49444944

4945-
edits.VerifyRudeDiagnostics(
4946-
Diagnostic(RudeEditKind.Renamed, "int X", FeaturesResources.parameter));
4945+
edits.VerifySemantics(SemanticEdit(SemanticEditKind.Update, c => c.GetMember("Program.Main"), preserveLocalVariables: true));
4946+
}
4947+
4948+
[Fact]
4949+
public void Lambdas_Parameter_To_Discard1()
4950+
{
4951+
var src1 = "var x = new Func<int, int, int>((a, b) => 1);";
4952+
var src2 = "var x = new Func<int, int, int>((a, _) => 1);";
4953+
4954+
var edits = GetMethodEdits(src1, src2);
4955+
4956+
edits.VerifyEdits(
4957+
"Update [b]@38 -> [_]@38");
4958+
4959+
// Techncailly not a discard, but a rename
4960+
GetTopEdits(edits).VerifySemantics(SemanticEdit(SemanticEditKind.Update, c => c.GetMember("C.F"), preserveLocalVariables: true));
4961+
}
4962+
4963+
[Fact]
4964+
public void Lambdas_Parameter_To_Discard2()
4965+
{
4966+
var src1 = "var x = new Func<int, int, int>((int a, int b) => 1);";
4967+
var src2 = "var x = new Func<int, int, int>((_, _) => 1);";
4968+
4969+
var edits = GetMethodEdits(src1, src2);
4970+
4971+
edits.VerifyEdits(
4972+
"Update [int a]@35 -> [_]@35",
4973+
"Update [int b]@42 -> [_]@38");
4974+
4975+
GetTopEdits(edits).VerifySemantics(SemanticEdit(SemanticEditKind.Update, c => c.GetMember("C.F"), preserveLocalVariables: true));
49474976
}
49484977

49494978
#endregion
@@ -6986,8 +7015,7 @@ static void Main(int X)
69867015

69877016
var edits = GetTopEdits(src1, src2);
69887017

6989-
edits.VerifyRudeDiagnostics(
6990-
Diagnostic(RudeEditKind.Renamed, "int X", FeaturesResources.parameter));
7018+
edits.VerifySemantics(SemanticEdit(SemanticEditKind.Update, c => c.GetMember("Program.Main"), preserveLocalVariables: true));
69917019
}
69927020

69937021
[Fact]

0 commit comments

Comments
 (0)