Skip to content

Commit 21251cf

Browse files
committed
Merge pull request #20 from sharwell/cleanup
Cleanup
2 parents 167d2f0 + 3cab6fb commit 21251cf

11 files changed

+304
-295
lines changed

OpenStackNetAnalyzers/OpenStackNetAnalyzers/AssertNullAnalyzer.cs

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,27 +64,10 @@ private void HandleInvocationExpression(SyntaxNodeAnalysisContext context)
6464
return;
6565

6666
TypeInfo typeInfo = context.SemanticModel.GetTypeInfo(argumentExpression);
67-
INamedTypeSymbol namedType = typeInfo.Type as INamedTypeSymbol;
68-
if (namedType == null)
67+
if (!typeInfo.Type.IsNonNullableValueType())
6968
return;
7069

71-
if (!namedType.IsValueType)
72-
{
73-
// don't report the diagnostic for reference types
74-
return;
75-
}
76-
77-
INamedTypeSymbol originalDefinition = namedType.OriginalDefinition;
78-
if (originalDefinition == null
79-
|| originalDefinition.SpecialType == SpecialType.System_Nullable_T
80-
|| originalDefinition.SpecialType == SpecialType.System_ValueType
81-
|| originalDefinition.SpecialType == SpecialType.System_Enum)
82-
{
83-
// don't report the diagnostic for "special" and nullable value types
84-
return;
85-
}
86-
87-
string typeName = namedType.ToMinimalDisplayString(context.SemanticModel, argumentExpression.SpanStart, SymbolDisplayFormat.CSharpErrorMessageFormat);
70+
string typeName = typeInfo.Type.ToMinimalDisplayString(context.SemanticModel, argumentExpression.SpanStart, SymbolDisplayFormat.CSharpErrorMessageFormat);
8871
context.ReportDiagnostic(Diagnostic.Create(Descriptor, syntax.GetLocation(), methodSymbol.Name, typeName));
8972
}
9073
}

OpenStackNetAnalyzers/OpenStackNetAnalyzers/DocumentDelegatingApiCallAnalyzer.cs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
namespace OpenStackNetAnalyzers
22
{
3-
using System;
43
using System.Collections.Immutable;
54
using System.Linq;
65
using Microsoft.CodeAnalysis;
@@ -40,7 +39,7 @@ private void HandleNamedType(SymbolAnalysisContext context)
4039
if (symbol.TypeKind != TypeKind.Class)
4140
return;
4241

43-
if (!IsDelegatingHttpApiCall(context, symbol))
42+
if (!symbol.IsDelegatingHttpApiCall())
4443
return;
4544

4645
if (!string.IsNullOrEmpty(symbol.GetDocumentationCommentXml(cancellationToken: context.CancellationToken)))
@@ -49,23 +48,5 @@ private void HandleNamedType(SymbolAnalysisContext context)
4948
var locations = symbol.Locations;
5049
context.ReportDiagnostic(Diagnostic.Create(Descriptor, locations.FirstOrDefault(), locations.Skip(1)));
5150
}
52-
53-
private bool IsDelegatingHttpApiCall(SymbolAnalysisContext context, INamedTypeSymbol symbol)
54-
{
55-
while (symbol != null && symbol.SpecialType != SpecialType.System_Object)
56-
{
57-
if (symbol.IsGenericType)
58-
{
59-
var originalDefinition = symbol.OriginalDefinition;
60-
string fullyQualifiedName = originalDefinition.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
61-
if (string.Equals("global::OpenStack.Net.DelegatingHttpApiCall<T>", fullyQualifiedName, StringComparison.Ordinal))
62-
return true;
63-
}
64-
65-
symbol = symbol.BaseType;
66-
}
67-
68-
return false;
69-
}
7051
}
7152
}

OpenStackNetAnalyzers/OpenStackNetAnalyzers/DocumentDelegatingApiCallCodeFix.cs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -252,23 +252,5 @@ private async Task<INamedTypeSymbol> GetServiceInterfaceAsync(CodeFixContext con
252252

253253
return null;
254254
}
255-
256-
private bool IsServiceInterface(SemanticModel semanticModel, INamedTypeSymbol symbol)
257-
{
258-
while (symbol != null && symbol.SpecialType != SpecialType.System_Object)
259-
{
260-
if (symbol.IsGenericType)
261-
{
262-
var originalDefinition = symbol.OriginalDefinition;
263-
string fullyQualifiedName = originalDefinition.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
264-
if (string.Equals("global::OpenStack.Net.DelegatingHttpApiCall<T>", fullyQualifiedName, StringComparison.Ordinal))
265-
return true;
266-
}
267-
268-
symbol = symbol.BaseType;
269-
}
270-
271-
return false;
272-
}
273255
}
274256
}

