Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor SetupShouldOnlyBeUsedForOverridableMembersAnalyzer to IOperation #340

Conversation

rjmurillo
Copy link
Owner

@rjmurillo rjmurillo commented Jan 31, 2025

Updates SetupShouldOnlyBeUsedForOverridableMembersAnalyzer to use IOperation pattern found in explainer #118

With the IOperation implementation, the symbol specificity is broader on the detected text span, so the test cases were updated to reflect that with a marker move to the beginning and end of the inserted symbol.

Additional related updates include:

  • Adding utility methods for handling code operations and symbol retrieval
  • Updated symbol overridability detection logic

Fixes #339

Copy link

coderabbitai bot commented Jan 31, 2025

Warning

Rate limit exceeded

@rjmurillo has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 19 minutes and 1 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 775d7c5 and 97be0de.

📒 Files selected for processing (2)
  • src/Common/IOperationExtensions.cs (1 hunks)
  • tests/Moq.Analyzers.Test/SetupShouldBeUsedOnlyForOverridableMembersAnalyzerTests.cs (2 hunks)
📝 Walkthrough

Walkthrough

The pull request focuses on converting the SetupShouldBeUsedOnlyForOverridableMembersAnalyzer from using syntax node analysis to operation-based analysis. This involves significant changes to the analyzer's implementation, including modifications to how method symbols are retrieved and analyzed. Additionally, the changes include updates to extension methods in IOperationExtensions and ISymbolExtensions to support more precise symbol and operation handling. The modifications aim to improve the accuracy and clarity of the analyzer's functionality for detecting improper Moq setup calls.

Changes

File Change Summary
src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs - Transitioned from syntax node to operation-based analysis
- Updated method signature from Analyze to AnalyzeInvocation
- Added TryGetMockedMemberSymbol helper method
src/Analyzers/SquiggleCop.Baseline.yaml - Updated RCS1141 rule to allow suppression
src/Common/IOperationExtensions.cs - Added three new extension methods:
1. WalkDownImplicitConversion
2. GetSymbolFromOperation
3. GetReferencedMemberSymbolFromLambda
src/Common/ISymbolExtensions.cs - Refined IsOverridable method logic
tests/Moq.Analyzers.Test/SetupShouldBeUsedOnlyForOverridableMembersAnalyzerTests.cs - Updated test data syntax for setup expressions
tests/Moq.Analyzers.Test/SetupShouldNotIncludeAsyncResultAnalyzerTests.cs - Added GenericTaskAsync method to AsyncClient class

Assessment against linked issues

