Skip to content

Commit 6f25c5f

Browse files
bkoelmanbkoelman
authored andcommitted
Fixed: do not report AV1562 on parameters typed as ref struct.
1 parent 9f9a2e1 commit 6f25c5f

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer.Test/Specs/Maintainability/DoNotDeclareRefOrOutParameterSpecs.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,27 @@ static void Test()
113113
VerifyGuidelineDiagnostic(source);
114114
}
115115

116+
[Fact]
117+
internal void When_method_parameter_has_ref_modifier_to_ref_struct_it_must_be_skipped()
118+
{
119+
// Arrange
120+
ParsedSourceCode source = new TypeSourceCodeBuilder()
121+
.InGlobalScope(@"
122+
ref struct S
123+
{
124+
}
125+
126+
class C
127+
{
128+
void M(ref S s) => throw null;
129+
}
130+
")
131+
.Build();
132+
133+
// Act and assert
134+
VerifyGuidelineDiagnostic(source);
135+
}
136+
116137
[Fact]
117138
internal void When_constructor_parameter_has_no_modifier_it_must_be_skipped()
118139
{

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Maintainability/DoNotDeclareRefOrOutParameterAnalyzer.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Immutable;
3+
using System.Reflection;
34
using CSharpGuidelinesAnalyzer.Extensions;
45
using JetBrains.Annotations;
56
using Microsoft.CodeAnalysis;
@@ -24,6 +25,9 @@ public sealed class DoNotDeclareRefOrOutParameterAnalyzer : DiagnosticAnalyzer
2425
private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category.DisplayName,
2526
DiagnosticSeverity.Warning, true, Description, Category.GetHelpLinkUri(DiagnosticId));
2627

28+
[CanBeNull]
29+
private static readonly PropertyInfo IsRefLikeTypeProperty = typeof(ITypeSymbol).GetRuntimeProperty("IsRefLikeType");
30+
2731
[NotNull]
2832
private static readonly Action<SyntaxNodeAnalysisContext> AnalyzeParameterAction = context => context.SkipEmptyName(AnalyzeParameter);
2933

@@ -68,12 +72,22 @@ private static bool IsOutParameterInTryMethod([NotNull] IParameterSymbol paramet
6872

6973
private static void AnalyzeRefParameter([NotNull] IParameterSymbol parameter, SymbolAnalysisContext context)
7074
{
75+
if (IsRefStruct(parameter.Type))
76+
{
77+
return;
78+
}
79+
7180
ISymbol containingMember = parameter.ContainingSymbol;
7281

7382
if (!containingMember.IsOverride && !containingMember.HidesBaseMember(context.CancellationToken) && !parameter.IsInterfaceImplementation())
7483
{
7584
context.ReportDiagnostic(Diagnostic.Create(Rule, parameter.Locations[0], parameter.Name));
7685
}
7786
}
87+
88+
private static bool IsRefStruct([NotNull] ITypeSymbol type)
89+
{
90+
return IsRefLikeTypeProperty != null && type.TypeKind == TypeKind.Struct && (bool)IsRefLikeTypeProperty.GetValue(type);
91+
}
7892
}
7993
}

0 commit comments

Comments
 (0)