Skip to content

Commit

Permalink
[v2] Fix issues from static analysis
Browse files Browse the repository at this point in the history
  • Loading branch information
henrikfroehling committed Aug 12, 2024
1 parent 2fd0f4f commit 3300dd1
Show file tree
Hide file tree
Showing 12 changed files with 71 additions and 85 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace TraktNET
{
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
internal sealed class TraktRequestParameter() : Attribute
internal sealed class TraktRequestParameterAttribute() : Attribute
{
public bool UseCacheEfficientDateTime { get; set; }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace TraktNET
{
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
internal sealed class TraktRequestQuery(string? queryName = null) : Attribute
internal sealed class TraktRequestQueryAttribute(string? queryName = null) : Attribute
{
public string? QueryName { get; } = queryName;

Expand Down
2 changes: 1 addition & 1 deletion src/libs/Trakt.NET/Internal/Contexts/TraktContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public static TraktContext CreateForSandbox(string clientID, string clientSecret

internal HttpClientProvider HttpClientProvider { get; set; }

internal TraktContext(string clientID, string clientSecret)
protected TraktContext(string clientID, string clientSecret)
{
ID = Guid.NewGuid().ToString();
ClientID = clientID;
Expand Down
10 changes: 9 additions & 1 deletion src/libs/Trakt.NET/Internal/Requests/RequestErrorHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace TraktNET
{
internal sealed partial class RequestHandler
internal static partial class RequestHandler
{
private static async Task HandleErrorAsync(RequestBase request, HttpResponseMessage responseMessage, TraktResponseHeaders traktHeaders,
bool isInAuthorizationPolling, CancellationToken cancellationToken = default)
Expand Down Expand Up @@ -129,6 +129,10 @@ private static async Task HandleConflictErrorAsync(ExceptionParameters parameter
}
catch
{
// Exception handling while handling an API exception is not considered.
// This might change in the future, but for now just catch any exceptions.
// In this case these might be JsonException or ArgumentNullException.
// In either case the content is not valid.
}
}

Expand Down Expand Up @@ -158,6 +162,10 @@ private static async Task HandleRateLimitErrorAsync(ExceptionParameters paramete
}
catch
{
// Exception handling while handling an API exception is not considered.
// This might change in the future, but for now just catch any exceptions.
// In this case these might be JsonException or ArgumentNullException.
// In either case the content is not valid.
}
}

Expand Down
9 changes: 7 additions & 2 deletions src/libs/Trakt.NET/Internal/Requests/RequestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace TraktNET
{
internal sealed partial class RequestHandler
internal static partial class RequestHandler
{
internal static async Task<TraktResponse<TResponseContentType>> ExecuteSingleItemRequestAsync<TResponseContentType>(
TraktContext context, RequestBase request, CancellationToken cancellationToken = default)
Expand Down Expand Up @@ -54,7 +54,11 @@ private static async Task<RequestResponse> ExecuteRequestAsync(TraktContext cont
await HandleErrorAsync(request, responseMessage, traktHeaders, false, cancellationToken).ConfigureAwait(false);
}

#if NET5_0_OR_GREATER
Stream responseContentStream = await GetResponseContentStreamAsync(responseMessage, cancellationToken).ConfigureAwait(false);
#else
Stream responseContentStream = await GetResponseContentStreamAsync(responseMessage).ConfigureAwait(false);
#endif

return new RequestResponse
{
Expand Down Expand Up @@ -87,10 +91,11 @@ private static void AddRequestMessageHeaders(TraktContext context, RequestBase r
request.Headers.Authorization = new AuthenticationHeaderValue(AuthenticationScheme, context.Authorization!.AccessToken ?? string.Empty);
}

private static Task<Stream> GetResponseContentStreamAsync(HttpResponseMessage responseMessage, CancellationToken cancellationToken = default)
#if NET5_0_OR_GREATER
private static Task<Stream> GetResponseContentStreamAsync(HttpResponseMessage responseMessage, CancellationToken cancellationToken = default)
=> responseMessage.Content.ReadAsStreamAsync(cancellationToken);
#else
private static Task<Stream> GetResponseContentStreamAsync(HttpResponseMessage responseMessage)
=> responseMessage.Content.ReadAsStreamAsync();
#endif
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace TraktNET
{
internal sealed partial class RequestHandler
internal static partial class RequestHandler
{
private static TraktResponseHeaders ParseTraktResponseHeaders(HttpResponseHeaders responseHeaders)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ namespace TraktNET.SourceGeneration.Enums
public sealed class TraktEnumSourceGenerator : IIncrementalGenerator
{
private IncrementalValueProvider<KnownEnumSymbols> _knownEnumTypeSymbols;
private IncrementalValuesProvider<EnumGenerationSpecificationTuple> _enumGenerationSpecifications;

public void Initialize(IncrementalGeneratorInitializationContext context)
{
_knownEnumTypeSymbols = context.CompilationProvider.Select(static (compilation, _) => new KnownEnumSymbols(compilation));
_enumGenerationSpecifications = CombineAndSelectEnumsWithAttribute(context);
context.RegisterSourceOutput(_enumGenerationSpecifications, ReportDiagnosticsAndEmitSource);

IncrementalValuesProvider<EnumGenerationSpecificationTuple> enumGenerationSpecifications =
CombineAndSelectEnumsWithAttribute(context);

context.RegisterSourceOutput(enumGenerationSpecifications, ReportDiagnosticsAndEmitSource);
}

private IncrementalValuesProvider<EnumGenerationSpecificationTuple> CombineAndSelectEnumsWithAttribute(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ private void GetEnumSymbolAndLocation(EnumDeclarationSyntax enumDeclaration, Sem
_enumDeclarationSymbol = (INamedTypeSymbol?)semanticModel.GetDeclaredSymbol(enumDeclaration, cancellationToken);
Debug.Assert(_enumDeclarationSymbol != null);

if (_enumDeclarationSymbol != null && _enumDeclarationSymbol.Locations.Length > 0)
if (_enumDeclarationSymbol?.Locations.Length > 0)

Check warning on line 69 in src/tools/sourcegeneration/Trakt.NET.SourceGeneration/Enums/Parser/TraktEnumDeclarationParser.cs

View workflow job for this annotation

GitHub Actions / v2-alpha / SonarCloud

Remove this unnecessary check for null. (https://rules.sonarsource.com/csharp/RSPEC-2589)

Check warning on line 69 in src/tools/sourcegeneration/Trakt.NET.SourceGeneration/Enums/Parser/TraktEnumDeclarationParser.cs

View workflow job for this annotation

GitHub Actions / v2-alpha-httpclientfactory / SonarCloud

Remove this unnecessary check for null. (https://rules.sonarsource.com/csharp/RSPEC-2589)
{
_enumDeclarationLocation = _enumDeclarationSymbol.Locations[0];
}
Expand All @@ -85,39 +85,33 @@ private bool ParseEnumAttributes(INamedTypeSymbol enumTypeSymbol, CancellationTo
if (SymbolEqualityComparer.Default.Equals(attributeClass, _knownEnumSymbols.SystemFlagsAttributeType))
{
_hasFlagsAttribute = true;
}
}
else if (SymbolEqualityComparer.Default.Equals(attributeClass, _knownEnumSymbols.TraktEnumAttributeType))
{
var namedArguments = attributeData.NamedArguments.ToImmutableDictionary();

if (namedArguments.TryGetValue(EnumConstants.TraktEnumPropertyQueryName, out TypedConstant queryNameConstant))
if (namedArguments.TryGetValue(EnumConstants.TraktEnumPropertyQueryName, out TypedConstant queryNameConstant)
&& queryNameConstant.Value is string queryName)
{
if (queryNameConstant.Value is string queryName)
if (string.IsNullOrEmpty(queryName))
{
if (string.IsNullOrEmpty(queryName))
{
ReportDiagnostic(DiagnosticDescriptors.InvalidQueryNameValue);
return false;
}

_queryName = queryName;
ReportDiagnostic(DiagnosticDescriptors.InvalidQueryNameValue);
return false;
}

_queryName = queryName;
}

if (namedArguments.TryGetValue(EnumConstants.TraktEnumPropertyHasPathSupport, out TypedConstant hasPathSupportConstant))
if (namedArguments.TryGetValue(EnumConstants.TraktEnumPropertyHasPathSupport, out TypedConstant hasPathSupportConstant)
&& hasPathSupportConstant.Value is bool hasPathSupport)
{
if (hasPathSupportConstant.Value is bool hasPathSupport)
{
_hasPathSupport = hasPathSupport;
}
_hasPathSupport = hasPathSupport;
}

if (namedArguments.TryGetValue(EnumConstants.TraktEnumPropertyHasQuerySupport, out TypedConstant hasQuerySupportConstant))
if (namedArguments.TryGetValue(EnumConstants.TraktEnumPropertyHasQuerySupport, out TypedConstant hasQuerySupportConstant)
&& hasQuerySupportConstant.Value is bool hasQuerySupport)
{
if (hasQuerySupportConstant.Value is bool hasQuerySupport)
{
_hasQuerySupport = hasQuerySupport;
}
_hasQuerySupport = hasQuerySupport;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,12 @@ namespace TraktNET.SourceGeneration.Models
public Location? Location { get; private init; }

public static DiagnosticInfo Create(DiagnosticDescriptor descriptor, Location? location)
{
Location? trimmedLocation = location == null ? null : GetTrimmedLocation(location);

return new DiagnosticInfo
=> new()
{
Descriptor = descriptor,
Location = location
};

static Location? GetTrimmedLocation(Location location)
=> Location.Create(location.SourceTree?.FilePath ?? string.Empty, location.SourceSpan, location.GetLineSpan().Span);
}

public Diagnostic CreateDiagnostic() => Diagnostic.Create(Descriptor, Location);

public override bool Equals(object obj) => obj is DiagnosticInfo diagnosticInfo && Equals(diagnosticInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,12 +167,10 @@ private bool ParseRequestProperty(IPropertySymbol propertySymbol, ImmutableArray

var namedArguments = attributeData.NamedArguments.ToImmutableDictionary();

if (namedArguments.TryGetValue(RequestConstants.TraktRequestParameterOrQueryUseCacheEfficientDateTimeName, out TypedConstant useCacheEfficientDateTimeConstant))
if (namedArguments.TryGetValue(RequestConstants.TraktRequestParameterOrQueryUseCacheEfficientDateTimeName, out TypedConstant useCacheEfficientDateTimeConstant)
&& useCacheEfficientDateTimeConstant.Value is bool useCacheEfficientDateTimeValue)
{
if (useCacheEfficientDateTimeConstant.Value is bool useCacheEfficientDateTimeValue)
{
useCacheEfficientDateTime = useCacheEfficientDateTimeValue;
}
useCacheEfficientDateTime = useCacheEfficientDateTimeValue;
}
}
else if (SymbolEqualityComparer.Default.Equals(attributeClass, _knownRequestSymbols.TraktRequestQueryAttributeType))
Expand All @@ -199,12 +197,10 @@ private bool ParseRequestProperty(IPropertySymbol propertySymbol, ImmutableArray

var namedArguments = attributeData.NamedArguments.ToImmutableDictionary();

if (namedArguments.TryGetValue(RequestConstants.TraktRequestParameterOrQueryUseCacheEfficientDateTimeName, out TypedConstant useCacheEfficientDateTimeConstant))
if (namedArguments.TryGetValue(RequestConstants.TraktRequestParameterOrQueryUseCacheEfficientDateTimeName, out TypedConstant useCacheEfficientDateTimeConstant)
&& useCacheEfficientDateTimeConstant.Value is bool useCacheEfficientDateTimeValue)
{
if (useCacheEfficientDateTimeConstant.Value is bool useCacheEfficientDateTimeValue)
{
useCacheEfficientDateTime = useCacheEfficientDateTimeValue;
}
useCacheEfficientDateTime = useCacheEfficientDateTimeValue;
}
}
}
Expand Down Expand Up @@ -342,7 +338,7 @@ private void GetClassSymbolAndLocation(ClassDeclarationSyntax classDeclaration,
_requestClassDeclarationSymbol = semanticModel.GetDeclaredSymbol(classDeclaration, cancellationToken);
Debug.Assert(_requestClassDeclarationSymbol != null);

if (_requestClassDeclarationSymbol != null && _requestClassDeclarationSymbol.Locations.Length > 0)
if (_requestClassDeclarationSymbol?.Locations.Length > 0)

Check warning on line 341 in src/tools/sourcegeneration/Trakt.NET.SourceGeneration/Requests/Parser/TraktRequestParser.cs

View workflow job for this annotation

GitHub Actions / v2-alpha / SonarCloud

Remove this unnecessary check for null. (https://rules.sonarsource.com/csharp/RSPEC-2589)

Check warning on line 341 in src/tools/sourcegeneration/Trakt.NET.SourceGeneration/Requests/Parser/TraktRequestParser.cs

View workflow job for this annotation

GitHub Actions / v2-alpha-httpclientfactory / SonarCloud

Remove this unnecessary check for null. (https://rules.sonarsource.com/csharp/RSPEC-2589)
{
_requestClassDeclarationLocation = _requestClassDeclarationSymbol.Locations[0];
}
Expand All @@ -369,42 +365,34 @@ private bool ParseRequestAttribute(AttributeData attributeData, Location? attrib

var namedArguments = attributeData.NamedArguments.ToImmutableDictionary();

if (_knownRequestSymbols.TraktExtendedInfoEnumType != null)
if (_knownRequestSymbols.TraktExtendedInfoEnumType != null
&& namedArguments.TryGetValue(RequestConstants.TraktRequestPropertySupportsExtendedInfoName, out TypedConstant supportsExtendedInfoConstant)
&& supportsExtendedInfoConstant.Value is bool supportsExtendedInfo)
{
if (namedArguments.TryGetValue(RequestConstants.TraktRequestPropertySupportsExtendedInfoName, out TypedConstant supportsExtendedInfoConstant))
{
if (supportsExtendedInfoConstant.Value is bool supportsExtendedInfo)
{
_requestSupportsExtendedInfo = supportsExtendedInfo;
}
}
_requestSupportsExtendedInfo = supportsExtendedInfo;
}

if (namedArguments.TryGetValue(RequestConstants.TraktRequestPropertySupportsPaginationName, out TypedConstant supportsPaginationConstant))
if (namedArguments.TryGetValue(RequestConstants.TraktRequestPropertySupportsPaginationName, out TypedConstant supportsPaginationConstant)
&& supportsPaginationConstant.Value is bool supportsPagination)
{
if (supportsPaginationConstant.Value is bool supportsPagination)
{
_requestSupportsPagination = supportsPagination;
}
_requestSupportsPagination = supportsPagination;
}

if (_knownRequestSymbols.TraktOAuthRequirementEnumType != null)
{
if (namedArguments.TryGetValue(RequestConstants.TraktRequestPropertyOAuthRequirementName, out TypedConstant oauthRequirementConstant))
{
if (SymbolEqualityComparer.Default.Equals(oauthRequirementConstant.Type, _knownRequestSymbols.TraktOAuthRequirementEnumType))
if (SymbolEqualityComparer.Default.Equals(oauthRequirementConstant.Type, _knownRequestSymbols.TraktOAuthRequirementEnumType)
&& oauthRequirementConstant.Value is int requirementValue)
{
if (oauthRequirementConstant.Value is int requirementValue)
{
_requestHasOAuthRequirementDefined = _knownRequestSymbols.TraktOAuthRequirementValues.Count > 0;

IFieldSymbol? enumField = _knownRequestSymbols.TraktOAuthRequirementValues
.FirstOrDefault(x => x.ConstantValue is int enumValue && enumValue == requirementValue);
_requestHasOAuthRequirementDefined = _knownRequestSymbols.TraktOAuthRequirementValues.Count > 0;

if (enumField != null)
{
_requestOAuthRequirementValue = enumField.Name;
}
IFieldSymbol? enumField = _knownRequestSymbols.TraktOAuthRequirementValues
.FirstOrDefault(x => x.ConstantValue is int enumValue && enumValue == requirementValue);

if (enumField != null)
{
_requestOAuthRequirementValue = enumField.Name;
}
}
}
Expand Down Expand Up @@ -436,12 +424,10 @@ private sealed class AttributeHttpMethodCollector : CSharpSyntaxWalker

public override void VisitPrimaryConstructorBaseType(PrimaryConstructorBaseTypeSyntax node)
{
if (node.Type.ToString() == RequestConstants.TraktRequestAttributeName)
if (node.Type.ToString() == RequestConstants.TraktRequestAttributeName
&& node.ArgumentList.Arguments[0].Expression is MemberAccessExpressionSyntax httpMethodArgument)
{
if (node.ArgumentList.Arguments[0].Expression is MemberAccessExpressionSyntax httpMethodArgument)
{
HttpMethod = httpMethodArgument.Name.ToString();
}
HttpMethod = httpMethodArgument.Name.ToString();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ internal static class RequestConstants

internal const string TraktExtendedInfoName = "TraktExtendedInfo";

internal const string TraktRequestParameterAttributeName = "TraktRequestParameter";
internal const string TraktRequestParameterAttributeName = "TraktRequestParameterAttribute";

internal const string TraktRequestQueryAttributeName = "TraktRequestQuery";
internal const string TraktRequestQueryAttributeName = "TraktRequestQueryAttribute";

internal const string FullTraktExtendedInfoName = Constants.LibraryNamespace + "." + TraktExtendedInfoName;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,7 @@ private void WriteBuildUriMethod()
if (_hasOptionalQueries)
{
_sourceWriter.WriteEmptyLine();

if (_requestQueries.Count == 1)
{
WriteGetQueriesEntry(_requestQueries[0], writeDirectlyInBuildMethod: true);
Expand All @@ -800,7 +800,7 @@ private void WriteBuildUriMethod()
_sourceWriter.WriteLine($"RequestUri = new Uri({RequestUriName}, UriKind.Relative);");
}
else
{
{
_sourceWriter.WriteLine($"string {RequestUriName} = $\"{_resolvedUriPath}\";");
_sourceWriter.WriteLine($"RequestUri = new Uri({RequestUriName}, UriKind.Relative);");
}
Expand Down Expand Up @@ -947,7 +947,6 @@ private void ParseRequestUri()
});

placeHolderName = string.Empty;
placeHolderType = string.Empty;

hasQuesionMark = false;
exclamationMarkCount = 0;
Expand Down Expand Up @@ -1012,7 +1011,6 @@ private void ParseRequestUri()
});

placeHolderName = string.Empty;
placeHolderType = string.Empty;

break;
default:
Expand Down

0 comments on commit 3300dd1

Please sign in to comment.