Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions src/Common/ISymbolExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,16 @@
return true;
}

// TODO: Remove this fallback once symbol-based detection is complete
// This is a temporary safety net for cases where symbol resolution fails
// but should be replaced with comprehensive symbol-based approach
return IsLikelyMoqRaisesMethodByName(methodSymbol);
// TODO: Replace this with comprehensive symbol-based detection

Check notice

Code scanning / devskim

A "TODO" or similar was left in source code, possibly indicating incomplete functionality Note

Suspicious comment
// The current symbol-based detection in IsKnownMoqRaisesMethod covers the standard
// Moq interfaces (ICallback, IReturns, IRaiseable) but may not cover all possible
// Raises method scenarios. A complete replacement would require:
// 1. Analysis of all possible Moq Raises patterns in different versions
// 2. Enhanced MoqKnownSymbols to include any missing interface patterns
// 3. Comprehensive test coverage for edge cases
//
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Then do that

// For now, keep the conservative string-based fallback to avoid breaking existing functionality
return IsConservativeRaisesMethodFallback(methodSymbol);
}

/// <summary>
Expand Down Expand Up @@ -280,26 +286,29 @@
}

/// <summary>
/// TEMPORARY: Conservative fallback for Moq Raises method detection.
/// This should be removed once symbol-based detection is comprehensive.
/// Only matches methods that are clearly Moq Raises methods.
/// Conservative fallback for Moq Raises method detection using string-based name checking.
///
/// NOTE: This method should eventually be replaced with comprehensive symbol-based detection.
/// It provides a safety net for Raises method patterns that may not be covered by the current
/// symbol-based detection in IsKnownMoqRaisesMethod.
///
/// The method is intentionally conservative to minimize false positives while ensuring
/// that legitimate Moq Raises calls are detected.
/// </summary>
/// <param name="methodSymbol">The method symbol to check.</param>
/// <returns>True if this is likely a Moq Raises method; otherwise false.</returns>
private static bool IsLikelyMoqRaisesMethodByName(IMethodSymbol methodSymbol)
private static bool IsConservativeRaisesMethodFallback(IMethodSymbol methodSymbol)
{
string methodName = methodSymbol.Name;

// Only match exact "Raises" or "RaisesAsync" method names
if (!string.Equals(methodName, "Raises", StringComparison.Ordinal) &&
!string.Equals(methodName, "RaisesAsync", StringComparison.Ordinal))
if (!string.Equals(methodSymbol.Name, "Raises", StringComparison.Ordinal) &&
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Can't these be in KnownMoqTypes?

!string.Equals(methodSymbol.Name, "RaisesAsync", StringComparison.Ordinal))
{
return false;
}

// Must be in a type that contains "Moq" in its namespace to reduce false positives
string? containingTypeNamespace = methodSymbol.ContainingType?.ContainingNamespace?.ToDisplayString();
return containingTypeNamespace?.StartsWith("Moq", StringComparison.Ordinal) == true;
// Must be in a Moq namespace to reduce false positives
string? containingNamespace = methodSymbol.ContainingType?.ContainingNamespace?.ToDisplayString();
return containingNamespace?.StartsWith("Moq", StringComparison.Ordinal) == true;
}

/// <summary>
Expand Down
Loading