Skip to content

Commit c0e49f5

Browse files
authored
Merge pull request #5311 from MDoerner/FixExcelHotkeyAttribute
Fixes ExcelHotkey attribute annotation value
2 parents a42fe52 + bf4f880 commit c0e49f5

File tree

4 files changed

+114
-3
lines changed

4 files changed

+114
-3
lines changed

Rubberduck.Parsing/Annotations/Concrete/ExcelHotKeyAnnotation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public ExcelHotKeyAnnotation()
1515

1616
public override IReadOnlyList<string> AnnotationToAttributeValues(IReadOnlyList<string> annotationValues)
1717
{
18-
return annotationValues.Take(1).Select(v => v.UnQuote()[0] + @"\n14".EnQuote()).ToList();
18+
return annotationValues.Take(1).Select(v => (v.UnQuote()[0] + @"\n14").EnQuote()).ToList();
1919
}
2020

2121
public override IReadOnlyList<string> AttributeToAnnotationValues(IReadOnlyList<string> attributeValues)
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using NUnit.Framework;
4+
using Rubberduck.Parsing.Annotations;
5+
using Rubberduck.Parsing.Symbols;
6+
using Rubberduck.VBEditor.SafeComWrappers;
7+
using RubberduckTests.Mocks;
8+
9+
namespace RubberduckTests.Annotations
10+
{
11+
[TestFixture]
12+
public class AttributeAnnotationTests
13+
{
14+
[TestCase("VB_Description", "\"SomeDescription\"", "ModuleDescription", "\"SomeDescription\"")]
15+
[TestCase("VB_Exposed", "True", "Exposed")]
16+
[TestCase("VB_PredeclaredId", "True", "PredeclaredId")]
17+
public void ModuleAttributeAnnotationReturnsReturnsCorrectAttribute(string expectedAttribute, string expectedAttributeValues, string annotationName, string annotationValue = null)
18+
{
19+
var code = $@"
20+
'@{annotationName} {annotationValue}";
21+
22+
var vbe = MockVbeBuilder.BuildFromSingleModule(code, "Class1", ComponentType.ClassModule, out _).Object;
23+
using (var state = MockParser.CreateAndParse(vbe))
24+
{
25+
var moduleDeclaration = state.DeclarationFinder.UserDeclarations(DeclarationType.ClassModule).Single();
26+
var moduleAnnotations = moduleDeclaration.Annotations
27+
.Select(pta => (pta.Annotation, pta.AnnotationArguments));
28+
var (annotation, annotationArguments) = moduleAnnotations.Single(tpl => tpl.Annotation.Name.Equals(annotationName));
29+
30+
var actualAttribute = ((IAttributeAnnotation) annotation).Attribute(annotationArguments);
31+
var actualAttributeValues = ((IAttributeAnnotation)annotation).AnnotationToAttributeValues(annotationArguments);
32+
var actualAttributesValuesText = string.Join(", ", actualAttributeValues);
33+
34+
Assert.AreEqual(expectedAttribute, actualAttribute);
35+
Assert.AreEqual(actualAttributesValuesText, expectedAttributeValues);
36+
}
37+
}
38+
39+
[TestCase("VB_ProcData.VB_Invoke_Func", @"""A\n14""", "ExcelHotkey", "A")] //See issue #5268 at https://github.com/rubberduck-vba/Rubberduck/issues/5268
40+
[TestCase("VB_Description", "\"SomeDescription\"", "Description", "\"SomeDescription\"")]
41+
[TestCase("VB_UserMemId", "0", "DefaultMember")]
42+
[TestCase("VB_UserMemId", "-4", "Enumerator")]
43+
public void MemberAttributeAnnotationReturnsReturnsCorrectAttribute(string expectedAttribute, string expectedAttributeValues, string annotationName, string annotationValue = null)
44+
{
45+
var code = $@"
46+
'@{annotationName} {annotationValue}
47+
Public Function Foo()
48+
End Function";
49+
50+
var vbe = MockVbeBuilder.BuildFromSingleModule(code, "Class1", ComponentType.ClassModule, out _).Object;
51+
using (var state = MockParser.CreateAndParse(vbe))
52+
{
53+
var memberDeclaration = state.DeclarationFinder.UserDeclarations(DeclarationType.Function).Single();
54+
var memberAnnotations = memberDeclaration.Annotations
55+
.Select(pta => (pta.Annotation, pta.AnnotationArguments));
56+
var (annotation, annotationArguments) = memberAnnotations.Single(tpl => tpl.Annotation.Name.Equals(annotationName));
57+
58+
var actualAttribute = ((IAttributeAnnotation)annotation).Attribute(annotationArguments);
59+
var actualAttributeValues = ((IAttributeAnnotation) annotation).AnnotationToAttributeValues(annotationArguments);
60+
var actualAttributesValuesText = string.Join(", ", actualAttributeValues);
61+
62+
Assert.AreEqual(expectedAttribute, actualAttribute);
63+
Assert.AreEqual(expectedAttributeValues, actualAttributesValuesText);
64+
}
65+
}
66+
67+
[TestCase("VB_VarDescription", "\"SomeDescription\"", "VariableDescription", "\"SomeDescription\"")]
68+
public void VariableAttributeAnnotationReturnsReturnsCorrectAttribute(string expectedAttribute, string expectedAttributeValues, string annotationName, string annotationValue = null)
69+
{
70+
var code = $@"
71+
'@{annotationName} {annotationValue}
72+
Public MyVariable";
73+
74+
var vbe = MockVbeBuilder.BuildFromSingleModule(code, "Class1", ComponentType.ClassModule, out _).Object;
75+
using (var state = MockParser.CreateAndParse(vbe))
76+
{
77+
var memberDeclaration = state.DeclarationFinder.UserDeclarations(DeclarationType.Variable).Single();
78+
var memberAnnotations = memberDeclaration.Annotations
79+
.Select(pta => (pta.Annotation, pta.AnnotationArguments));
80+
var (annotation, annotationArguments) = memberAnnotations.Single(tpl => tpl.Annotation.Name.Equals(annotationName));
81+
82+
var actualAttribute = ((IAttributeAnnotation)annotation).Attribute(annotationArguments);
83+
var actualAttributeValues = ((IAttributeAnnotation)annotation).AnnotationToAttributeValues(annotationArguments);
84+
var actualAttributesValuesText = string.Join(", ", actualAttributeValues);
85+
86+
Assert.AreEqual(expectedAttribute, actualAttribute);
87+
Assert.AreEqual(actualAttributesValuesText, expectedAttributeValues);
88+
}
89+
}
90+
}
91+
}