Objective Addressed Explanation
Convert SetupShouldBeUsedOnlyForOverridableMembersAnalyzer to IOperation [#339]

Possibly related PRs

Suggested labels

bug, analyzers

Suggested reviewers

  • MattKotsenas

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

codacy-production bot commented Jan 31, 2025

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
-0.39% (target: -1.00%) 83.33% (target: 95.00%)
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (39e516d) 724 633 87.43%
Head commit (97be0de) 756 (+32) 658 (+25) 87.04% (-0.39%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#340) 54 45 83.33%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

Codacy stopped sending the deprecated coverage status on June 5th, 2024. Learn more

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 39e516d and 44eecff.

📒 Files selected for processing (6)
  • src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (3 hunks)
  • src/Analyzers/SquiggleCop.Baseline.yaml (1 hunks)
  • src/Common/IOperationExtensions.cs (1 hunks)
  • src/Common/ISymbolExtensions.cs (1 hunks)
  • tests/Moq.Analyzers.Test/SetupShouldBeUsedOnlyForOverridableMembersAnalyzerTests.cs (1 hunks)
  • tests/Moq.Analyzers.Test/SetupShouldNotIncludeAsyncResultAnalyzerTests.cs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
src/Common/ISymbolExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

tests/Moq.Analyzers.Test/SetupShouldNotIncludeAsyncResultAnalyzerTests.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

tests/Moq.Analyzers.Test/SetupShouldBeUsedOnlyForOverridableMembersAnalyzerTests.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Common/IOperationExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: build (ubuntu-24.04-arm)
  • GitHub Check: build (windows-latest)
🔇 Additional comments (21)
src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (15)

2-2: Import usage is appropriate.
No issues found with referencing Microsoft.CodeAnalysis.Operations; it is necessary for working with the operation-based analyzer.


32-35: Operation-based analysis registration looks correct.
Switching to RegisterOperationAction(AnalyzeInvocation, OperationKind.Invocation) appears to follow best practices for Roslyn analyzers focusing on semantic/operation-level checks.


44-44: Safety check against a null SemanticModel.
This is a valid safeguard; no issues found.


49-50: Instantiating known symbols and retrieving the target method.
No issues here; consistent with typical Roslyn practices.


52-53: Verifying if the target method is a Moq setup method.
The check is clear and prevents false positives.


58-62: Retrieving the mocked member symbol and handling null.
This ensures we gracefully skip if no analyzable member is found.


67-68: Interface check is logically sound.
Interfaces are treated as overridable in Moq’s context, so skipping diagnostic is correct.


73-74: Switch statement on symbol type is cleanly structured.
No immediate concerns; property vs. method breakdown is standard.


77-77: Skipping diagnostic for Task<T>.Result is correct for Moq usage.
No issues identified; logic is coherent.


89-89: Method symbol check for overridability or Task return.
Well aligned with Moq's requirements.


97-100: Default case excludes non-property/non-method from diagnostic.
This prevents false-positive diagnostics for other symbol types.


103-107: Diagnostic reporting.
Reporting on invocationOperation.Syntax is appropriate, as it best reflects the call site.


111-115: Helper method documentation is clear.
Meaningful XML comments improve maintainability.


116-139: Extracting the mocked member through the first lambda argument.
This approach works well for common Moq patterns.
Consider verifying if multiple arguments or more complex lambda forms might require additional checks.

Would you like a script to search for multi-argument invocations in the codebase to ensure no missed edge cases?


141-144: IsTaskResultProperty is well-scoped to detect Task<T>.Result.
No bugs found; method handles the fallback scenario if Task<T> is not resolved.

tests/Moq.Analyzers.Test/SetupShouldNotIncludeAsyncResultAnalyzerTests.cs (1)

32-32: New method GenericTaskAsync aligns with test requirements.
It provides a valid Task<string> scenario for analyzer testing. No issues found.

src/Common/IOperationExtensions.cs (3)

21-35: Symbol retrieval logic is straightforward but focused.
Only properties and method invocations are retrieved. If extending support (e.g., fields, events) becomes necessary, this is easy to adapt.


37-47: Extracting referenced member symbol from lambda blocks vs. expression lambdas.
This logic covers common Moq usage patterns; no concurrency or edge-case errors spotted.


49-59: Unwrapping implicit conversions.
Peeling off trivial conversions is correct for Moq. For explicit conversions, the method properly stops to avoid misinterpretation.

tests/Moq.Analyzers.Test/SetupShouldBeUsedOnlyForOverridableMembersAnalyzerTests.cs (1)

11-13: Verify test coverage for edge cases.

The test data covers basic scenarios for non-overridable members, but there might be edge cases missing:

  • Explicit interface implementations
  • Generic methods
  • Nested class members
  • Protected members

Let's verify if there are any edge cases in the codebase that should be covered:

src/Analyzers/SquiggleCop.Baseline.yaml (1)

758-758: LGTM! Allowing suppression of param element warnings.

The change to allow suppression of RCS1141 warnings gives developers more flexibility in managing documentation requirements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 44eecff and b780ce5.

📒 Files selected for processing (2)
  • src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (2 hunks)
  • src/Common/ISymbolExtensions.cs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
src/Common/ISymbolExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

🪛 GitHub Check: build (ubuntu-24.04-arm)
src/Common/ISymbolExtensions.cs

[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)


[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)


[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)


[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build (windows-latest)
🔇 Additional comments (23)
src/Common/ISymbolExtensions.cs (1)

112-118: Check for explicit interface implementations.

Currently, the switch expression doesn’t account for members declared as explicit interface implementations (e.g., IMethodSymbol { IsExplicitInterfaceImplementation: true }). Depending on your analyzer’s requirements, these members might need special handling.

🧰 Tools
🪛 GitHub Check: build (ubuntu-24.04-arm)

[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)


[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)


[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)


[failure] 116-116:
Use trailing comma in multi-line initializers (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1413.md)

src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (22)

2-2: Import statement looks good.

Adding using Microsoft.CodeAnalysis.Operations; is necessary for IOperation references and seems appropriate.


32-35: Good transition to operation-based analysis.

Registering an operation action on IInvocationOperation aligns with the refactor objective to use IOperation.


39-39: Refactor suggestion: consider reducing method size.

We previously noted that if this method grows further, it may be split into helper functions for maintainability.


41-42: Consider pattern matching for cleaner code.

Casting context.Operation to IInvocationOperation is fine, but the prior review recommended using pattern matching for style consistency.


44-44: Null check is appropriate.

Returning early when semanticModel is null avoids unnecessary processing.


49-51: Local variable assignments are clear.

Storing knownSymbols and targetMethod locally improves readability.


52-53: Moq setup method check is correct.

Filtering out non-setup calls early helps prevent unnecessary analysis.


58-62: Graceful handling of a null mocked member symbol.

Skipping analysis when the symbol is unknown avoids false positives.


67-68: Excluding interface members is valid.

Interface members are inherently overridable, so returning early is consistent with the target logic.


73-74: Proper check before diagnosing.

Calling IsPropertyOrMethod encapsulates logic for properties and methods neatly.


79-85: Diagnostic reporting is appropriately targeted.

The diagnostic is attached to the invocation syntax, aligning with analyzer best practices.


86-87: Method definition is straightforward.

No immediate concerns with the signature of IsPropertyOrMethod.


88-100: Property checks are appropriate.

The code correctly detects special Task-related members and uses IsOverridable().


104-104: Break statement is clear.

No issues; the switch control flow is properly terminated.


108-108: Method condition is well-handled.

Simple direct return for the method case.


112-115: Default case ensures no diagnostic for unexpected symbol types.

Opting out early is a reasonable fallback.


118-119: Correct final return.

The switch covers all property/method scenarios before returning false here.


120-120: Helper method definition is clear.

TryGetMockedMemberSymbol is a solid approach for extracting the symbol.


121-126: Documentation is helpful.

Properly explains the method’s purpose and return conditions.


127-147: Lambda unwrapping logic is well-organized.

Unwrapping conversions and retrieving the reference symbol from the lambda is a strong approach.


148-149: Fallback handling is safe.

Returning null for unsupported patterns avoids false positives.


Line range hint 152-178: Task result property checks appear correct.

The method focuses specifically on Result and Task<T> alignment, which meets Moq usage requirements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (1)

39-44: 🧹 Nitpick (assertive)

Consider refactoring the method if it grows larger
The approach of handing off analysis to AnalyzeInvocation is clean. If this method continues to grow, you might split out specialized helper methods for clarity.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b780ce5 and 41199f4.

📒 Files selected for processing (2)
  • src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (2 hunks)
  • src/Common/ISymbolExtensions.cs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
src/Common/ISymbolExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: build (ubuntu-24.04-arm)
  • GitHub Check: build (windows-latest)
🔇 Additional comments (10)
src/Common/ISymbolExtensions.cs (1)

112-118: Revisit handling of explicit interface implementations
Currently, this logic returns true if the symbol's containing type is an interface, even for explicit interface implementations that may not be “overridable” in a practical sense. This concern was noted previously. If that scenario matters in your codebase, consider refining the check to exclude symbols with IsExplicitInterfaceImplementation set to true.

Here’s a script to see if explicit interface implementations appear in your codebase:

#!/bin/bash
# Searching for explicit interface implementations usage across .cs files
ast-grep --pattern $'$_.InterfaceMembers: [$$$]' 
src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (9)

32-35: Good transition to IOperation registration
The switch to registering an operation action for InvocationOperation improves analyzer precision and clarity. No issues found here.


46-48: Null-check for SemanticModel
The null-check for SemanticModel is a sensible safeguard; no concerns here.


53-57: Robust check for Moq Setup method
Verifying the target method is a Moq Setup call ensures the analyzer focuses on relevant invocations only. Looks correct.


62-66: Retrieve the mocked member symbol
Extracting the member symbol early clarifies subsequent checks. This is a concise and maintainable approach.


77-78: Check if property or method
You defensively call IsPropertyOrMethod to skip diagnostics for legitimate or automatically allowed cases. Good approach.


83-89: Clear diagnostic reporting
Reporting the diagnostic on the invocation location is straightforward and keeps it relevant to the offending setup call.


91-123: Well-structured property/method checks
This method correctly branches for properties vs. methods and checks for overridability or task-returning behavior. No bugs found.


156-158: Straightforward Task.Result check
The logic for identifying the Result property on Task<T> is concise and correct.


125-153: Versatile handling of the Setup argument
Extracting the first argument as a lambda and unwrapping conversions is a robust approach. Consider how to handle unexpected argument structures (e.g., multi-argument setups or nested expressions) in future expansions.

✅ Verification successful

Review of Setup Argument Handling in Analyzer
After verifying the codebase:

  • The implementation in src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs focuses on extracting the lambda expression from the first argument of a Setup call, which is the prevalent pattern in production.
  • Our regex search indicates that multi-argument Setup usages appear only in test files (e.g., in tests/Moq.Analyzers.Test/NoMethodsInPropertySetupAnalyzerTests.cs), not in production code.
  • While future enhancements might consider handling more complex or nested expressions, the current approach is appropriate based on observed usage.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Look for potential multi-argument Setup usages throughout the codebase.
rg --case-sensitive --context 3 'Setup\s*\(.*\,'

Length of output: 143


Script:

#!/bin/bash
# Re-run the search for multi-argument Setup usages with corrected regex escaping.
rg --pcre2 --case-sensitive --context 3 'Setup\\s*\\(.*,'

Length of output: 132


Script:

#!/bin/bash
# Re-run the search for multi-argument Setup usages with a simplified pattern that avoids nested group issues.
rg --pcre2 --case-sensitive --context 3 'Setup\s*\([^)]*,'

Length of output: 755

@rjmurillo rjmurillo marked this pull request as ready for review January 31, 2025 23:37
coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 31, 2025
@rjmurillo rjmurillo enabled auto-merge (squash) January 31, 2025 23:39
There's a slight variation to the version I submitted, this makes it match the same naming convention for ease of discovery and adds XML documentation explaining what it does
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 41199f4 and fe5aca5.

📒 Files selected for processing (2)
  • src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (2 hunks)
  • src/Common/IOperationExtensions.cs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Common/IOperationExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: build (ubuntu-24.04-arm)
  • GitHub Check: build (windows-latest)
🔇 Additional comments (15)
src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (11)

2-2: Trivial import statement.

No issues here—this using is necessary for working with IOperation.


32-32: Good job registering the operation action.

This ensures the analyzer runs on IInvocationOperation nodes as intended.


36-36: Consider splitting up AnalyzeInvocation method.

This feedback has already been provided on a previous commit. Flagging as a repeated comment.


38-41: Early return logic looks solid.

No potential issues identified in this segment; returning if we don't have an IInvocationOperation is correct.


43-45: No special issues found.

This seems to be a straightforward semantic model null check.


50-54: Moq setup detection is correct.

Verifying the target method as a Moq Setup call is a good approach; no bugs noticed.


59-63: Member symbol resolution is good.

Calling TryGetMockedMemberSymbol ensures we guard against missing or invalid expressions.


68-69: Interface handling note.

Skipping interface members here was previously discussed. Retaining an early return for interface members is valid if the design is to treat them as “overridable.”


80-86: Diagnostic creation logic looks good.

Thank you for tying the diagnostic to the current invocation syntax node. This ensures the diagnostic message is accurately highlighted.


122-150: Symbol extraction logic appears safe and thorough.

The approach of unwrapping conversions and extracting symbols from the first argument is in line with typical Moq usage. No obvious edge cases or off-by-one errors detected here.


153-153: Task.Result logic is correct.

Properly checks if {T}.Result is from Task<T>, then excludes it from diagnostics, aligning with Moq’s allowances.

src/Common/IOperationExtensions.cs (4)

21-21: No significant changes.

This line appears to be a minor or whitespace adjustment.


22-37: Implicit conversion unwrapping looks correct.

The loop properly peels off implicit conversions, preventing accidental misses of the underlying operation. No concurrency or off-by-one concerns noted.


38-38: Blank line or minor spacing modification.

No comments needed.


53-64: Verify handling of multiple statements in block lambdas.

Currently, if a block lambda has more than one statement, we only consider the first. For instance:

mock.Setup(x =>
{
    x.Foo();
    return x.Bar;
});

Only the first statement x.Foo() symbol is inspected if Operations[0] is used. If that’s intentional, OK; otherwise, you may want to handle or warn about multi-statement blocks.

Would you like a proposed test scenario to confirm the analyzer’s behavior for multi-statement lambdas?

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fe5aca5 and 8cf107a.

📒 Files selected for processing (1)
  • src/Common/IOperationExtensions.cs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
src/Common/IOperationExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: build (windows-latest)

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
src/Common/ISymbolExtensions.cs (1)

112-119: 🛠️ Refactor suggestion

Enhance Overridability Check in Switch Expression
The new implementation using a switch expression is much clearer; however, it does not account for explicit interface implementations, which are non-overridable. Consider adding explicit patterns such as:

-    IMethodSymbol { IsStatic: true } or IPropertySymbol { IsStatic: true } => false,
+    IMethodSymbol { IsStatic: true } or IPropertySymbol { IsStatic: true }
+        or IMethodSymbol { IsExplicitInterfaceImplementation: true } or IPropertySymbol { IsExplicitInterfaceImplementation: true } => false,

Also, adding a trailing comma after the final case helps maintain style consistency per SA1413 guidelines.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8cf107a and 775d7c5.

📒 Files selected for processing (5)
  • src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (2 hunks)
  • src/Analyzers/SetupShouldNotIncludeAsyncResultAnalyzer.cs (1 hunks)
  • src/Common/IOperationExtensions.cs (1 hunks)
  • src/Common/ISymbolExtensions.cs (1 hunks)
  • src/Common/SemanticModelExtensions.cs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
src/Analyzers/SetupShouldNotIncludeAsyncResultAnalyzer.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Common/ISymbolExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Common/SemanticModelExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Common/IOperationExtensions.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (1)

Pattern **/*.cs: I need your help tracking down and fixing some bugs that have been reported in this codebase.

I suspect the bugs are related to:

  • Incorrect handling of edge cases
  • Off-by-one errors in loops or array indexing
  • Unexpected data types
  • Uncaught exceptions
  • Concurrency issues
  • Improper configuration settings

To diagnose:

  1. Review the code carefully and systematically
  2. Trace the relevant code paths
  3. Consider boundary conditions and potential error states
  4. Look for antipatterns that tend to cause bugs
  5. Run the code mentally with example inputs
  6. Think about interactions between components

When you find potential bugs, for each one provide:

  1. File path and line number(s)
  2. Description of the issue and why it's a bug
  3. Example input that would trigger the bug
  4. Suggestions for how to fix it

After analysis, please update the code with your proposed fixes. Try to match the existing code style. Add regression tests if possible to prevent the bugs from recurring.

I appreciate your diligence and attention to detail! Let me know if you need any clarification on the intended behavior of the code.

🪛 GitHub Check: build (ubuntu-24.04-arm)
src/Common/IOperationExtensions.cs

[failure] 25-25:
XML comment has badly formed XML -- 'Expected '>' or '/>' to close tag 'Func'.'


[failure] 25-25:
XML comment has badly formed XML -- 'An identifier was expected.'


[failure] 25-25:
XML comment has badly formed XML -- 'The character(s) '.' cannot be used at this location.'


[failure] 25-25:
XML comment has badly formed XML -- 'An identifier was expected.'


[failure] 25-25:
XML comment has badly formed XML -- 'The character(s) '.' cannot be used at this location.'


[failure] 26-26:
XML comment has badly formed XML -- 'End tag 'summary' does not match the start tag ''.'


[failure] 29-29:
XML comment has badly formed XML -- 'Expected an end tag for element ''.'


[failure] 29-29:
XML comment has badly formed XML -- 'Expected an end tag for element 'summary'.'


[failure] 29-29:
The documentation for parameter 'operation' is missing (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1611.md)


[failure] 29-29:
Element return value should be documented (https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1615.md)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build (windows-latest)
🔇 Additional comments (6)
src/Analyzers/SetupShouldBeUsedOnlyForOverridableMembersAnalyzer.cs (3)

2-2: No concerns about this import.
Adding Microsoft.CodeAnalysis.Operations is necessary for the new operation-based analysis.


32-32: Operation-based analysis registration looks good.
This correctly replaces syntax-based registration with an operation-based approach for InvocationOperation.


36-36: Consider splitting up AnalyzeInvocation as previously suggested.
This method can grow large over time. Splitting it into smaller helper methods may improve maintainability.

src/Common/SemanticModelExtensions.cs (1)

24-24: Moq setup check logic looks correct.
This line properly delegates the “IsMoqSetupMethod” check to the symbol itself.

src/Analyzers/SetupShouldNotIncludeAsyncResultAnalyzer.cs (1)

Line range hint 53-57: Refactor Check: Use Symbol Extension for Moq Setup Method
The updated conditional now directly leverages memberAccessSymbolInfo.Symbol.IsMoqSetupMethod(knownSymbols), which streamlines the logic by eliminating the extra context parameter. This is in line with our refactoring goals and should correctly identify the setup method. Please verify that the extension method’s logic comprehensively covers all Moq setup scenarios.

src/Common/ISymbolExtensions.cs (1)

121-123: Verify Moq Setup Method Detection
The new IsMoqSetupMethod method succinctly checks whether a symbol is an instance of knownSymbols.Mock1Setup and is a generic method. This change appears correct; please ensure that the knownSymbols.Mock1Setup is properly initialized so that all valid Moq setup methods are detected.

@rjmurillo rjmurillo added this to the vNext milestone Feb 1, 2025
Copy link

codeclimate bot commented Feb 1, 2025

Code Climate has analyzed commit 97be0de and detected 2 issues on this pull request.

Here's the issue category breakdown:

Category Count
Complexity 1
Style 1

View more on Code Climate.

@rjmurillo rjmurillo requested a review from Copilot February 1, 2025 00:59
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot reviewed 6 out of 8 changed files in this pull request and generated 1 comment.

Files not reviewed (2)
  • src/Analyzers/SquiggleCop.Baseline.yaml: Evaluated as low risk
  • src/Analyzers/SetupShouldNotIncludeAsyncResultAnalyzer.cs: Evaluated as low risk
Comments suppressed due to low confidence (1)

src/Common/ISymbolExtensions.cs:117

  • The condition 'symbol is { IsOverride: true, IsSealed: false }' is redundant because 'symbol.IsSealed' is already checked before. Consider removing the redundant check.
(symbol.IsVirtual || symbol.IsAbstract || symbol is { IsOverride: true, IsSealed: false })

@rjmurillo rjmurillo merged commit 9815a31 into main Feb 4, 2025
11 of 12 checks passed
@rjmurillo rjmurillo deleted the feature/refactor-setupshouldonlybeusedforoverridablemembers-to-IOperation branch February 4, 2025 00:59
This was referenced Feb 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Convert SetupShouldBeUsedOnlyForOverridableMembersAnalyzer to IOperation
2 participants