Skip to content

Commit

Permalink
EnC - Runtime capabilities support (#52566)
Browse files Browse the repository at this point in the history
  • Loading branch information
davidwengier authored Apr 26, 2021
1 parent 1d222b7 commit dcf1fa0
Show file tree
Hide file tree
Showing 33 changed files with 841 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create(ActiveStatementsDescription.CreateActiveStatement(ActiveStatementFlags.IsLeafFrame, oldStatementSpan, DocumentId.CreateNewId(ProjectId.CreateNewId())));
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.True(result.HasChanges);
var syntaxMap = result.SemanticEdits[0].SyntaxMap;
Expand Down Expand Up @@ -338,7 +338,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.True(result.HasChanges);
Assert.True(result.HasChangesAndErrors);
Expand All @@ -364,7 +364,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, oldDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, oldDocument, ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Expand Down Expand Up @@ -405,7 +405,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Expand Down Expand Up @@ -438,7 +438,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, oldDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, oldDocument, ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Expand Down Expand Up @@ -489,7 +489,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.True(result.HasChanges);
Assert.True(result.HasChangesAndErrors);
Expand Down Expand Up @@ -522,7 +522,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, oldDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, oldDocument, ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Expand Down Expand Up @@ -565,7 +565,7 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.True(result.HasChanges);

Expand Down Expand Up @@ -608,7 +608,7 @@ public static void Main(Bar x)
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newSolution.GetDocument(documentId), ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

Assert.True(result.HasChanges);

Expand Down Expand Up @@ -665,7 +665,7 @@ public class D

foreach (var changedDocumentId in changedDocuments)
{
result.Add(await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newProject.GetDocument(changedDocumentId), ImmutableArray<TextSpan>.Empty, CancellationToken.None));
result.Add(await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newProject.GetDocument(changedDocumentId), ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None));
}

Assert.True(result.IsSingle());
Expand Down Expand Up @@ -717,7 +717,7 @@ class D

foreach (var changedDocumentId in changedDocuments)
{
result.Add(await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newProject.GetDocument(changedDocumentId), ImmutableArray<TextSpan>.Empty, CancellationToken.None));
result.Add(await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newProject.GetDocument(changedDocumentId), ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None));
}

Assert.True(result.IsSingle());
Expand Down Expand Up @@ -751,7 +751,7 @@ public async Task AnalyzeDocumentAsync_InternalError(bool outOfMemory)
}
});

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, EditAndContinueTestHelpers.Net5RuntimeCapabilities, CancellationToken.None);

var expectedDiagnostic = outOfMemory ?
$"ENC0089: {string.Format(FeaturesResources.Modifying_source_file_will_prevent_the_debug_session_from_continuing_because_the_file_is_too_big, "src.cs")}" :
Expand All @@ -762,5 +762,45 @@ public async Task AnalyzeDocumentAsync_InternalError(bool outOfMemory)
AssertEx.Equal(new[] { expectedDiagnostic }, result.RudeEditErrors.Select(d => d.ToDiagnostic(newSyntaxTree))
.Select(d => $"{d.Id}: {d.GetMessage().Split(new[] { Environment.NewLine }, StringSplitOptions.None).First()}"));
}

[Fact]
public async Task AnalyzeDocumentAsync_NotSupportedByRuntime()
{
var source1 = @"
class C
{
public static void Main()
{
System.Console.WriteLine(1);
}
}
";
var source2 = @"
class C
{
public static void Main()
{
System.Console.WriteLine(2);
}
}
";

using var workspace = TestWorkspace.CreateCSharp(source1, composition: s_composition);

var oldSolution = workspace.CurrentSolution;
var oldProject = oldSolution.Projects.Single();
var documentId = oldProject.Documents.Single().Id;
var newSolution = workspace.CurrentSolution.WithDocumentText(documentId, SourceText.From(source2));
var newDocument = newSolution.GetDocument(documentId);

var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

var capabilities = EditAndContinueCapabilities.None;

var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, capabilities, CancellationToken.None);

