Skip to content

Commit

Permalink
Improve code style behavior.
Browse files Browse the repository at this point in the history
  • Loading branch information
CyrusNajmabadi committed Nov 17, 2017
1 parent c8a4050 commit 3c67ceb
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,32 @@ protected sealed override void InitializeWorker(AnalysisContext context)

private void AnalyzeSemanticModel(SemanticModelAnalysisContext context)
{
var cancellationToken = context.CancellationToken;
var semanticModel = context.SemanticModel;

// Don't even bother doing the analysis if the user doesn't even want auto-props.
var optionSet = context.Options.GetDocumentOptionSetAsync(
semanticModel.SyntaxTree, cancellationToken).GetAwaiter().GetResult();
if (optionSet == null)
{
return;
}

var option = optionSet.GetOption(CodeStyleOptions.PreferAutoProperties, semanticModel.Language);
if (!option.Value)
{
return;
}

var analysisResults = new List<AnalysisResult>();
var ineligibleFields = new HashSet<IFieldSymbol>();

var root = context.SemanticModel.SyntaxTree.GetRoot(context.CancellationToken);
var root = semanticModel.SyntaxTree.GetRoot(cancellationToken);
AnalyzeCompilationUnit(context, root, analysisResults);

RegisterIneligibleFieldsAction(
analysisResults, ineligibleFields,
context.SemanticModel.Compilation, context.CancellationToken);
semanticModel.Compilation, cancellationToken);
Process(analysisResults, ineligibleFields, context);
}

Expand Down Expand Up @@ -275,32 +292,31 @@ private void Process(AnalysisResult result, SemanticModelAnalysisContext context
return;
}

// Always offer the conversion if possible. But only let the user know (by
// fading/suggestions/squiggles) if their option is set to see this.

var option = optionSet.GetOption(CodeStyleOptions.PreferAutoProperties, propertyDeclaration.Language);
if (option.Value)
{
// Fade out the field/variable we are going to remove.
var diagnostic1 = Diagnostic.Create(UnnecessaryWithoutSuggestionDescriptor, nodeToFade.GetLocation());
context.ReportDiagnostic(diagnostic1);
}

// Now add diagnostics to both the field and the property saying we can convert it to
// an auto property. For each diagnostic store both location so we can easily retrieve
// them when performing the code fix.
var additionalLocations = ImmutableArray.Create(
propertyDeclaration.GetLocation(), variableDeclarator.GetLocation());

var diagnostic2 = Diagnostic.Create(HiddenDescriptor, propertyDeclaration.GetLocation(),
additionalLocations: additionalLocations);
context.ReportDiagnostic(diagnostic2);
var option = optionSet.GetOption(CodeStyleOptions.PreferAutoProperties, propertyDeclaration.Language);

var lowPriority = ImmutableDictionary<string, string>.Empty.Add("LowPriority", "");

// Place the appropriate marker on the field depending on the user option.
var diagnostic3 = Diagnostic.Create(
var diagnostic1 = Diagnostic.Create(
GetFieldDescriptor(option), nodeToFade.GetLocation(),
additionalLocations: additionalLocations);
context.ReportDiagnostic(diagnostic3);
additionalLocations: additionalLocations,
properties: option.Notification.Value == DiagnosticSeverity.Hidden ? lowPriority : default);

// Also, place a hidden marker on the property. If they bring up a lightbulb
// there, they'll be able to see that they can convert it to an auto-prop.
var diagnostic2 = Diagnostic.Create(
HiddenDescriptor, propertyDeclaration.GetLocation(),
additionalLocations: additionalLocations,
properties: lowPriority);

context.ReportDiagnostic(diagnostic1);
context.ReportDiagnostic(diagnostic2);
}

private DiagnosticDescriptor GetFieldDescriptor(CodeStyleOption<bool> styleOption)
Expand All @@ -315,7 +331,7 @@ private DiagnosticDescriptor GetFieldDescriptor(CodeStyleOption<bool> styleOptio
}
}

return HiddenDescriptor;
return UnnecessaryWithSuggestionDescriptor;
}

protected virtual bool IsEligibleHeuristic(IFieldSymbol field, TPropertyDeclaration propertyDeclaration, Compilation compilation, CancellationToken cancellationToken)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,15 @@ public sealed override Task RegisterCodeFixesAsync(CodeFixContext context)
{
foreach (var diagnostic in context.Diagnostics)
{
var priority = diagnostic.Properties.ContainsKey("LowPriority")
? CodeActionPriority.Low
: CodeActionPriority.Medium;

context.RegisterCodeFix(
new UseAutoPropertyCodeAction(
FeaturesResources.Use_auto_property,
c => ProcessResultAsync(context, diagnostic, c)),
c => ProcessResultAsync(context, diagnostic, c),
priority),
diagnostic);
}

Expand Down Expand Up @@ -273,10 +278,13 @@ private static bool IsWrittenToOutsideOfConstructorOrProperty(

private class UseAutoPropertyCodeAction : CodeAction.SolutionChangeAction
{
public UseAutoPropertyCodeAction(string title, Func<CancellationToken, Task<Solution>> createChangedSolution)
public UseAutoPropertyCodeAction(string title, Func<CancellationToken, Task<Solution>> createChangedSolution, CodeActionPriority priority)
: base(title, createChangedSolution, title)
{
this.Priority = priority;
}

internal override CodeActionPriority Priority { get; }
}
}
}

0 comments on commit 3c67ceb

Please sign in to comment.