OpenStackNetAnalyzers/OpenStackNetAnalyzers/DocumentValueFromSummaryAnalyzer.cs

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -51,69 +51,17 @@ private void HandlePropertyDeclaration(SyntaxNodeAnalysisContext context)
5151
return;
5252

5353
INamedTypeSymbol declaringType = propertySymbol.ContainingType;
54-
if (!IsExtensibleJsonObject(declaringType))
54+
if (!declaringType.IsExtensibleJsonObject())
5555
return;
5656

57-
DocumentationCommentTriviaSyntax documentationTriviaSyntax = GetDocumentationCommentTriviaSyntax(syntax);
57+
DocumentationCommentTriviaSyntax documentationTriviaSyntax = syntax.GetDocumentationCommentTriviaSyntax();
5858
if (documentationTriviaSyntax == null)
5959
return;
6060

61-
XmlNodeSyntax valueNode = GetXmlElement(documentationTriviaSyntax.Content, "value");
62-
if (valueNode != null)
61+
if (documentationTriviaSyntax.Content.GetXmlElements("value").Any())
6362
return;
6463

6564
context.ReportDiagnostic(Diagnostic.Create(Descriptor, syntax.Identifier.GetLocation()));
6665
}
67-
68-
private bool IsExtensibleJsonObject(INamedTypeSymbol symbol)
69-
{
70-
while (symbol != null && symbol.SpecialType != SpecialType.System_Object)
71-
{
72-
if (string.Equals("global::OpenStack.ObjectModel.ExtensibleJsonObject", symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), StringComparison.Ordinal))
73-
return true;
74-
75-
symbol = symbol.BaseType;
76-
}
77-
78-
return false;
79-
}
80-
81-
internal static DocumentationCommentTriviaSyntax GetDocumentationCommentTriviaSyntax(SyntaxNode node)
82-
{
83-
if (node == null)
84-
return null;
85-
86-
return node
87-
.GetLeadingTrivia()
88-
.Select(i => i.GetStructure())
89-
.OfType<DocumentationCommentTriviaSyntax>()
90-
.FirstOrDefault();
91-
}
92-
93-
internal static XmlNodeSyntax GetXmlElement(SyntaxList<XmlNodeSyntax> content, string elementName)
94-
{
95-
foreach (XmlNodeSyntax syntax in content)
96-
{
97-
XmlEmptyElementSyntax emptyElement = syntax as XmlEmptyElementSyntax;
98-
if (emptyElement != null)
99-
{
100-
if (string.Equals(elementName, emptyElement.Name.ToString(), StringComparison.Ordinal))
101-
return emptyElement;
102-
103-
continue;
104-
}
105-
106-
XmlElementSyntax elementSyntax = syntax as XmlElementSyntax;
107-
if (elementSyntax != null)
108-
{
109-
if (string.Equals(elementName, elementSyntax.StartTag?.Name?.ToString(), StringComparison.Ordinal))
110-
return elementSyntax;
111-
112-
continue;
113-
}
114-
}
115-
116-
return null;
117-
}
11866
}
11967
}

OpenStackNetAnalyzers/OpenStackNetAnalyzers/DocumentValueFromSummaryCodeFix.cs

Lines changed: 6 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ public override async Task ComputeFixesAsync(CodeFixContext context)
5252

