Skip to content

Commit e401bcc

Browse files
committed
Add RemoveAttributeQuickFix
1 parent 11f045e commit e401bcc

File tree

5 files changed

+164
-1
lines changed

5 files changed

+164
-1
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System.Collections.Generic;
2+
using Rubberduck.Inspections.Abstract;
3+
using Rubberduck.Inspections.Concrete;
4+
using Rubberduck.Parsing.Inspections.Abstract;
5+
using Rubberduck.Parsing.Rewriter;
6+
using Rubberduck.Parsing.Symbols;
7+
using Rubberduck.Parsing.VBA;
8+
using Rubberduck.Parsing.VBA.Parsing;
9+
10+
namespace Rubberduck.Inspections.QuickFixes
11+
{
12+
public class RemoveAttributeQuickFix : QuickFixBase
13+
{
14+
private readonly IAttributesUpdater _attributesUpdater;
15+
16+
public RemoveAttributeQuickFix(IAttributesUpdater attributesUpdater)
17+
:base(typeof(AttributeValueOutOfSyncInspection))
18+
{
19+
_attributesUpdater = attributesUpdater;
20+
}
21+
22+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
23+
{
24+
var declaration = result.Target;
25+
string attributeBaseName = result.Properties.AttributeName;
26+
IReadOnlyList<string> attributeValues = result.Properties.AttributeValues;
27+
28+
var attributeName = declaration.DeclarationType.HasFlag(DeclarationType.Module)
29+
? attributeBaseName
30+
: $"{declaration.IdentifierName}.{attributeBaseName}";
31+
32+
_attributesUpdater.RemoveAttribute(rewriteSession, declaration, attributeName, attributeValues);
33+
}
34+
35+
public override string Description(IInspectionResult result) => Resources.Inspections.QuickFixes.RemoveAttributeQuickFix;
36+
37+
public override CodeKind TargetCodeKind => CodeKind.AttributesCode;
38+
39+
public override bool CanFixInProcedure => false;
40+
public override bool CanFixInModule => false;
41+
public override bool CanFixInProject => false;
42+
}
43+
}

Rubberduck.Resources/Inspections/QuickFixes.Designer.cs

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/Inspections/QuickFixes.de.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,7 @@
267267
<data name="AdjustAttributeValuesQuickFix" xml:space="preserve">
268268
<value>Attributwert(e) anpassen</value>
269269
</data>
270+
<data name="RemoveAttributeQuickFix" xml:space="preserve">
271+
<value>Attribut entfernen</value>
272+
</data>
270273
</root>

Rubberduck.Resources/Inspections/QuickFixes.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,7 @@
267267
<data name="AdjustAttributeValuesQuickFix" xml:space="preserve">
268268
<value>Adjust attribute value(s)</value>
269269
</data>
270+
<data name="RemoveAttributeQuickFix" xml:space="preserve">
271+
<value>Remove attribute</value>
272+
</data>
270273
</root>
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using NUnit.Framework;
2+
using Rubberduck.Inspections.Concrete;
3+
using Rubberduck.Inspections.QuickFixes;
4+
using Rubberduck.Parsing.Inspections.Abstract;
5+
using Rubberduck.Parsing.VBA;
6+
using Rubberduck.Parsing.VBA.Parsing;
7+
8+
namespace RubberduckTests.QuickFixes
9+
{
10+
[TestFixture]
11+
public class RemoveAttributeQuickFixTests : QuickFixTestBase
12+
{
13+
[Test]
14+
[Category("QuickFixes")]
15+
public void ModuleAttributeWithoutAnnotation_QuickFixWorks()
16+
{
17+
const string inputCode =
18+
@"Attribute VB_Description = ""Desc""
19+
Public Sub Foo()
20+
Const const1 As Integer = 9
21+
End Sub";
22+
23+
const string expectedCode =
24+
@"Public Sub Foo()
25+
Const const1 As Integer = 9
26+
End Sub";
27+
28+
var actualCode = ApplyQuickFixToFirstInspectionResult(inputCode, state => new MissingModuleAnnotationInspection(state), CodeKind.AttributesCode);
29+
Assert.AreEqual(expectedCode, actualCode);
30+
}
31+
32+
[Test]
33+
[Category("QuickFixes")]
34+
public void VbExtKeyModuleAttributeWithoutAnnotationForOneKey_QuickFixWorks()
35+
{
36+
const string inputCode =
37+
@"Attribute VB_Ext_Key = ""Key"", ""NotValue""
38+
Attribute VB_Ext_Key = ""OtherKey"", ""OtherValue""
39+
'@ModuleAttribute VB_Ext_Key, ""Key"", ""Value""
40+
Public Sub Foo()
41+
Const const1 As Integer = 9
42+
End Sub";
43+
44+
const string expectedCode =
45+
@"Attribute VB_Ext_Key = ""Key"", ""NotValue""
46+
'@ModuleAttribute VB_Ext_Key, ""Key"", ""Value""
47+
Public Sub Foo()
48+
Const const1 As Integer = 9
49+
End Sub";
50+
51+
var actualCode = ApplyQuickFixToFirstInspectionResult(inputCode, state => new MissingModuleAnnotationInspection(state), CodeKind.AttributesCode);
52+
Assert.AreEqual(expectedCode, actualCode);
53+
}
54+
55+
[Test]
56+
[Category("QuickFixes")]
57+
public void MemberAttributeWithoutAnnotation_QuickFixWorks()
58+
{
59+
const string inputCode =
60+
@"
61+
Public Sub Foo()
62+
Attribute Foo.VB_Description = ""NotDesc""
63+
Const const1 As Integer = 9
64+
End Sub";
65+
66+
const string expectedCode =
67+
@"
68+
Public Sub Foo()
69+
Const const1 As Integer = 9
70+
End Sub";
71+
72+
var actualCode = ApplyQuickFixToFirstInspectionResult(inputCode, state => new MissingMemberAnnotationInspection(state), CodeKind.AttributesCode);
73+
Assert.AreEqual(expectedCode, actualCode);
74+
}
75+
76+
[Test]
77+
[Category("QuickFixes")]
78+
public void VbExtKeyMemberAttributeWithoutAnnotationForOneKey_QuickFixWorks()
79+
{
80+
const string inputCode =
81+
@"'@MemberAttribute VB_Ext_Key, ""Key"", ""Value""
82+
Public Sub Foo()
83+
Attribute Foo.VB_Ext_Key = ""Key"", ""NotValue""
84+
Attribute Foo.VB_Ext_Key = ""OtherKey"", ""OtherValue""
85+
Const const1 As Integer = 9
86+
End Sub";
87+
88+
const string expectedCode =
89+
@"'@MemberAttribute VB_Ext_Key, ""Key"", ""Value""
90+
Public Sub Foo()
91+
Attribute Foo.VB_Ext_Key = ""Key"", ""NotValue""
92+
Const const1 As Integer = 9
93+
End Sub";
94+
95+
var actualCode = ApplyQuickFixToFirstInspectionResult(inputCode, state => new MissingMemberAnnotationInspection(state), CodeKind.AttributesCode);
96+
Assert.AreEqual(expectedCode, actualCode);
97+
}
98+
99+
protected override IQuickFix QuickFix(RubberduckParserState state)
100+
{
101+
return new RemoveAttributeQuickFix(new AttributesUpdater(state));
102+
}
103+
}
104+
}

0 commit comments

Comments
 (0)