Skip to content

Commit

Permalink
Don't try to register code fixes if the diagnostic IDs aren't handled
Browse files Browse the repository at this point in the history
  • Loading branch information
DustinCampbell committed Sep 27, 2016
1 parent 8a1941f commit 8fceea9
Showing 1 changed file with 29 additions and 11 deletions.
Expand Up @@ -16,6 +16,8 @@ namespace OmniSharp.Roslyn.CSharp.Services.Refactoring.V2
{
public static class CodeActionHelper
{
private const string RemoveUnnecessaryUsingsProviderName = "Microsoft.CodeAnalysis.CSharp.CodeFixes.RemoveUnusedUsings.RemoveUnnecessaryUsingsCodeFixProvider";

public static async Task<IEnumerable<CodeAction>> GetActions(OmnisharpWorkspace workspace, IEnumerable<ICodeActionProvider> codeActionProviders, ILogger logger, ICodeActionRequest request)
{
var actions = new List<CodeAction>();
Expand All @@ -26,10 +28,19 @@ public static async Task<IEnumerable<CodeAction>> GetActions(OmnisharpWorkspace
}

var refactoringContext = await GetRefactoringContext(originalDocument, request, actions);
if (refactoringContext != null)
{
await CollectRefactoringActions(codeActionProviders, logger, refactoringContext.Value);
}

var codeFixContext = await GetCodeFixContext(originalDocument, request, actions);
await CollectRefactoringActions(codeActionProviders, logger, refactoringContext);
await CollectCodeFixActions(codeActionProviders, logger, codeFixContext);
if (codeFixContext != null)
{
await CollectCodeFixActions(codeActionProviders, logger, codeFixContext.Value);
}

actions.Reverse();

return actions;
}

Expand Down Expand Up @@ -235,10 +246,9 @@ private static TextSpan GetTextSpan(ICodeActionRequest request, SourceText sourc
"ICSharpCode.NRefactory6.CSharp.Refactoring.ConditionIsAlwaysTrueOrFalseFixProvider"
};

private static async Task CollectCodeFixActions(IEnumerable<ICodeActionProvider> codeActionProviders, ILogger logger, CodeFixContext? fixContext)
private static async Task CollectCodeFixActions(IEnumerable<ICodeActionProvider> codeActionProviders, ILogger logger, CodeFixContext context)
{
if (!fixContext.HasValue)
return;
var diagnosticIds = context.Diagnostics.Select(d => d.Id).ToArray();

foreach (var provider in codeActionProviders)
{
Expand All @@ -249,9 +259,20 @@ private static async Task CollectCodeFixActions(IEnumerable<ICodeActionProvider>
continue;
}

// TODO: This is a horrible hack! However, remove unnecessary usings only
// responds for diagnostics that are produced by its diagnostic analyzer.
// We need to provide a *real* diagnostic engine to address this.
if (codeFix.ToString() != RemoveUnnecessaryUsingsProviderName)
{
if (!diagnosticIds.Any(id => codeFix.FixableDiagnosticIds.Contains(id)))
{
continue;
}
}

try
{
await codeFix.RegisterCodeFixesAsync(fixContext.Value);
await codeFix.RegisterCodeFixesAsync(context);
}
catch
{
Expand All @@ -261,11 +282,8 @@ private static async Task CollectCodeFixActions(IEnumerable<ICodeActionProvider>
}
}

private static async Task CollectRefactoringActions(IEnumerable<ICodeActionProvider> codeActionProviders, ILogger logger, CodeRefactoringContext? refactoringContext)
private static async Task CollectRefactoringActions(IEnumerable<ICodeActionProvider> codeActionProviders, ILogger logger, CodeRefactoringContext context)
{
if (!refactoringContext.HasValue)
return;

foreach (var provider in codeActionProviders)
{
foreach (var refactoring in provider.Refactorings)
Expand All @@ -277,7 +295,7 @@ private static async Task CollectRefactoringActions(IEnumerable<ICodeActionProvi

try
{
await refactoring.ComputeRefactoringsAsync(refactoringContext.Value);
await refactoring.ComputeRefactoringsAsync(context);
}
catch
{
Expand Down

0 comments on commit 8fceea9

Please sign in to comment.