/
AdjustAttributeAnnotationQuickFix.cs
70 lines (62 loc) · 3.2 KB
/
AdjustAttributeAnnotationQuickFix.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
using System;
using System.Collections.Generic;
using Rubberduck.Inspections.Abstract;
using Rubberduck.Inspections.Concrete;
using Rubberduck.Parsing.Annotations;
using Rubberduck.Parsing.Inspections.Abstract;
using Rubberduck.Parsing.Rewriter;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Parsing.VBA;
using Rubberduck.VBEditor.SafeComWrappers;
namespace Rubberduck.Inspections.QuickFixes
{
public class AdjustAttributeAnnotationQuickFix : QuickFixBase
{
private readonly IAnnotationUpdater _annotationUpdater;
private readonly IAttributeAnnotationProvider _attributeAnnotationProvider;
public AdjustAttributeAnnotationQuickFix(IAnnotationUpdater annotationUpdater, IAttributeAnnotationProvider attributeAnnotationProvider)
: base(typeof(AttributeValueOutOfSyncInspection))
{
_annotationUpdater = annotationUpdater;
_attributeAnnotationProvider = attributeAnnotationProvider;
}
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
{
IAttributeAnnotation oldAnnotation = result.Properties.Annotation;
string attributeName = result.Properties.AttributeName;
IReadOnlyList<string> attributeValues = result.Properties.AttributeValues;
var declaration = result.Target;
if (declaration.DeclarationType.HasFlag(DeclarationType.Module))
{
var componentType = declaration.QualifiedModuleName.ComponentType;
if (IsDefaultAttribute(componentType, attributeName, attributeValues))
{
_annotationUpdater.RemoveAnnotation(rewriteSession, oldAnnotation);
}
else
{
var (newAnnotation, newAnnotationValues) = _attributeAnnotationProvider.ModuleAttributeAnnotation(attributeName, attributeValues);
_annotationUpdater.UpdateAnnotation(rewriteSession, oldAnnotation, newAnnotation, newAnnotationValues);
}
}
else
{
var attributeBaseName = AttributeBaseName(attributeName, declaration);
var (newAnnotation, newAnnotationValues) = _attributeAnnotationProvider.MemberAttributeAnnotation(attributeBaseName, attributeValues);
_annotationUpdater.UpdateAnnotation(rewriteSession, oldAnnotation, newAnnotation, newAnnotationValues);
}
}
private static bool IsDefaultAttribute(ComponentType componentType, string attributeName, IReadOnlyList<string> attributeValues)
{
return Attributes.IsDefaultAttribute(componentType, attributeName, attributeValues);
}
private static string AttributeBaseName(string attributeName, Declaration declaration)
{
return Attributes.AttributeBaseName(attributeName, declaration.IdentifierName);
}
public override string Description(IInspectionResult result) => Resources.Inspections.QuickFixes.AdjustAttributeAnnotationQuickFix;
public override bool CanFixInProcedure => true;
public override bool CanFixInModule => true;
public override bool CanFixInProject => true;
}
}