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

Add UseStringMethodCharOverloadWithSingleCharacters analyzer and fixer #6799

Merged
merged 25 commits into from Jul 26, 2023
Merged
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -56,6 +56,10 @@ public abstract class UseStringMethodCharOverloadWithSingleCharacters : Diagnost
nameof(string.IndexOf),
nameof(string.LastIndexOf));

private INamedTypeSymbol? _stringComparisonType;
private ISymbol? _ordinalStringComparisonSymbol;
private ISymbol? _invariantCultureStringComparisonSymbol;
mrahhal marked this conversation as resolved.
Show resolved Hide resolved

public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; }
= ImmutableArray.Create(SafeTransformationRule, NoSpecifiedComparisonRule, AnyOtherSpecifiedComparisonRule);

Expand All @@ -82,9 +86,15 @@ private void CheckIfRuleIsApplicableAndRegister(CompilationStartAnalysisContext
m.Parameters[0].Type.SpecialType == SpecialType.System_Char;
});

if (!stringTypeHasCharOverload)
var typeProvider = WellKnownTypeProvider.GetOrCreate(context.Compilation);
_stringComparisonType = typeProvider.GetOrCreateTypeByMetadataName("System.StringComparison");

if (!stringTypeHasCharOverload || _stringComparisonType == null)
return;

_ordinalStringComparisonSymbol = _stringComparisonType.GetMembers(nameof(StringComparison.Ordinal)).First();
_invariantCultureStringComparisonSymbol = _stringComparisonType.GetMembers(nameof(StringComparison.InvariantCulture)).First();

context.RegisterOperationAction(AnalyzeOperation, OperationKind.Invocation);
}

Expand Down Expand Up @@ -131,12 +141,6 @@ private void AnalyzeOperation(OperationAnalysisContext context)
method = null;
comparison = null;

var typeProvider = WellKnownTypeProvider.GetOrCreate(context.Compilation);
var stringComparisonType = typeProvider.GetOrCreateTypeByMetadataName("System.StringComparison");

if (stringComparisonType == null)
return false;

if (invocationOperation.TargetMethod is IMethodSymbol invokedMethod &&
invokedMethod.ContainingType.SpecialType == SpecialType.System_String &&
TargetMethods.Contains(invokedMethod.Name) &&
Expand All @@ -148,17 +152,14 @@ private void AnalyzeOperation(OperationAnalysisContext context)
foreach (var argument in invocationOperation.Arguments)
{
if (argument.Value.Type != null &&
argument.Value.Type.Equals(stringComparisonType) &&
argument.Value.Type.Equals(_stringComparisonType) &&
argument.Value is IFieldReferenceOperation fieldReferenceOperation)
{
var ordinalStringComparisonSymbol = stringComparisonType.GetMembers(nameof(StringComparison.Ordinal)).First();
var invariantCultureStringComparisonSymbol = stringComparisonType.GetMembers(nameof(StringComparison.InvariantCulture)).First();

if (fieldReferenceOperation.Field.Equals(ordinalStringComparisonSymbol))
if (fieldReferenceOperation.Field.Equals(_ordinalStringComparisonSymbol))
{
comparison = StringComparisonUsed.Ordinal;
}
else if (fieldReferenceOperation.Field.Equals(invariantCultureStringComparisonSymbol))
else if (fieldReferenceOperation.Field.Equals(_invariantCultureStringComparisonSymbol))
{
comparison = StringComparisonUsed.InvariantCulture;
}
Expand Down