Skip to content

Commit a17efab

Browse files
committed
Refactor and clean up SA1612
1 parent 43c128d commit a17efab

1 file changed

Lines changed: 42 additions & 22 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/SA1612ElementParameterDocumentationMustMatchElementParameters.cs

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,38 @@ protected override void HandleXmlElement(SyntaxNodeAnalysisContext context, IEnu
7878
return;
7979
}
8080

81-
var xmlParameterNames = syntaxList
82-
.Select(XmlCommentHelper.GetFirstAttributeOrDefault<XmlNameAttributeSyntax>)
83-
.Select(x => new Tuple<string, Location>(x?.Identifier?.Identifier.ValueText, x?.Identifier.GetLocation()))
84-
.ToImmutableArray();
81+
var parentParameters = parameterList.Value;
8582

86-
VerifyParameters(context, parameterList.Value, xmlParameterNames, identifierLocation);
83+
var index = 0;
84+
foreach (var syntax in syntaxList)
85+
{
86+
var nameAttributeSyntax = XmlCommentHelper.GetFirstAttributeOrDefault<XmlNameAttributeSyntax>(syntax);
87+
var nameAttributeText = nameAttributeSyntax?.Identifier?.Identifier.ValueText;
88+
var location = nameAttributeSyntax?.Identifier?.Identifier.GetLocation();
89+
90+
// Make sure we ignore violations that should be reported by SA1613 instead.
91+
if (string.IsNullOrWhiteSpace(nameAttributeText))
92+
{
93+
return;
94+
}
95+
96+
var parentParameter = parentParameters.FirstOrDefault(s => s.Identifier.Text == nameAttributeText);
97+
if (parentParameter == null)
98+
{
99+
context.ReportDiagnostic(Diagnostic.Create(MissingParameterDescriptor, location ?? identifierLocation, nameAttributeText));
100+
}
101+
else if (parentParameters.Length <= index || parentParameters[index] != parentParameter)
102+
{
103+
context.ReportDiagnostic(
104+
Diagnostic.Create(
105+
OrderDescriptor,
106+
location ?? identifierLocation,
107+
nameAttributeText,
108+
parentParameters.IndexOf(parentParameter) + 1));
109+
}
110+
111+
index++;
112+
}
87113
}
88114

89115
/// <inheritdoc/>
@@ -108,41 +134,35 @@ protected override void HandleCompleteDocumentation(SyntaxNodeAnalysisContext co
108134
}
109135

110136
// We are working with an <include> element
111-
var xmlParameterNames = completeDocumentation.Nodes()
137+
var xmlParamTags = completeDocumentation.Nodes()
112138
.OfType<XElement>()
113-
.Where(e => e.Name == XmlCommentHelper.ParamXmlTag)
114-
.SelectMany(p => p.Attributes().Where(a => a.Name == "name"))
115-
.Select(a => new Tuple<string, Location>(a.Value, null))
116-
.ToImmutableArray();
139+
.Where(e => e.Name == XmlCommentHelper.ParamXmlTag);
117140

118-
VerifyParameters(context, parameterList.Value, xmlParameterNames, identifierLocation);
119-
}
141+
var parentParameters = parameterList.Value;
120142

121-
private static void VerifyParameters(SyntaxNodeAnalysisContext context, ImmutableArray<ParameterSyntax> parentParameters, ImmutableArray<Tuple<string, Location>> documentationParameters, Location identifierLocation)
122-
{
123143
var index = 0;
124-
125-
foreach (var documentedParameter in documentationParameters)
144+
foreach (var paramTag in xmlParamTags)
126145
{
146+
var nameAttributeText = paramTag.Attributes().FirstOrDefault(a => a.Name == "name")?.Value;
147+
127148
// Make sure we ignore violations that should be reported by SA1613 instead.
128-
if (string.IsNullOrWhiteSpace(documentedParameter.Item1))
149+
if (string.IsNullOrWhiteSpace(nameAttributeText))
129150
{
130151
return;
131152
}
132153

133-
var parentParameter = parentParameters.FirstOrDefault(s => s.Identifier.Text == documentedParameter.Item1);
134-
154+
var parentParameter = parentParameters.FirstOrDefault(s => s.Identifier.Text == nameAttributeText);
135155
if (parentParameter == null)
136156
{
137-
context.ReportDiagnostic(Diagnostic.Create(MissingParameterDescriptor, documentedParameter.Item2 ?? identifierLocation, documentedParameter.Item1));
157+
context.ReportDiagnostic(Diagnostic.Create(MissingParameterDescriptor, identifierLocation, nameAttributeText));
138158
}
139159
else if (parentParameters.Length <= index || parentParameters[index] != parentParameter)
140160
{
141161
context.ReportDiagnostic(
142162
Diagnostic.Create(
143163
OrderDescriptor,
144-
documentedParameter.Item2 ?? identifierLocation,
145-
documentedParameter.Item1,
164+
identifierLocation,
165+
nameAttributeText,
146166
parentParameters.IndexOf(parentParameter) + 1));
147167
}
148168

0 commit comments

Comments
 (0)