RubberduckTests/Grammar/AnnotationTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
using NUnit.Framework;
22
using Rubberduck.Parsing.Annotations;
3-
using Rubberduck.VBEditor;
43
using RubberduckTests.Mocks;
54
using System;
6-
using System.Collections.Generic;
75
using System.Linq;
86

97
namespace RubberduckTests.Grammar

RubberduckTests/QuickFixes/AddMissingAttributeQuickFixTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,28 @@ Public Sub Foo()
5252
Assert.AreEqual(expectedCode, actualCode);
5353
}
5454

55+
[Test]
56+
[Category("QuickFixes")]
57+
//See issue #5268 at https://github.com/rubberduck-vba/Rubberduck/issues/5268
58+
public void MissingMemberAttribute_ExcelHotkey_QuickFixWorks()
59+
{
60+
const string inputCode =
61+
@"'@ExcelHotkey ""T""
62+
Public Sub Foo()
63+
Const const1 As Integer = 9
64+
End Sub";
65+
66+
const string expectedCode =
67+
@"'@ExcelHotkey ""T""
68+
Public Sub Foo()
69+
Attribute Foo.VB_ProcData.VB_Invoke_Func = ""T\n14""
70+
Const const1 As Integer = 9
71+
End Sub";
72+
73+
var actualCode = ApplyQuickFixToFirstInspectionResult(inputCode, state => new MissingAttributeInspection(state), CodeKind.AttributesCode);
74+
Assert.AreEqual(expectedCode, actualCode);
75+
}
76+
5577
[Test]
5678
[Category("QuickFixes")]
5779
public void MissingMemberAttributeOnConditionalCompilation_QuickFixWorks()

0 commit comments

Comments
 (0)