Skip to content

Commit 6fa1003

Browse files
committed
CodeFixContext
1 parent d8e95dc commit 6fa1003

File tree

6 files changed

+67
-17
lines changed

6 files changed

+67
-17
lines changed

src/OmniSharp.Roslyn.CSharp/Services/Refactoring/FixUsingService.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.Extensions.Logging;
66
using OmniSharp.Mef;
77
using OmniSharp.Models.FixUsings;
8+
using OmniSharp.Options;
89
using OmniSharp.Roslyn.Utilities;
910
using OmniSharp.Services;
1011

@@ -14,17 +15,17 @@ namespace OmniSharp.Roslyn.CSharp.Services.Refactoring
1415
public class FixUsingService : IRequestHandler<FixUsingsRequest, FixUsingsResponse>
1516
{
1617
private readonly OmniSharpWorkspace _workspace;
17-
private readonly ILoggerFactory _loggerFactory;
18+
private readonly OmniSharpOptions _options;
1819
private readonly IEnumerable<ICodeActionProvider> _providers;
1920

2021
[ImportingConstructor]
2122
public FixUsingService(
2223
OmniSharpWorkspace workspace,
23-
ILoggerFactory loggerFactory,
24+
OmniSharpOptions options,
2425
[ImportMany] IEnumerable<ICodeActionProvider> codeActionProviders)
2526
{
2627
_workspace = workspace;
27-
_loggerFactory = loggerFactory;
28+
_options = options;
2829
_providers = codeActionProviders;
2930
}
3031

@@ -35,7 +36,7 @@ public async Task<FixUsingsResponse> Handle(FixUsingsRequest request)
3536
var oldDocument = _workspace.GetDocument(request.FileName);
3637
if (oldDocument != null)
3738
{
38-
var fixUsingsResponse = await new FixUsingsWorker(_providers)
39+
var fixUsingsResponse = await new FixUsingsWorker(_providers, _options)
3940
.FixUsingsAsync(oldDocument);
4041

4142
response.AmbiguousResults = fixUsingsResponse.AmbiguousResults;

src/OmniSharp.Roslyn.CSharp/Services/Refactoring/RunFixAllCodeActionService.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
using Microsoft.Extensions.Logging;
1414
using OmniSharp.Abstractions.Models.V1.FixAll;
1515
using OmniSharp.Mef;
16+
using OmniSharp.Options;
17+
using OmniSharp.Roslyn.CodeActions;
1618
using OmniSharp.Roslyn.CSharp.Services.Refactoring.V2;
1719
using OmniSharp.Roslyn.CSharp.Workers.Diagnostics;
1820
using OmniSharp.Services;
@@ -26,12 +28,14 @@ public class RunFixAllCodeActionService : BaseCodeActionService<RunFixAllRequest
2628
{
2729
private readonly ILogger<RunFixAllCodeActionService> _logger;
2830
private readonly FixAllDiagnosticProvider _fixAllDiagnosticProvider;
31+
private readonly OmniSharpOptions _options;
2932

3033
[ImportingConstructor]
3134
public RunFixAllCodeActionService(ICsDiagnosticWorker diagnosticWorker,
3235
[ImportMany] IEnumerable<ICodeActionProvider> providers,
3336
CachingCodeFixProviderForProjects codeFixProvider,
3437
OmniSharpWorkspace workspace,
38+
OmniSharpOptions options,
3539
ILoggerFactory loggerFactory) :
3640
base(
3741
workspace,
@@ -42,6 +46,7 @@ public RunFixAllCodeActionService(ICsDiagnosticWorker diagnosticWorker,
4246
{
4347
_logger = loggerFactory.CreateLogger<RunFixAllCodeActionService>();
4448
_fixAllDiagnosticProvider = new FixAllDiagnosticProvider(diagnosticWorker);
49+
_options = options;
4550
}
4651

4752
public async override Task<RunFixAllResponse> Handle(RunFixAllRequest request)
@@ -134,15 +139,20 @@ private async Task<Document> FixSpecificDiagnosticIdAsync(Document document, str
134139
}
135140

136141
_logger.LogTrace("{0} is still present in the document. Getting fixes.", diagnosticId);
142+
137143
CodeAction action = null;
138-
var context = new CodeFixContext(document, primaryDiagnostic,
144+
var context = CodeFixContextFactory.Create(
145+
document,
146+
primaryDiagnostic.Location.SourceSpan,
147+
ImmutableArray.Create(primaryDiagnostic),
139148
(a, _) =>
140149
{
141150
if (action == null)
142151
{
143152
action = a;
144153
}
145154
},
155+
_options,
146156
cancellationToken);
147157

148158
await codeFixProvider.RegisterCodeFixesAsync(context).ConfigureAwait(false);

src/OmniSharp.Roslyn.CSharp/Workers/Diagnostics/CSharpDiagnosticWorkerWithAnalyzers.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,7 @@ private void OnWorkspaceChanged(object sender, WorkspaceChangeEventArgs changeEv
212212
}
213213

214214
private AnalyzerOptions CreateAnalyzerOptions(Project project)
215-
{
216-
var ideOptions = new OmniSharpIdeAnalyzerOptions(
217-
ImplementTypeOptions: new OmniSharpImplementTypeOptions(
218-
(OmniSharpImplementTypeInsertionBehavior)_options.ImplementTypeOptions.InsertionBehavior,
219-
(OmniSharpImplementTypePropertyGenerationBehavior)_options.ImplementTypeOptions.PropertyGenerationBehavior));
220-
221-
return OmniSharpWorkspaceAnalyzerOptionsFactory.Create(project.Solution, project.AnalyzerOptions, ideOptions);
222-
}
215+
=> OmniSharpWorkspaceAnalyzerOptionsFactory.Create(project.Solution, project.AnalyzerOptions);
223216

224217
public async Task<IEnumerable<Diagnostic>> AnalyzeDocumentAsync(Document document, CancellationToken cancellationToken)
225218
{

src/OmniSharp.Roslyn.CSharp/Workers/Formatting/FormattingWorker.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static class FormattingWorker
2424
{
2525
public static async Task<IEnumerable<LinePositionSpanTextChange>> GetFormattingChangesAfterKeystroke(Document document, int position, char character, OmniSharpOptions omnisharpOptions)
2626
{
27-
if (await GetDocumentationCommentChanges(document, position, character, omnisharpOptions) is LinePositionSpanTextChange change)
27+
if (await GetDocumentationCommentChanges(document, position, character) is LinePositionSpanTextChange change)
2828
{
2929
return new[] { change };
3030
}
@@ -202,7 +202,7 @@ private static OmniSharpBinaryOperatorSpacingOptions BinaryOperatorSpacingOption
202202
_ => OmniSharpBinaryOperatorSpacingOptions.Single,
203203
};
204204

205-
private static async Task<LinePositionSpanTextChange?> GetDocumentationCommentChanges(Document document, int position, char character, OmniSharpOptions omnisharpOptions)
205+
private static async Task<LinePositionSpanTextChange?> GetDocumentationCommentChanges(Document document, int position, char character)
206206
{
207207
if (character != '\n' && character != '/')
208208
{

src/OmniSharp.Roslyn.CSharp/Workers/Refactoring/FixUsingsWorker.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
using Microsoft.CodeAnalysis.CSharp.Syntax;
1212
using Microsoft.CodeAnalysis.Text;
1313
using OmniSharp.Models;
14+
using OmniSharp.Options;
15+
using OmniSharp.Roslyn.CodeActions;
1416
using OmniSharp.Roslyn.CSharp.Services.CodeActions;
1517
using OmniSharp.Services;
1618

@@ -27,15 +29,17 @@ public class FixUsingsWorker
2729
private readonly IEnumerable<ICodeActionProvider> _providers;
2830
private readonly CodeFixProvider _addImportProvider;
2931
private readonly CodeFixProvider _removeUnnecessaryUsingsProvider;
32+
private readonly OmniSharpOptions _options;
3033

31-
public FixUsingsWorker(IEnumerable<ICodeActionProvider> providers)
34+
public FixUsingsWorker(IEnumerable<ICodeActionProvider> providers, OmniSharpOptions options)
3235
{
3336
_providers = providers;
3437

3538
var codeFixProviders = providers.SelectMany(p => p.CodeFixProviders);
3639

3740
_addImportProvider = FindCodeFixProviderByTypeFullName(codeFixProviders, CodeActionHelper.AddImportProviderName);
3841
_removeUnnecessaryUsingsProvider = FindCodeFixProviderByTypeFullName(codeFixProviders, CodeActionHelper.RemoveUnnecessaryUsingsProviderName);
42+
_options = options;
3943
}
4044

4145
private static CodeFixProvider FindCodeFixProviderByTypeFullName(IEnumerable<CodeFixProvider> providers, string fullName)
@@ -238,9 +242,10 @@ private async Task<ImmutableArray<CodeActionOperation>> GetCodeFixOperationsAsyn
238242
ImmutableArray<Diagnostic> diagnostics)
239243
{
240244
var codeFixes = new List<CodeAction>();
241-
var context = new CodeFixContext(
245+
var context = CodeFixContextFactory.Create(
242246
document, span, diagnostics,
243247
registerCodeFix: (a, d) => codeFixes.Add(a),
248+
_options,
244249
cancellationToken: CancellationToken.None);
245250

246251
// Note: We're intentionally not checking CodeFixProvider.FixableDiagnosticIds here.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Microsoft.CodeAnalysis.CodeFixes;
7+
using Microsoft.CodeAnalysis.CodeActions;
8+
using Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.CodeActions;
9+
using Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.ImplementType;
10+
using OmniSharp.Options;
11+
using Microsoft.CodeAnalysis;
12+
using System.Collections.Immutable;
13+
using System.Threading;
14+
using Microsoft.CodeAnalysis.Text;
15+
16+
namespace OmniSharp.Roslyn.CodeActions
17+
{
18+
internal static class CodeFixContextFactory
19+
{
20+
public static CodeFixContext Create(
21+
Document document,
22+
TextSpan span,
23+
ImmutableArray<Diagnostic> diagnostics,
24+
Action<CodeAction, ImmutableArray<Diagnostic>> registerCodeFix,
25+
OmniSharpOptions options,
26+
CancellationToken cancellationToken)
27+
{
28+
var implementTypeOptions = new OmniSharpImplementTypeOptions(
29+
(OmniSharpImplementTypeInsertionBehavior)options.ImplementTypeOptions.InsertionBehavior,
30+
(OmniSharpImplementTypePropertyGenerationBehavior)options.ImplementTypeOptions.PropertyGenerationBehavior);
31+
32+
return OmniSharpCodeFixContextFactory.Create(
33+
document,
34+
span,
35+
diagnostics,
36+
registerCodeFix,
37+
implementTypeOptions,
38+
cancellationToken);
39+
}
40+
}
41+
}

0 commit comments

Comments
 (0)