|
1 | 1 | using System; |
2 | 2 | using System.Collections.Immutable; |
| 3 | +using System.Linq; |
3 | 4 | using Microsoft.CodeAnalysis; |
4 | 5 | using Microsoft.CodeAnalysis.Diagnostics; |
5 | 6 | using Microsoft.CodeAnalysis.Operations; |
@@ -33,22 +34,35 @@ public override void Initialize(AnalysisContext context) |
33 | 34 |
|
34 | 35 | private void AnalyzeInvocation(OperationAnalysisContext context) |
35 | 36 | { |
36 | | - if (context.Operation is not IConversionOperation conversionOperation) |
| 37 | + if (context.Operation is not IConversionOperation conversionOperation || !conversionOperation.Conversion.IsImplicit) |
37 | 38 | { |
38 | 39 | return; |
39 | 40 | } |
40 | 41 |
|
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) |
42 | 43 | { |
43 | 44 | 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)) |
46 | 46 | { |
47 | 47 | context.ReportDiagnostic(Diagnostic.Create(_Rule202, conversionOperation.Syntax.GetLocation())); |
48 | 48 | } |
49 | 49 | } |
| 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 | + } |
50 | 61 |
|
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); |
52 | 66 | } |
53 | 67 |
|
54 | 68 | private static class Rule202 |
|
0 commit comments