Assert.Equal(RudeEditKind.NotSupportedByRuntime, result.RudeEditErrors.Single().Kind);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,23 @@ internal static void VerifyRudeDiagnostics(
this EditScript<SyntaxNode> editScript,
params RudeEditDiagnosticDescription[] expectedDiagnostics)
{
VerifyRudeDiagnostics(editScript, ActiveStatementsDescription.Empty, expectedDiagnostics);
VerifySemanticDiagnostics(
editScript,
ActiveStatementsDescription.Empty,
capabilities: null,
expectedDiagnostics);
}

internal static void VerifyRudeDiagnostics(
this EditScript<SyntaxNode> editScript,
EditAndContinueCapabilities? capabilities = null,
params RudeEditDiagnosticDescription[] expectedDiagnostics)
{
VerifySemanticDiagnostics(
editScript,
ActiveStatementsDescription.Empty,
capabilities,
expectedDiagnostics);
}

internal static void VerifyRudeDiagnostics(
Expand All @@ -43,6 +59,7 @@ internal static void VerifyRudeDiagnostics(
VerifySemanticDiagnostics(
editScript,
description,
capabilities: null,
expectedDiagnostics);
}

Expand All @@ -68,14 +85,24 @@ internal static void VerifySemanticDiagnostics(
new[] { new DocumentAnalysisResultsDescription(diagnostics: expectedDiagnostics) });
}

internal static void VerifySemanticDiagnostics(
this EditScript<SyntaxNode> editScript,
ActiveStatementsDescription activeStatements,
params RudeEditDiagnosticDescription[] expectedDiagnostics)
{
VerifySemanticDiagnostics(editScript, activeStatements, capabilities: null, expectedDiagnostics);
}

internal static void VerifySemanticDiagnostics(
this EditScript<SyntaxNode> editScript,
ActiveStatementsDescription activeStatements,
EditAndContinueCapabilities? capabilities = null,
params RudeEditDiagnosticDescription[] expectedDiagnostics)
{
VerifySemantics(
new[] { editScript },
new[] { new DocumentAnalysisResultsDescription(activeStatements: activeStatements, diagnostics: expectedDiagnostics) });
new[] { new DocumentAnalysisResultsDescription(activeStatements: activeStatements, diagnostics: expectedDiagnostics) },
capabilities: capabilities);
}

internal static void VerifySemanticDiagnostics(
Expand All @@ -92,28 +119,31 @@ internal static void VerifySemanticDiagnostics(
internal static void VerifySemantics(
this EditScript<SyntaxNode> editScript,
ActiveStatementsDescription activeStatements,
SemanticEditDescription[] expectedSemanticEdits)
SemanticEditDescription[] expectedSemanticEdits,
EditAndContinueCapabilities? capabilities = null)
{
VerifySemantics(
new[] { editScript },
new[] { new DocumentAnalysisResultsDescription(activeStatements, semanticEdits: expectedSemanticEdits) });
new[] { new DocumentAnalysisResultsDescription(activeStatements, semanticEdits: expectedSemanticEdits) },
capabilities: capabilities);
}

internal static void VerifySemantics(
this EditScript<SyntaxNode> editScript,
params SemanticEditDescription[] expectedSemanticEdits)
{
VerifySemantics(editScript, ActiveStatementsDescription.Empty, expectedSemanticEdits);
VerifySemantics(editScript, ActiveStatementsDescription.Empty, expectedSemanticEdits, capabilities: null);
}

internal static void VerifySemantics(
EditScript<SyntaxNode>[] editScripts,
DocumentAnalysisResultsDescription[] expected,
TargetFramework[]? targetFrameworks = null)
TargetFramework[]? targetFrameworks = null,
EditAndContinueCapabilities? capabilities = null)
{
foreach (var targetFramework in targetFrameworks ?? new[] { TargetFramework.NetStandard20, TargetFramework.NetCoreApp })
{
new CSharpEditAndContinueTestHelpers().VerifySemantics(editScripts, targetFramework, expected);
new CSharpEditAndContinueTestHelpers().VerifySemantics(editScripts, targetFramework, expected, capabilities);
}
}
}
Expand Down
Loading

0 comments on commit dcf1fa0

Please sign in to comment.