Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Nov 2, 2025

  • Understand the current MA0015 analyzer implementation
  • Extend analyzer to detect static Throw methods on ArgumentException and ArgumentNullException
  • Add tests for the new functionality
  • Update documentation
  • Fix code formatting
  • Run code review
  • Run security checks
  • Use CompilationStart to query types once (optimization)
  • Validate the paramName parameter when explicitly provided as second argument
  • Add tests for paramName validation
  • Refactor validation logic into separate methods for better code readability
  • Check CallerArgumentExpressionAttribute to find paramName parameter instead of assuming it's the second argument
  • Add null safety checks for AttributeClass and Parameter
  • Add support for ArgumentOutOfRangeException ThrowIf methods
  • Add tests for expression scenarios (null, boolean expressions)
  • Optimize registration to only register invocation action when CallerArgumentExpressionAttribute is available
  • Use IsEqualToAny for type checking
  • Move method name check to top for performance
  • Use GetAttribute instead of foreach loop
  • Rename ValidateFirstArgument to ValidateExpression and make it dynamic
  • Report error for expressions that don't match parameters
  • Add test for ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual with diagnostic
  • Remove unnecessary op parameter and simplify ValidateExpression logic

Changes in this commit:

  • Removed op parameter from ValidateExpression - now uses GetParameterNames(argument, ...) directly
  • Added UnwrapImplicitConversionOperations() to handle implicit conversions before checking operation type
  • Simplified logic: IParameterReferenceOperation is always valid (no validation needed)
  • Only validate member references against available parameter names
  • Clearer separation of concerns in the validation logic
Original prompt

This section details on the original issue you should resolve

<issue_title>MA0015 is not reported for static Throw methods on Argument(Null)Exception</issue_title>
<issue_description>### Version of the Meziantou.Analyzer NuGet package

2.0.235

Rule Identifier

MAA0015

Target Framework

.NET 9.0

C# Language version

4.14.0-3.25412.6 (c167adef)

Description

MA0015 is not reported for Argument(Null)Exception.ThrowIfNull*(...) while it's correctly reported if you use the constructors of Argument(Null)Exception.

Reproduction Steps

using System;

internal sealed class Program
{
    private static void Main(string[] args)
    {
        if (Name is null)
        {
            throw new ArgumentNullException(nameof(Name)); // OK
        }

        ArgumentNullException.ThrowIfNull(Name);  // MA0015 is not reported
        ArgumentNullException.ThrowIfNullOrEmpty(Name);  // MA0015 is not reported
        ArgumentNullException.ThrowIfNullOrWhiteSpace(Name); // MA0015 is not reported

        ArgumentException.ThrowIfNullOrWhiteSpace(Name); // MA0015 is not reported
        ArgumentException.ThrowIfNullOrEmpty(Name); // MA0015 is not reported
    }

    public static string Name { get; }
}

Other information

No response</issue_description>

Comments on the Issue (you are @copilot in this section)

@meziantou I agree the rule could be improved to support the new Throw methods. I'll mark it as `Help wanted` as I may not have time to work on it soon.

✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI changed the title [WIP] Fix MA0015 not reported for static Throw methods Fix MA0015 not detecting static ThrowIf methods on ArgumentException Nov 2, 2025
Copilot AI requested a review from meziantou November 2, 2025 01:34
Copilot finished work on behalf of meziantou November 2, 2025 01:34
@meziantou
Copy link
Owner

@copilot

  • Can you use CompilationStart to query types?
  • If ArgumentNullException.ThrowIfNull() has 2 arguments and the second one is not null, check the second one (string)

Copy link
Contributor Author

Copilot AI commented Nov 2, 2025

@copilot

  • Can you use CompilationStart to query types?
  • If ArgumentNullException.ThrowIfNull() has 2 arguments and the second one is not null, check the second one (string)

Done in commits 7251bb3 and d911bd2:

  1. ✅ Using RegisterCompilationStartAction to query types once at compilation start
  2. ✅ Validating the second argument (paramName) when it's explicitly provided and not null

The analyzer now:

  • Queries ArgumentException and ArgumentNullException types once at compilation start for better performance
  • When a second argument (paramName) is provided to ThrowIf methods, validates that string parameter instead of inferring from the first argument
  • Suggests using nameof operator when paramName is a valid parameter but passed as a string literal
  • Refactored validation logic into separate methods (ValidateParamNameArgument and ValidateFirstArgument) for better readability

Copilot finished work on behalf of meziantou November 2, 2025 02:16
Copilot AI requested a review from meziantou November 2, 2025 03:05
Copilot finished work on behalf of meziantou November 2, 2025 03:05
Copilot AI changed the title Fix MA0015 not detecting static ThrowIf methods on ArgumentException Fix MA0015 not detecting static ThrowIf methods on ArgumentException and related types Nov 2, 2025
Copilot AI requested a review from meziantou November 2, 2025 03:16
This was referenced Nov 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MA0015 is not reported for static Throw methods on Argument(Null)Exception

2 participants