Skip to content

Commit ea6edd9

Browse files
authored
Merge pull request #5441 from MDoerner/FixArgumentList
Fix argumentList
2 parents a425932 + d4216b0 commit ea6edd9

File tree

2 files changed

+96
-3
lines changed

2 files changed

+96
-3
lines changed

Rubberduck.Parsing/Grammar/VBAParser.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,7 @@ builtInType :
708708
;
709709

710710
// 5.6.13.1 Argument Lists
711-
argumentList : whiteSpace? (argument? (whiteSpace? COMMA whiteSpace? argument)*)?? whiteSpace?
711+
argumentList : whiteSpace? (argument (whiteSpace? COMMA whiteSpace? argument)*)? whiteSpace?
712712
;
713713

714714
requiredArgument : argument;

RubberduckTests/Grammar/VBAParserTests.cs

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3481,7 +3481,7 @@ End Sub
34813481

34823482

34833483
[Test]
3484-
public void LeftOutOptionalArgumentsAreCountedAsMissingArguments()
3484+
public void LeftOutOptionalArgumentsAreCountedAsMissingArguments_Mid_Function()
34853485
{
34863486
const string code = @"
34873487
Public Sub Test()
@@ -3498,7 +3498,100 @@ End Function
34983498
AssertTree(parseResult.Item1, parseResult.Item2, "//argumentList", matches => matches.Count == 1);
34993499
}
35003500

3501-
3501+
3502+
[Test]
3503+
public void LeftOutOptionalArgumentsAreCountedAsMissingArguments_Mid_Procedure()
3504+
{
3505+
const string code = @"
3506+
Public Sub Test()
3507+
Dim x As Long
3508+
Foo 1, , 5
3509+
End Sub
3510+
3511+
Public Sub Foo(a, Optional b, Optional c)
3512+
End Sub
3513+
";
3514+
var parseResult = Parse(code);
3515+
AssertTree(parseResult.Item1, parseResult.Item2, "//missingArgument", matches => matches.Count == 1);
3516+
AssertTree(parseResult.Item1, parseResult.Item2, "//argumentList", matches => matches.Count == 1);
3517+
}
3518+
3519+
3520+
[Test]
3521+
public void LeftOutOptionalArgumentsAreCountedAsMissingArguments_MultipleAtStart_Function()
3522+
{
3523+
const string code = @"
3524+
Public Sub Test()
3525+
Dim x As Long
3526+
x = Foo(, , 5)
3527+
End Sub
3528+
3529+
Public Function Foo(Optional a, Optional b, Optional c) As Long
3530+
Foo = 42
3531+
End Function
3532+
";
3533+
var parseResult = Parse(code);
3534+
AssertTree(parseResult.Item1, parseResult.Item2, "//missingArgument", matches => matches.Count == 2);
3535+
AssertTree(parseResult.Item1, parseResult.Item2, "//argumentList", matches => matches.Count == 1);
3536+
}
3537+
3538+
3539+
[Test]
3540+
public void LeftOutOptionalArgumentsAreCountedAsMissingArguments_SingleAtStart_Function()
3541+
{
3542+
const string code = @"
3543+
Public Sub Test()
3544+
Dim x As Long
3545+
x = Foo(, 1, 5)
3546+
End Sub
3547+
3548+
Public Function Foo(Optional a, Optional b, Optional c) As Long
3549+
Foo = 42
3550+
End Function
3551+
";
3552+
var parseResult = Parse(code);
3553+
AssertTree(parseResult.Item1, parseResult.Item2, "//missingArgument", matches => matches.Count == 1);
3554+
AssertTree(parseResult.Item1, parseResult.Item2, "//argumentList", matches => matches.Count == 1);
3555+
}
3556+
3557+
3558+
[Test]
3559+
public void LeftOutOptionalArgumentsAreCountedAsMissingArguments_AtStart_Procedure()
3560+
{
3561+
const string code = @"
3562+
Public Sub Test()
3563+
Dim x As Long
3564+
Foo , , 5
3565+
End Sub
3566+
3567+
Public Sub Foo(Optional a, Optional b, Optional c)
3568+
End Sub
3569+
";
3570+
var parseResult = Parse(code);
3571+
AssertTree(parseResult.Item1, parseResult.Item2, "//missingArgument", matches => matches.Count == 2);
3572+
AssertTree(parseResult.Item1, parseResult.Item2, "//argumentList", matches => matches.Count == 1);
3573+
}
3574+
3575+
3576+
[Test]
3577+
//See issue #5440 at https://github.com/rubberduck-vba/Rubberduck/issues/5440
3578+
public void LeftOutOptionalArgumentsAreCountedAsMissingArguments_OneAtStart_Procedure()
3579+
{
3580+
const string code = @"
3581+
Public Sub Test()
3582+
Dim x As Long
3583+
Foo , 1, 5
3584+
End Sub
3585+
3586+
Public Sub Foo(Optional a, Optional b, Optional c)
3587+
End Sub
3588+
";
3589+
var parseResult = Parse(code);
3590+
AssertTree(parseResult.Item1, parseResult.Item2, "//missingArgument", matches => matches.Count == 1);
3591+
AssertTree(parseResult.Item1, parseResult.Item2, "//argumentList", matches => matches.Count == 1);
3592+
}
3593+
3594+
35023595
[Test]
35033596
public void TestReDimWithLineContinuation()
35043597
{

0 commit comments

Comments
 (0)