rubberduck-vba/Rubberduck

VBA.Array() Inspection

retailcoder opened this issue · 2 comments

What
An inspection that locates qualified VBA.Array() function calls to warn about possibly unexpected behavior; depending on how it's implemented this one could be a hint under language opportunities, or a warning under code quality, ...or both 😃

Why
Qualified VBA.Array() function calls yield an array that is always zero-based, but unqualified 'Array()' yields an array that is one-based given Option Base 1.

  • If Option Base 1 is specified, qualified VBA.Array() calls become inconsistent zero-based arrays in a module where implicitly-sized arrays can reasonably be assumed to be one-based.
  • If Option Base 1 is NOT specified, qualifying VBA.Array() calls should warn/hint about the behavior being different than that of an unqualified Array() call.

Example
This code should trigger the inspection:

Option Base 1 '<~ Implicit array lower bound is 1

Public Sub DoSomething()
    Dim Values As Variant

    Values = Array(42)
    Debug.Print LBound(Values) '<~ 1 as per Option Base

    Values = VBA.Array(42) '<<< inspection result here
    Debug.Print LBound(Values) '<~ not 1
End Sub

QuickFixes
Rubberduck could offer to remove the qualifier, albeit with a disclaimer that doing so may introduce off-by-one errors if the code makes any assumptions about array boundaries: it changes what the code does, not just how it does it.

Agree that this is a worthwhile inspection.

Would it not also be worth an inspection to discourage use of Option Base 1 though? Most languages are zero-based, and VBA itself fights against base 1:
image

There's already one 😉

Although, I'm not sure the part about ParamArray is mentioned in the xmldoc. Or perhaps an inspection that flags (hint?) ParamArray parameters when Option Base 1 is on would be more targeted.