From bb030cf749b3ce3c1614bf21440234ff525f2949 Mon Sep 17 00:00:00 2001 From: Brian Zenger Date: Thu, 3 Dec 2020 15:48:28 -0800 Subject: [PATCH] Fix inspection false positive for array parameters --- .../MisleadingByRefParameterInspection.cs | 8 ++++-- ...MisleadingByRefParameterInspectionTests.cs | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Rubberduck.CodeAnalysis/Inspections/Concrete/MisleadingByRefParameterInspection.cs b/Rubberduck.CodeAnalysis/Inspections/Concrete/MisleadingByRefParameterInspection.cs index 7c58237a9d..5f6b9eae84 100644 --- a/Rubberduck.CodeAnalysis/Inspections/Concrete/MisleadingByRefParameterInspection.cs +++ b/Rubberduck.CodeAnalysis/Inspections/Concrete/MisleadingByRefParameterInspection.cs @@ -50,14 +50,18 @@ public MisleadingByRefParameterInspection(IDeclarationFinderProvider declaration protected override bool IsResultDeclaration(Declaration declaration, DeclarationFinder finder) { return declaration is ParameterDeclaration parameter - && !(parameter.AsTypeDeclaration?.DeclarationType.HasFlag(DeclarationType.UserDefinedType) ?? false) - && parameter.ParentDeclaration is ModuleBodyElementDeclaration enclosingMethod + && !IsAlwaysByRef(declaration) + && declaration.ParentDeclaration is ModuleBodyElementDeclaration enclosingMethod && (enclosingMethod.DeclarationType.HasFlag(DeclarationType.PropertyLet) || enclosingMethod.DeclarationType.HasFlag(DeclarationType.PropertySet)) && enclosingMethod.Parameters.Last() == parameter && parameter.IsByRef && !parameter.IsImplicitByRef; } + private static bool IsAlwaysByRef(Declaration parameter) + => parameter.IsArray + || (parameter.AsTypeDeclaration?.DeclarationType.HasFlag(DeclarationType.UserDefinedType) ?? false); + protected override string ResultDescription(Declaration declaration) { return string.Format( diff --git a/RubberduckTests/Inspections/MisleadingByRefParameterInspectionTests.cs b/RubberduckTests/Inspections/MisleadingByRefParameterInspectionTests.cs index f43812bc68..468b1fdc0f 100644 --- a/RubberduckTests/Inspections/MisleadingByRefParameterInspectionTests.cs +++ b/RubberduckTests/Inspections/MisleadingByRefParameterInspectionTests.cs @@ -54,6 +54,31 @@ End Property Assert.AreEqual(0, InspectionResultsForStandardModule(inputCode).Count()); } + //https://github.com/rubberduck-vba/Rubberduck/issues/5628 + [TestCase("ArrayToStore")] + [TestCase("ByRef ArrayToStore")] + [Category("QuickFixes")] + [Category(nameof(MisleadingByRefParameterInspection))] + public void ArrayEdgeCase(string parameterMechanismAndParam) + { + var inputCode = +$@" +Option Explicit + +Private InternalArray() As Variant + +Public Property Get StoredArray() As Variant() + StoredArray = InternalArray +End Property + +Public Property Let StoredArray({parameterMechanismAndParam}() As Variant) + InternalArray = ArrayToStore +End Property +"; + + Assert.AreEqual(0, InspectionResultsForStandardModule(inputCode).Count()); + } + [Test] [Category("QuickFixes")] [Category(nameof(MisleadingByRefParameterInspection))]