Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Preparation for partial type support in EnC #51253

Merged
merged 9 commits into from
Feb 17, 2021
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10000,7 +10000,7 @@ static void Goo()
}";

var active = GetActiveStatements(src1, src2);
Extensions.VerifyUnchangedDocument(src2, active);
EditAndContinueValidation.VerifyUnchangedDocument(src2, active);
}

[Fact]
Expand Down Expand Up @@ -10041,7 +10041,7 @@ static void Goo()
}";

var active = GetActiveStatements(src1, src2);
Extensions.VerifyUnchangedDocument(src2, active);
EditAndContinueValidation.VerifyUnchangedDocument(src2, active);
}

#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,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(oldDocument, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);

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

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

Assert.True(result.HasChanges);
Assert.True(result.HasChangesAndErrors);
Assert.True(result.HasChangesAndCompilationErrors);
Assert.True(result.HasChangesAndSyntaxErrors);
}

[Fact]
Expand All @@ -361,11 +361,11 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

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

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Assert.False(result.HasChangesAndCompilationErrors);
Assert.False(result.HasChangesAndSyntaxErrors);
}

[Fact]
Expand Down Expand Up @@ -402,11 +402,11 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

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

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Assert.False(result.HasChangesAndCompilationErrors);
Assert.False(result.HasChangesAndSyntaxErrors);
}

[Fact]
Expand Down Expand Up @@ -435,11 +435,11 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

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

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Assert.False(result.HasChangesAndCompilationErrors);
Assert.False(result.HasChangesAndSyntaxErrors);
Assert.True(result.RudeEditErrors.IsEmpty);
}

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

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

Assert.True(result.HasChanges);
Assert.True(result.HasChangesAndErrors);
Assert.False(result.HasChangesAndCompilationErrors);
Assert.False(result.HasChangesAndSyntaxErrors);
Assert.Equal(RudeEditKind.ExperimentalFeaturesEnabled, result.RudeEditErrors.Single().Kind);
}
}
Expand Down Expand Up @@ -519,11 +519,11 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

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

Assert.False(result.HasChanges);
Assert.False(result.HasChangesAndErrors);
Assert.False(result.HasChangesAndCompilationErrors);
Assert.False(result.HasChangesAndSyntaxErrors);
}

[Fact, WorkItem(10683, "https://github.com/dotnet/roslyn/issues/10683")]
Expand Down Expand Up @@ -562,13 +562,13 @@ public static void Main()
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

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

Assert.True(result.HasChanges);

// no declaration errors (error in method body is only reported when emitting):
Assert.False(result.HasChangesAndErrors);
Assert.False(result.HasChangesAndCompilationErrors);
Assert.False(result.HasChangesAndSyntaxErrors);
}

[Fact, WorkItem(10683, "https://github.com/dotnet/roslyn/issues/10683")]
Expand Down Expand Up @@ -605,11 +605,14 @@ public static void Main(Bar x)
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
var analyzer = new CSharpEditAndContinueAnalyzer();

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

Assert.True(result.HasChanges);
Assert.True(result.HasChangesAndErrors);
Assert.True(result.HasChangesAndCompilationErrors);

// No errors reported: EnC analyzer is resilient against semantic errors.
// They will be reported by 1) compiler diagnostic analyzer 2) when emitting delta - if still present.
Assert.False(result.HasChangesAndErrors);
Assert.False(result.HasChangesAndSyntaxErrors);
}

[Fact]
Expand Down Expand Up @@ -659,7 +662,7 @@ public class D

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

Assert.True(result.IsSingle());
Expand Down Expand Up @@ -708,7 +711,7 @@ public static void Main()

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

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

var result = await analyzer.AnalyzeDocumentAsync(oldProject.GetDocument(documentId), baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, CancellationToken.None);
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, ImmutableArray<TextSpan>.Empty, 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 Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis.Differencing;
using Microsoft.CodeAnalysis.EditAndContinue;
using Microsoft.CodeAnalysis.EditAndContinue.UnitTests;
Expand All @@ -13,7 +15,7 @@

