Skip to content

Commit 0f9b281

Browse files
committed
Fix failing test for property
1 parent 25c0a0c commit 0f9b281

2 files changed

Lines changed: 20 additions & 6 deletions

File tree

IntelliTect.Analyzer/IntelliTect.Analyzer.Test/DateTimeConversionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void Main(string[] args)
200200
Id = "INTL0202",
201201
Severity = DiagnosticSeverity.Warning,
202202
Message = "Using the symbol 'DateTimeOffset.implicit operator DateTimeOffset(DateTime)' can result in unpredictable behavior",
203-
Locations = [new DiagnosticResultLocation("Test0.cs", 15, 36)]
203+
Locations = [new DiagnosticResultLocation("Test0.cs", 14, 36)]
204204
}
205205
);
206206
}

IntelliTect.Analyzer/IntelliTect.Analyzer/Analyzers/BanImplicitDateTimeToDateTimeOffsetConversion.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Immutable;
3+
using System.Linq;
34
using Microsoft.CodeAnalysis;
45
using Microsoft.CodeAnalysis.Diagnostics;
56
using Microsoft.CodeAnalysis.Operations;
@@ -33,22 +34,35 @@ public override void Initialize(AnalysisContext context)
3334

3435
private void AnalyzeInvocation(OperationAnalysisContext context)
3536
{
36-
if (context.Operation is not IConversionOperation conversionOperation)
37+
if (context.Operation is not IConversionOperation conversionOperation || !conversionOperation.Conversion.IsImplicit)
3738
{
3839
return;
3940
}
4041

41-
if (conversionOperation.Conversion.IsImplicit && conversionOperation.Conversion.MethodSymbol is object && conversionOperation.Conversion.MethodSymbol.ContainingType is object)
42+
if (conversionOperation.Conversion.MethodSymbol is object && conversionOperation.Conversion.MethodSymbol.ContainingType is object)
4243
{
4344
INamedTypeSymbol containingType = conversionOperation.Conversion.MethodSymbol.ContainingType;
44-
INamedTypeSymbol dateTimeOffsetType = context.Compilation.GetTypeByMetadataName("System.DateTimeOffset");
45-
if (SymbolEqualityComparer.Default.Equals(containingType, dateTimeOffsetType))
45+
if (IsDateTimeOffsetSymbol(context, containingType))
4646
{
4747
context.ReportDiagnostic(Diagnostic.Create(_Rule202, conversionOperation.Syntax.GetLocation()));
4848
}
4949
}
50+
else
51+
{
52+
bool hasImplicitArg = conversionOperation.Operand.ChildOperations
53+
.Where(op => op.Kind == OperationKind.Argument && IsDateTimeOffsetSymbol(context, ((IArgumentOperation)op).Value.Type))
54+
.Any();
55+
if (hasImplicitArg)
56+
{
57+
context.ReportDiagnostic(Diagnostic.Create(_Rule202, conversionOperation.Syntax.GetLocation()));
58+
}
59+
}
60+
}
5061

51-
62+
private static bool IsDateTimeOffsetSymbol(OperationAnalysisContext context, ITypeSymbol symbol)
63+
{
64+
INamedTypeSymbol dateTimeOffsetType = context.Compilation.GetTypeByMetadataName("System.DateTimeOffset");
65+
return SymbolEqualityComparer.Default.Equals(symbol, dateTimeOffsetType);
5266
}
5367

5468
private static class Rule202

0 commit comments

Comments
 (0)