Skip to content

Commit c7c23f2

Browse files
committed
Added checks for illegal annotations
1 parent 208c024 commit c7c23f2

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/DuplicatedAnnotationInspection.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
using System.Linq;
33
using Rubberduck.Inspections.Abstract;
44
using Rubberduck.Inspections.Results;
5+
using Rubberduck.Parsing.Annotations;
56
using Rubberduck.Parsing.Inspections.Abstract;
7+
using Rubberduck.Parsing.Symbols;
68
using Rubberduck.Parsing.VBA;
79
using Rubberduck.Resources.Inspections;
810

@@ -22,7 +24,11 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
2224
{
2325
var duplicateAnnotations = declaration.Annotations
2426
.GroupBy(annotation => annotation.AnnotationType)
25-
.Where(group => !group.First().AllowMultiple && group.Count() > 1);
27+
.Where(group => !group.First().AllowMultiple && group.Count() > 1 &&
28+
(group.Key.HasFlag(AnnotationType.ModuleAnnotation) &&
29+
declaration.DeclarationType.HasFlag(DeclarationType.Module) ||
30+
group.Key.HasFlag(AnnotationType.MemberAnnotation) &&
31+
declaration.DeclarationType.HasFlag(DeclarationType.Member)));
2632

2733
issues.AddRange(duplicateAnnotations.Select(duplicate => new DeclarationInspectionResult(
2834
this,

RubberduckTests/Inspections/DuplicatedAnnotationInspectionTests.cs

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ public class DuplicatedAnnotationInspectionTests
1414
public void AnnotationDuplicated_ReturnsResult()
1515
{
1616
const string inputCode = @"
17-
Public Sub Qux()
18-
End Sub
19-
2017
'@Obsolete
2118
'@Obsolete
2219
Public Sub Foo()
@@ -37,9 +34,6 @@ Public Sub Foo()
3734
public void AnnotationDuplicatedTwice_ReturnsSingleResult()
3835
{
3936
const string inputCode = @"
40-
Public Sub Qux()
41-
End Sub
42-
4337
'@Obsolete
4438
'@Obsolete
4539
'@Obsolete
@@ -61,9 +55,6 @@ Public Sub Foo()
6155
public void AnnotationNotDuplicated_DoesNotReturnResult()
6256
{
6357
const string inputCode = @"
64-
Public Sub Qux()
65-
End Sub
66-
6758
'@Obsolete
6859
Public Sub Foo()
6960
End Sub";
@@ -83,9 +74,6 @@ Public Sub Foo()
8374
public void AnnotationAllowingMultipleApplicationsDuplicated_DoesNotReturnResult()
8475
{
8576
const string inputCode = @"
86-
Public Sub Qux()
87-
End Sub
88-
8977
'@Ignore(Bar)
9078
'@Ignore(Baz)
9179
Public Sub Foo()
@@ -100,5 +88,51 @@ Public Sub Foo()
10088
Assert.AreEqual(0, inspectionResults.Count());
10189
}
10290
}
91+
92+
[Test]
93+
[Category("Inspections")]
94+
public void MemberAnnotationDuplicatedForModuleDeclaration_DoesNotReturnResult()
95+
{
96+
const string inputCode = @"
97+
'@TestInitialize
98+
'@TestInitialize
99+
100+
Public S as String
101+
102+
Public Sub Foo()
103+
End Sub";
104+
105+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
106+
using (var state = MockParser.CreateAndParse(vbe.Object))
107+
{
108+
var inspection = new DuplicatedAnnotationInspection(state);
109+
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
110+
111+
Assert.AreEqual(0, inspectionResults.Count());
112+
}
113+
}
114+
115+
[Test]
116+
[Category("Inspections")]
117+
public void ModuleAnnotationDuplicatedForMemberDeclaration_DoesNotReturnResult()
118+
{
119+
const string inputCode = @"
120+
Public Sub Foo()
121+
End Sub
122+
123+
'@Folder(Baz)
124+
'@Folder(Baz)
125+
Public Sub Bar()
126+
End Sub";
127+
128+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
129+
using (var state = MockParser.CreateAndParse(vbe.Object))
130+
{
131+
var inspection = new DuplicatedAnnotationInspection(state);
132+
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
133+
134+
Assert.AreEqual(0, inspectionResults.Count());
135+
}
136+
}
103137
}
104138
}

0 commit comments

Comments
 (0)