Skip to content

Commit 3f4d5a4

Browse files
committed
EnC analyzer constructor cleanup
1 parent 4d02330 commit 3f4d5a4

File tree

12 files changed

+51
-77
lines changed

12 files changed

+51
-77
lines changed

src/Features/CSharp/Portable/EditAndContinue/CSharpEditAndContinueAnalyzer.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
using Microsoft.CodeAnalysis.CSharp.Syntax;
1616
using Microsoft.CodeAnalysis.Differencing;
1717
using Microsoft.CodeAnalysis.EditAndContinue;
18-
using Microsoft.CodeAnalysis.Formatting;
19-
using Microsoft.CodeAnalysis.Host;
2018
using Microsoft.CodeAnalysis.Host.Mef;
2119
using Microsoft.CodeAnalysis.PooledObjects;
2220
using Microsoft.CodeAnalysis.Shared.Collections;
@@ -26,17 +24,11 @@
2624

2725
namespace Microsoft.CodeAnalysis.CSharp.EditAndContinue;
2826

29-
internal sealed class CSharpEditAndContinueAnalyzer(Action<SyntaxNode>? testFaultInjector = null) : AbstractEditAndContinueAnalyzer(testFaultInjector)
27+
[ExportLanguageService(typeof(IEditAndContinueAnalyzer), LanguageNames.CSharp), Shared]
28+
[method: ImportingConstructor]
29+
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
30+
internal sealed class CSharpEditAndContinueAnalyzer() : AbstractEditAndContinueAnalyzer
3031
{
31-
[ExportLanguageServiceFactory(typeof(IEditAndContinueAnalyzer), LanguageNames.CSharp), Shared]
32-
[method: ImportingConstructor]
33-
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
34-
internal sealed class Factory() : ILanguageServiceFactory
35-
{
36-
public ILanguageService CreateLanguageService(HostLanguageServices languageServices)
37-
=> new CSharpEditAndContinueAnalyzer(testFaultInjector: null);
38-
}
39-
4032
#region Syntax Analysis
4133

4234
private enum BlockPart

src/Features/CSharpTest/EditAndContinue/CSharpEditAndContinueAnalyzerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ private static async Task<DocumentAnalysisResults> AnalyzeDocumentAsync(
122122
EditAndContinueCapabilities capabilities = EditAndContinueTestVerifier.Net5RuntimeCapabilities,
123123
ImmutableArray<ActiveStatementLineSpan> newActiveStatementSpans = default)
124124
{
125-
var analyzer = new CSharpEditAndContinueAnalyzer();
125+
var analyzer = EditAndContinueTestVerifier.CreateAnalyzer(faultInjector: null, LanguageNames.CSharp);
126126
var baseActiveStatements = AsyncLazy.Create(activeStatementMap ?? ActiveStatementsMap.Empty);
127127
var lazyCapabilities = AsyncLazy.Create(capabilities);
128128
return await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, newActiveStatementSpans.NullToEmpty(), lazyCapabilities, CancellationToken.None);
@@ -749,13 +749,13 @@ public async Task AnalyzeDocumentAsync_InternalError(bool outOfMemory)
749749
var baseActiveStatements = AsyncLazy.Create(ActiveStatementsMap.Empty);
750750
var capabilities = AsyncLazy.Create(EditAndContinueTestVerifier.Net5RuntimeCapabilities);
751751

752-
var analyzer = new CSharpEditAndContinueAnalyzer(node =>
752+
var analyzer = EditAndContinueTestVerifier.CreateAnalyzer(faultInjector: node =>
753753
{
754754
if (node is CompilationUnitSyntax)
755755
{
756756
throw outOfMemory ? new OutOfMemoryException() : new NullReferenceException("NullRef!");
757757
}
758-
});
758+
}, LanguageNames.CSharp);
759759

760760
var result = await analyzer.AnalyzeDocumentAsync(oldProject, baseActiveStatements, newDocument, [], capabilities, CancellationToken.None);
761761