5353
private async Task<Document> CreateChangedDocument(CodeFixContext context, PropertyDeclarationSyntax propertyDeclarationSyntax, CancellationToken cancellationToken)
5454
{
55-
DocumentationCommentTriviaSyntax documentationComment = DocumentValueFromSummaryAnalyzer.GetDocumentationCommentTriviaSyntax(propertyDeclarationSyntax);
55+
DocumentationCommentTriviaSyntax documentationComment = propertyDeclarationSyntax.GetDocumentationCommentTriviaSyntax();
5656
if (documentationComment == null)
5757
return context.Document;
5858

59-
XmlElementSyntax summaryElement = (XmlElementSyntax)DocumentValueFromSummaryAnalyzer.GetXmlElement(documentationComment.Content, "summary");
59+
XmlElementSyntax summaryElement = (XmlElementSyntax)documentationComment.Content.GetFirstXmlElement("summary");
6060
if (summaryElement == null)
6161
return context.Document;
6262

@@ -111,15 +111,15 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Prope
111111
if (propertySymbol != null)
112112
{
113113
ITypeSymbol propertyType = propertySymbol.Type;
114-
if (string.Equals("ImmutableArray`1", propertyType?.MetadataName, StringComparison.Ordinal))
114+
if (propertyType.IsImmutableArray())
115115
defaultValueToken = "DefaultArrayIfNotIncluded";
116116
}
117117

118118
XmlElementSyntax valueElement =
119119
XmlSyntaxFactory.MultiLineElement(
120120
"value",
121121
XmlSyntaxFactory.List(
122-
XmlSyntaxFactory.ParaElement(XmlSyntaxFactory.PlaceholderElement(RemoveFirstAndListNewlines(summaryContent))),
122+
XmlSyntaxFactory.ParaElement(XmlSyntaxFactory.PlaceholderElement(summaryContent.WithoutFirstAndLastNewlines())),
123123
XmlSyntaxFactory.NewLine(),
124124
XmlSyntaxFactory.TokenElement(defaultValueToken)));
125125

@@ -131,8 +131,8 @@ private async Task<Document> CreateChangedDocument(CodeFixContext context, Prope
131131
SyntaxTrivia exteriorTrivia = GetLastDocumentationCommentExteriorTrivia(documentationComment);
132132
if (!exteriorTrivia.Token.IsMissing)
133133
{
134-
leadingNewLine = ReplaceExteriorTrivia(leadingNewLine, exteriorTrivia);
135-
valueElement = ReplaceExteriorTrivia(valueElement, exteriorTrivia);
134+
leadingNewLine = leadingNewLine.ReplaceExteriorTrivia(exteriorTrivia);
135+
valueElement = valueElement.ReplaceExteriorTrivia(exteriorTrivia);
136136
}
137137

138138
DocumentationCommentTriviaSyntax newDocumentationComment = documentationComment.WithContent(
@@ -168,142 +168,5 @@ private SyntaxTrivia GetLastDocumentationCommentExteriorTrivia(SyntaxNode node)
168168
.Where(trivia => trivia.IsKind(SyntaxKind.DocumentationCommentExteriorTrivia))
169169
.LastOrDefault();
170170
}
171-
172-
private T ReplaceExteriorTrivia<T>(T node, SyntaxTrivia trivia)
173-
where T : SyntaxNode
174-
{
175-
// Make sure to include a space after the '///' characters.
176-
SyntaxTrivia triviaWithSpace = SyntaxFactory.DocumentationCommentExterior(trivia.ToString() + " ");
177-
178-
return node.ReplaceTrivia(
179-
node.DescendantTrivia(descendIntoTrivia: true).Where(i => i.IsKind(SyntaxKind.DocumentationCommentExteriorTrivia)),
180-
(originalTrivia, rewrittenTrivia) => SelectExteriorTrivia(rewrittenTrivia, trivia, triviaWithSpace));
181-
}
182-
183-
private SyntaxTrivia SelectExteriorTrivia(SyntaxTrivia rewrittenTrivia, SyntaxTrivia trivia, SyntaxTrivia triviaWithSpace)
184-
{
185-
// if the trivia had a trailing space, make sure to preserve it
186-
if (rewrittenTrivia.ToString().EndsWith(" "))
187-
return triviaWithSpace;
188-
189-
// otherwise the space is part of the leading trivia of the following token, so don't add an extra one to
190-
// the exterior trivia
191-
return trivia;
192-
}
193-
194-
private SyntaxList<XmlNodeSyntax> RemoveFirstAndListNewlines(SyntaxList<XmlNodeSyntax> summaryContent)
195-
{
196-
if (summaryContent.Count == 0)
197-
return summaryContent;
198-
199-
XmlTextSyntax firstSyntax = summaryContent[0] as XmlTextSyntax;
200-
if (firstSyntax == null)
201-
return summaryContent;
202-
203-
XmlTextSyntax lastSyntax = summaryContent[summaryContent.Count - 1] as XmlTextSyntax;
204-
if (lastSyntax == null)
205-
return summaryContent;
206-
207-
SyntaxTokenList firstSyntaxTokens = firstSyntax.TextTokens;
208-
209-
int removeFromStart;
210-
if (IsNewLine(firstSyntaxTokens[0]))
211-
{
212-
removeFromStart = 1;
213-
}
214-
else
215-
{
216-
if (!IsWhitespace(firstSyntaxTokens[0]))
217-
return summaryContent;
218-
219-
if (!IsNewLine(firstSyntaxTokens[1]))
220-
return summaryContent;
221-
222-
removeFromStart = 2;
223-
}
224-
225-
SyntaxTokenList lastSyntaxTokens = lastSyntax.TextTokens;
226-
227-
int removeFromEnd;
228-
if (IsNewLine(lastSyntaxTokens[lastSyntaxTokens.Count - 1]))
229-
{
230-
removeFromEnd = 1;
231-
}
232-
else
233-
{
234-
if (!IsWhitespace(lastSyntaxTokens[lastSyntaxTokens.Count - 1]))
235-
return summaryContent;
236-
237-
if (!IsNewLine(lastSyntaxTokens[lastSyntaxTokens.Count - 2]))
238-
return summaryContent;
239-
240-
removeFromEnd = 2;
241-
}
242-
243-
for (int i = 0; i < removeFromStart; i++)
244-
{
245-
firstSyntaxTokens = firstSyntaxTokens.RemoveAt(0);
246-
}
247-
248-
if (firstSyntax == lastSyntax)
249-
{
250-
lastSyntaxTokens = firstSyntaxTokens;
251-
}
252-
253-
for (int i = 0; i < removeFromEnd; i++)
254-
{
255-
lastSyntaxTokens = lastSyntaxTokens.RemoveAt(lastSyntaxTokens.Count - 1);
256-
}
257-
258-
summaryContent = summaryContent.RemoveAt(summaryContent.Count - 1);
259-
if (lastSyntaxTokens.Count != 0)
260-
summaryContent = summaryContent.Add(lastSyntax.WithTextTokens(lastSyntaxTokens));
261-
262-
if (firstSyntax != lastSyntax)
263-
{
264-
summaryContent = summaryContent.RemoveAt(0);
265-
if (firstSyntaxTokens.Count != 0)
266-
summaryContent = summaryContent.Insert(0, firstSyntax.WithTextTokens(firstSyntaxTokens));
267-
}
268-
269-
if (summaryContent.Count > 0)
270-
{
271-
// Make sure to remove the leading trivia
272-
summaryContent = summaryContent.Replace(summaryContent[0], summaryContent[0].WithLeadingTrivia());
273-
274-
// Remove leading spaces (between the <para> start tag and the start of the paragraph content)
275-
XmlTextSyntax firstTextSyntax = summaryContent[0] as XmlTextSyntax;
276-
if (firstTextSyntax != null && firstTextSyntax.TextTokens.Count > 0)
277-
{
278-
SyntaxToken firstTextToken = firstTextSyntax.TextTokens[0];
279-
string firstTokenText = firstTextToken.Text;
280-
string trimmed = firstTokenText.TrimStart();
281-
if (trimmed != firstTokenText)
282-
{
283-
SyntaxToken newFirstToken = SyntaxFactory.Token(
284-
firstTextToken.LeadingTrivia,
285-
firstTextToken.CSharpKind(),
286-
trimmed,
287-
firstTextToken.ValueText.TrimStart(),
288-
firstTextToken.TrailingTrivia);
289-
290-
summaryContent = summaryContent.Replace(firstTextSyntax, firstTextSyntax.ReplaceToken(firstTextToken, newFirstToken));
291-
}
292-
}
293-
}
294-
295-
return summaryContent;
296-
}
297-
298-
private bool IsNewLine(SyntaxToken node)
299-
{
300-
return node.IsKind(SyntaxKind.XmlTextLiteralNewLineToken);
301-
}
302-
303-
private bool IsWhitespace(SyntaxToken node)
304-
{
305-
return node.IsKind(SyntaxKind.XmlTextLiteralToken)
306-
&& string.IsNullOrWhiteSpace(node.Text);
307-
}
308171
}
309172
}

0 commit comments

Comments
 (0)