/
IgnoreOnceQuickFix.cs
92 lines (83 loc) · 4.02 KB
/
IgnoreOnceQuickFix.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Collections.Generic;
using System.Linq;
using Antlr4.Runtime.Misc;
using Antlr4.Runtime.Tree;
using Rubberduck.Inspections.Abstract;
using Rubberduck.Parsing;
using Rubberduck.Parsing.Annotations;
using Rubberduck.Parsing.Grammar;
using Rubberduck.Parsing.Inspections;
using Rubberduck.Parsing.Inspections.Abstract;
using Rubberduck.Parsing.Rewriter;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Parsing.VBA;
using Rubberduck.Parsing.VBA.Parsing;
namespace Rubberduck.Inspections.QuickFixes
{
public sealed class IgnoreOnceQuickFix : QuickFixBase
{
private readonly RubberduckParserState _state;
private readonly IAnnotationUpdater _annotationUpdater;
public IgnoreOnceQuickFix(IAnnotationUpdater annotationUpdater, RubberduckParserState state, IEnumerable<IInspection> inspections)
: base(inspections.Select(s => s.GetType()).Where(i => i.CustomAttributes.All(a => a.AttributeType != typeof(CannotAnnotateAttribute))).ToArray())
{
_state = state;
_annotationUpdater = annotationUpdater;
}
public override bool CanFixInProcedure => false;
public override bool CanFixInModule => false;
public override bool CanFixInProject => false;
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
{
if (result.Target?.DeclarationType.HasFlag(DeclarationType.Module) ?? false)
{
FixModule(result, rewriteSession);
}
else
{
FixNonModule(result, rewriteSession);
}
}
private void FixNonModule(IInspectionResult result, IRewriteSession rewriteSession)
{
var module = result.QualifiedSelection.QualifiedName;
var lineToAnnotate = result.QualifiedSelection.Selection.StartLine;
var existingIgnoreAnnotation = _state.DeclarationFinder.FindAnnotations(module, lineToAnnotate)
.OfType<IgnoreAnnotation>()
.FirstOrDefault();
var annotationInfo = typeof(IgnoreAnnotation).GetCustomAttributes(false).OfType<AnnotationAttribute>().Single();
if (existingIgnoreAnnotation != null)
{
var annotationValues = existingIgnoreAnnotation.InspectionNames.ToList();
annotationValues.Insert(0, result.Inspection.AnnotationName);
_annotationUpdater.UpdateAnnotation(rewriteSession, existingIgnoreAnnotation, annotationInfo, annotationValues);
}
else
{
var annotationValues = new List<string> { result.Inspection.AnnotationName };
_annotationUpdater.AddAnnotation(rewriteSession, new QualifiedContext(module, result.Context), annotationInfo, annotationValues);
}
}
private void FixModule(IInspectionResult result, IRewriteSession rewriteSession)
{
var moduleDeclaration = result.Target;
var existingIgnoreModuleAnnotation = moduleDeclaration.Annotations
.OfType<IgnoreModuleAnnotation>()
.FirstOrDefault();
var annotationType = typeof(IgnoreModuleAnnotation).GetCustomAttributes(false).OfType<AnnotationAttribute>().Single();
if (existingIgnoreModuleAnnotation != null)
{
var annotationValues = existingIgnoreModuleAnnotation.InspectionNames.ToList();
annotationValues.Insert(0, result.Inspection.AnnotationName);
_annotationUpdater.UpdateAnnotation(rewriteSession, existingIgnoreModuleAnnotation, annotationType, annotationValues);
}
else
{
var annotationValues = new List<string> { result.Inspection.AnnotationName };
_annotationUpdater.AddAnnotation(rewriteSession, moduleDeclaration, annotationType, annotationValues);
}
}
public override string Description(IInspectionResult result) => Resources.Inspections.QuickFixes.IgnoreOnce;
}
}