namespace Microsoft.CodeAnalysis.CSharp.EditAndContinue.UnitTests
{
internal static class Extensions
internal static class EditAndContinueValidation
{
internal static void VerifyUnchangedDocument(
string source,
Expand Down Expand Up @@ -62,7 +64,7 @@ internal static void VerifySemanticDiagnostics(
params RudeEditDiagnosticDescription[] expectedDiagnostics)
{
VerifySemantics(
editScript,
new[] { editScript },
expectedDiagnostics: expectedDiagnostics);
}

Expand All @@ -72,53 +74,36 @@ internal static void VerifySemanticDiagnostics(
params RudeEditDiagnosticDescription[] expectedDiagnostics)
{
VerifySemantics(
editScript,
new[] { editScript },
targetFrameworks: targetFrameworks,
expectedDiagnostics: expectedDiagnostics);
}

internal static void VerifySemanticDiagnostics(
this EditScript<SyntaxNode> editScript,
DiagnosticDescription expectedDeclarationError,
params RudeEditDiagnosticDescription[] expectedDiagnostics)
{
VerifySemantics(
editScript,
expectedDeclarationError: expectedDeclarationError,
expectedDiagnostics: expectedDiagnostics);
}

internal static void VerifySemantics(
this EditScript<SyntaxNode> editScript,
ActiveStatementsDescription activeStatements,
SemanticEditDescription[] expectedSemanticEdits)
{
VerifySemantics(
editScript,
new[] { editScript },
activeStatements,
expectedSemanticEdits: expectedSemanticEdits,
expectedDiagnostics: null);
}

internal static void VerifySemantics(
this EditScript<SyntaxNode> editScript,
this EditScript<SyntaxNode>[] editScripts,
ActiveStatementsDescription? activeStatements = null,
TargetFramework[]? targetFrameworks = null,
IEnumerable<string>? additionalOldSources = null,
IEnumerable<string>? additionalNewSources = null,
SemanticEditDescription[]? expectedSemanticEdits = null,
DiagnosticDescription? expectedDeclarationError = null,
RudeEditDiagnosticDescription[]? expectedDiagnostics = null)
{
foreach (var targetFramework in targetFrameworks ?? new[] { TargetFramework.NetStandard20, TargetFramework.NetCoreApp })
{
new CSharpEditAndContinueTestHelpers(targetFramework).VerifySemantics(
editScript,
editScripts,
activeStatements,
additionalOldSources,
additionalNewSources,
expectedSemanticEdits,
expectedDeclarationError,
expectedDiagnostics);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Microsoft.CodeAnalysis.EditAndContinue.UnitTests;
using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.EditAndContinue;
using Microsoft.CodeAnalysis.Emit;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Text;
using Xunit;

Expand All @@ -36,7 +37,7 @@ internal enum MethodKind
internal static SemanticEditDescription[] NoSemanticEdits = Array.Empty<SemanticEditDescription>();

internal static RudeEditDiagnosticDescription Diagnostic(RudeEditKind rudeEditKind, string squiggle, params string[] arguments)
=> new RudeEditDiagnosticDescription(rudeEditKind, squiggle, arguments, firstLine: null);
=> new(rudeEditKind, squiggle, arguments, firstLine: null);

internal static SemanticEditDescription SemanticEdit(SemanticEditKind kind, Func<Compilation, ISymbol> symbolProvider, IEnumerable<KeyValuePair<TextSpan, TextSpan>> syntaxMap)
{
Expand All @@ -45,7 +46,7 @@ internal static SemanticEditDescription SemanticEdit(SemanticEditKind kind, Func
}

internal static SemanticEditDescription SemanticEdit(SemanticEditKind kind, Func<Compilation, ISymbol> symbolProvider, bool preserveLocalVariables = false)
=> new SemanticEditDescription(kind, symbolProvider, null, preserveLocalVariables);
=> new(kind, symbolProvider, syntaxMap: null, preserveLocalVariables);

private static SyntaxTree ParseSource(string source)
=> CSharpEditAndContinueTestHelpers.CreateInstance().ParseText(ActiveStatementsDescription.ClearTags(source));
Expand Down Expand Up @@ -76,7 +77,7 @@ internal static Match<SyntaxNode> GetMethodMatch(string src1, string src2, Metho
var m1 = MakeMethodBody(src1, kind);
var m2 = MakeMethodBody(src2, kind);

var diagnostics = new List<RudeEditDiagnostic>();
var diagnostics = new ArrayBuilder<RudeEditDiagnostic>();
var match = CreateAnalyzer().GetTestAccessor().ComputeBodyMatch(m1, m2, Array.Empty<AbstractEditAndContinueAnalyzer.ActiveNode>(), diagnostics, out var oldHasStateMachineSuspensionPoint, out var newHasStateMachineSuspensionPoint);
var needsSyntaxMap = oldHasStateMachineSuspensionPoint && newHasStateMachineSuspensionPoint;

Expand Down Expand Up @@ -135,10 +136,10 @@ internal static string WrapMethodBodyWithClass(string bodySource, MethodKind kin
};

internal static ActiveStatementsDescription GetActiveStatements(string oldSource, string newSource)
=> new ActiveStatementsDescription(oldSource, newSource);
=> new(oldSource, newSource);

internal static SyntaxMapDescription GetSyntaxMap(string oldSource, string newSource)
=> new SyntaxMapDescription(oldSource, newSource);
=> new(oldSource, newSource);

internal static void VerifyPreserveLocalVariables(EditScript<SyntaxNode> edits, bool preserveLocalVariables)
{
Expand All @@ -148,7 +149,7 @@ internal static void VerifyPreserveLocalVariables(EditScript<SyntaxNode> edits,
var decl2 = (MethodDeclarationSyntax)((ClassDeclarationSyntax)((CompilationUnitSyntax)edits.Match.NewRoot).Members[0]).Members[0];
var body2 = ((MethodDeclarationSyntax)SyntaxFactory.SyntaxTree(decl2).GetRoot()).Body;

var diagnostics = new List<RudeEditDiagnostic>();
var diagnostics = new ArrayBuilder<RudeEditDiagnostic>();
_ = CreateAnalyzer().GetTestAccessor().ComputeBodyMatch(body1, body2, Array.Empty<AbstractEditAndContinueAnalyzer.ActiveNode>(), diagnostics, out var oldHasStateMachineSuspensionPoint, out var newHasStateMachineSuspensionPoint);
var needsSyntaxMap = oldHasStateMachineSuspensionPoint && newHasStateMachineSuspensionPoint;

Expand Down
Loading