src/Features/CSharpTest/EditAndContinue/Helpers/CSharpEditAndContinueTestVerifier.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,13 @@
66
using System.Collections.Immutable;
77
using Microsoft.CodeAnalysis.CSharp.Symbols;
88
using Microsoft.CodeAnalysis.Differencing;
9-
using Microsoft.CodeAnalysis.EditAndContinue;
109
using Microsoft.CodeAnalysis.EditAndContinue.UnitTests;
1110
using Xunit;
1211

1312
namespace Microsoft.CodeAnalysis.CSharp.EditAndContinue.UnitTests;
1413

15-
internal sealed class CSharpEditAndContinueTestVerifier(Action<SyntaxNode>? faultInjector = null) : EditAndContinueTestVerifier
14+
internal sealed class CSharpEditAndContinueTestVerifier(Action<SyntaxNode>? faultInjector = null) : EditAndContinueTestVerifier(faultInjector)
1615
{
17-
private readonly CSharpEditAndContinueAnalyzer _analyzer = new(faultInjector);
18-
19-
public override AbstractEditAndContinueAnalyzer Analyzer => _analyzer;
2016
public override string LanguageName => LanguageNames.CSharp;
2117
public override string ProjectFileExtension => ".csproj";
2218
public override TreeComparer<SyntaxNode> TopSyntaxComparer => SyntaxComparer.TopLevel;

src/Features/CSharpTest/EditAndContinue/Helpers/EditAndContinueValidation.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
using Microsoft.CodeAnalysis.Differencing;
6-
using Microsoft.CodeAnalysis.EditAndContinue;
75
using Microsoft.CodeAnalysis.Contracts.EditAndContinue;
6+
using Microsoft.CodeAnalysis.EditAndContinue;
87
using Microsoft.CodeAnalysis.EditAndContinue.UnitTests;
98
using Roslyn.Test.Utilities;
109
using Xunit;

src/Features/CSharpTest/EditAndContinue/Helpers/EditingTestBase.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
using Microsoft.CodeAnalysis.Text;
1818
using Roslyn.Utilities;
1919
using Xunit;
20+
using Microsoft.CodeAnalysis.Host.Mef;
21+
using System.Linq;
2022

2123
namespace Microsoft.CodeAnalysis.CSharp.EditAndContinue.UnitTests;
2224

@@ -27,11 +29,6 @@ public abstract class EditingTestBase : CSharpTestBase
2729
namespace System.Runtime.CompilerServices { class CreateNewOnMetadataUpdateAttribute : Attribute {} }
2830
";
2931

30-
internal static CSharpEditAndContinueAnalyzer CreateAnalyzer()
31-
{
32-
return new CSharpEditAndContinueAnalyzer(testFaultInjector: null);
33-
}
34-
3532
internal enum MethodKind
3633
{
3734
Regular,
@@ -184,7 +181,8 @@ internal static Match<SyntaxNode> GetMethodMatch(string src1, string src2, Metho
184181
internal static IEnumerable<KeyValuePair<SyntaxNode, SyntaxNode>> GetMethodMatches(string src1, string src2, MethodKind kind = MethodKind.Regular)
185182
{
186183
var methodMatch = GetMethodMatch(src1, src2, kind);
187-
return EditAndContinueTestVerifier.GetMethodMatches(CreateAnalyzer(), methodMatch);
184+
var analyzer = EditAndContinueTestVerifier.CreateAnalyzer(faultInjector: null, LanguageNames.CSharp);
185+
return EditAndContinueTestVerifier.GetMethodMatches(analyzer, methodMatch);
188186
}
189187

190188
public static MatchingPairs ToMatchingPairs(Match<SyntaxNode> match)

src/Features/CSharpTest/EditAndContinue/StatementMatchingTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
using System.Collections.Generic;
88
using Microsoft.CodeAnalysis.CSharp.Syntax;
99
using Microsoft.CodeAnalysis.EditAndContinue.UnitTests;
10+
using Microsoft.CodeAnalysis.Test.Utilities;
1011
using Roslyn.Test.Utilities;
1112
using Xunit;
1213

1314
namespace Microsoft.CodeAnalysis.CSharp.EditAndContinue.UnitTests;
1415

16+
[UseExportProvider]
1517
public class StatementMatchingTests : EditingTestBase
1618
{
1719
#region Known Matches

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,7 @@ internal abstract class AbstractEditAndContinueAnalyzer : IEditAndContinueAnalyz
6969
SymbolDisplayMiscellaneousOptions.UseSpecialTypes);
7070

7171
// used by tests to validate correct handlign of unexpected exceptions
72-
private readonly Action<SyntaxNode>? _testFaultInjector;
73-
74-
protected AbstractEditAndContinueAnalyzer(Action<SyntaxNode>? testFaultInjector)
75-
{
76-
_testFaultInjector = testFaultInjector;
77-
}
72+
private Action<SyntaxNode>? _testFaultInjector;
7873

7974
private static TraceLog Log
8075
=> EditAndContinueService.AnalysisLog;
@@ -6779,19 +6774,23 @@ private static bool HasGetHashCodeSignature(IMethodSymbol method)
67796774
internal TestAccessor GetTestAccessor()
67806775
=> new(this);
67816776

6782-
internal readonly struct TestAccessor(AbstractEditAndContinueAnalyzer abstractEditAndContinueAnalyzer)
6777+
internal readonly struct TestAccessor(AbstractEditAndContinueAnalyzer analyzer)
67836778
{
6784-
private readonly AbstractEditAndContinueAnalyzer _abstractEditAndContinueAnalyzer = abstractEditAndContinueAnalyzer;
6779+
internal Action<SyntaxNode>? FaultInjector
6780+
{
6781+
get => analyzer._testFaultInjector = FaultInjector;
6782+
set => analyzer._testFaultInjector = value;
6783+
}
67856784

67866785
internal void ReportTopLevelSyntacticRudeEdits(ArrayBuilder<RudeEditDiagnostic> diagnostics, EditScript<SyntaxNode> syntacticEdits, Dictionary<SyntaxNode, EditKind> editMap)
6787-
=> _abstractEditAndContinueAnalyzer.ReportTopLevelSyntacticRudeEdits(diagnostics, syntacticEdits, editMap);
6786+
=> analyzer.ReportTopLevelSyntacticRudeEdits(diagnostics, syntacticEdits, editMap);
67886787

67896788
internal DeclarationBodyMap IncludeLambdaBodyMaps(
67906789
DeclarationBodyMap bodyMap,
67916790
ArrayBuilder<ActiveNode> memberBodyActiveNodes,
67926791
ref Dictionary<LambdaBody, LambdaInfo>? lazyActiveOrMatchedLambdas)
67936792
{
6794-
return _abstractEditAndContinueAnalyzer.IncludeLambdaBodyMaps(bodyMap, memberBodyActiveNodes, ref lazyActiveOrMatchedLambdas);
6793+
return analyzer.IncludeLambdaBodyMaps(bodyMap, memberBodyActiveNodes, ref lazyActiveOrMatchedLambdas);
67956794
}
67966795
}
67976796

src/Features/TestUtilities/EditAndContinue/EditAndContinueTestVerifier.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Roslyn.Utilities;
1919
using Xunit;
2020
using static Microsoft.CodeAnalysis.EditAndContinue.AbstractEditAndContinueAnalyzer;
21+
using Microsoft.CodeAnalysis.Host.Mef;
2122

2223
namespace Microsoft.CodeAnalysis.EditAndContinue.UnitTests
2324
{
@@ -44,14 +45,27 @@ internal abstract class EditAndContinueTestVerifier
4445
EditAndContinueCapabilities.GenericUpdateMethod |
4546
EditAndContinueCapabilities.GenericAddFieldToExistingType;
4647

47-
public abstract AbstractEditAndContinueAnalyzer Analyzer { get; }
48+
public AbstractEditAndContinueAnalyzer Analyzer { get; }
49+
50+
protected EditAndContinueTestVerifier(Action<SyntaxNode>? faultInjector)
51+
{
52+
Analyzer = CreateAnalyzer(faultInjector, LanguageName);
53+
}
4854

4955
public abstract ImmutableArray<SyntaxNode> GetDeclarators(ISymbol method);
5056
public abstract string LanguageName { get; }
5157
public abstract string ProjectFileExtension { get; }
5258
public abstract TreeComparer<SyntaxNode> TopSyntaxComparer { get; }
5359
public abstract string? TryGetResource(string keyword);
5460

61+
internal static AbstractEditAndContinueAnalyzer CreateAnalyzer(Action<SyntaxNode>? faultInjector, string languageName)
62+
{
63+
var exportProvider = FeaturesTestCompositions.Features.ExportProviderFactory.CreateExportProvider();
64+
var analyzer = (AbstractEditAndContinueAnalyzer)exportProvider.GetExports<IEditAndContinueAnalyzer, LanguageMetadata>().Single(e => e.Metadata.Language == languageName).Value;
65+
analyzer.GetTestAccessor().FaultInjector = faultInjector;
66+
return analyzer;
67+
}
68+
5569
private void VerifyDocumentActiveStatementsAndExceptionRegions(
5670
ActiveStatementsDescription description,
5771
SyntaxTree oldTree,

src/Features/VisualBasic/Portable/EditAndContinue/VisualBasicEditAndContinueAnalyzer.vb

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,13 @@ Imports Microsoft.CodeAnalysis.Text
1616
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
1717

1818
Namespace Microsoft.CodeAnalysis.VisualBasic.EditAndContinue
19+
<ExportLanguageService(GetType(IEditAndContinueAnalyzer), LanguageNames.VisualBasic), [Shared]>
1920
Friend NotInheritable Class VisualBasicEditAndContinueAnalyzer
2021
Inherits AbstractEditAndContinueAnalyzer
2122

22-
<ExportLanguageServiceFactory(GetType(IEditAndContinueAnalyzer), LanguageNames.VisualBasic), [Shared]>
23-
Private NotInheritable Class Factory
24-
Implements ILanguageServiceFactory
25-
26-
<ImportingConstructor>
27-
<Obsolete(MefConstruction.ImportingConstructorMessage, True)>
28-
Public Sub New()
29-
End Sub
30-
31-
Public Function CreateLanguageService(languageServices As HostLanguageServices) As ILanguageService Implements ILanguageServiceFactory.CreateLanguageService
32-
Return New VisualBasicEditAndContinueAnalyzer(testFaultInjector:=Nothing)
33-
End Function
34-
End Class
35-
36-
' Public for testing purposes
37-
Public Sub New(Optional testFaultInjector As Action(Of SyntaxNode) = Nothing)
38-
MyBase.New(testFaultInjector)
23+
<ImportingConstructor>
24+
<Obsolete(MefConstruction.ImportingConstructorMessage, True)>
25+
Public Sub New()
3926
End Sub
4027

4128
#Region "Syntax Analysis"

src/Features/VisualBasicTest/EditAndContinue/Helpers/EditingTestBase.vb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@ Namespace System.Runtime.CompilerServices
2828
End Class
2929
End Namespace
3030
"
31-
32-
Friend Shared Function CreateAnalyzer() As VisualBasicEditAndContinueAnalyzer
33-
Return New VisualBasicEditAndContinueAnalyzer()
34-
End Function
35-
3631
Public Enum MethodKind
3732
Regular
3833
Async
@@ -249,7 +244,8 @@ End Namespace
249244
src2 As String,
250245
Optional kind As MethodKind = MethodKind.Regular) As IEnumerable(Of KeyValuePair(Of SyntaxNode, SyntaxNode))
251246
Dim methodMatch = GetMethodMatch(src1, src2, kind)
252-
Return EditAndContinueTestVerifier.GetMethodMatches(CreateAnalyzer(), methodMatch)
247+
Dim analyzer = EditAndContinueTestVerifier.CreateAnalyzer(faultInjector:=Nothing, LanguageNames.VisualBasic)
248+
Return EditAndContinueTestVerifier.GetMethodMatches(analyzer, methodMatch)
253249
End Function
254250

255251
Public Shared Function ToMatchingPairs(match As Match(Of SyntaxNode)) As MatchingPairs

0 commit comments

Comments
 (0)