Skip to content

Commit e23a271

Browse files
committed
#3 Allow parsing ParamArray Args(). Closes #3.
1 parent b9fd410 commit e23a271

File tree

4 files changed

+95
-52
lines changed

4 files changed

+95
-52
lines changed

Diff for: mkdocstrings_handlers/vba/regex.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
re_arg = re.compile(
44
r"((?P<optional>Optional) +)?"
5-
r"((?P<modifier>ByVal|ByRef) +)?"
5+
r"((?P<modifier>ByVal|ByRef|ParamArray) +)?"
66
r"(?P<name>[A-Z_][A-Z0-9_]*)"
7+
r"(\(\))?"
78
r"( +As +(?P<type>[A-Z_][A-Z0-9_]*))?"
89
r"( *= *(?P<default>.*))?",
910
re.IGNORECASE,

Diff for: mkdocstrings_handlers/vba/util.py

+24-14
Original file line numberDiff line numberDiff line change
@@ -79,25 +79,35 @@ def parse_args(args: str) -> Generator[VbaArgumentInfo, None, None]:
7979
"""
8080
Parse the arguments portion of a signature line of a VBA procedure.
8181
"""
82-
for arg in args.split(","):
83-
arg = arg.strip()
84-
if not len(arg):
85-
continue
82+
args = args.strip()
83+
if not len(args):
84+
return
8685

87-
match = re_arg.fullmatch(arg)
86+
for arg in args.split(","):
87+
yield parse_arg(arg)
8888

89-
if match is None:
90-
raise RuntimeError(f"Failed to parse argument: {arg}")
91-
match = match.groupdict()
9289

93-
yield VbaArgumentInfo(
94-
optional=bool(match["optional"]),
95-
modifier=match["modifier"],
96-
name=match["name"],
97-
arg_type=match["type"],
98-
default=match["default"],
90+
def parse_arg(arg: str) -> VbaArgumentInfo:
91+
arg = arg.strip()
92+
if not len(arg):
93+
raise NotImplementedError(
94+
"What do we do with empty arguments in a function signature?"
9995
)
10096

97+
match = re_arg.fullmatch(arg)
98+
99+
if match is None:
100+
raise RuntimeError(f"Failed to parse argument: {arg}")
101+
match = match.groupdict()
102+
103+
return VbaArgumentInfo(
104+
optional=bool(match["optional"]),
105+
modifier=match["modifier"],
106+
name=match["name"],
107+
arg_type=match["type"],
108+
default=match["default"],
109+
)
110+
101111

102112
def parse_signature(line: str) -> VbaSignatureInfo:
103113
"""

Diff for: test/util/test_parse_args.py

+51-37
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,57 @@
11
import unittest
22

33
from mkdocstrings_handlers.vba.types import VbaArgumentInfo
4-
from mkdocstrings_handlers.vba.util import parse_args
4+
from mkdocstrings_handlers.vba.util import parse_args, parse_arg
5+
6+
7+
class TestParseArg(unittest.TestCase):
8+
def test_1(self):
9+
cases = [
10+
(
11+
"bar As listObject",
12+
VbaArgumentInfo(
13+
name="bar",
14+
optional=False,
15+
modifier=None,
16+
arg_type="listObject",
17+
default=None,
18+
),
19+
),
20+
(
21+
"ByVal v As Variant",
22+
VbaArgumentInfo(
23+
name="v",
24+
optional=False,
25+
modifier="ByVal",
26+
arg_type="Variant",
27+
default=None,
28+
),
29+
),
30+
(
31+
'Optional ByRef s1 As String = "Hello"',
32+
VbaArgumentInfo(
33+
name="s1",
34+
optional=True,
35+
modifier="ByRef",
36+
arg_type="String",
37+
default='"Hello"',
38+
),
39+
),
40+
(
41+
"ParamArray Args() As Variant",
42+
VbaArgumentInfo(
43+
name="Args",
44+
optional=False,
45+
modifier="ParamArray",
46+
arg_type="Variant",
47+
default=None,
48+
),
49+
),
50+
]
51+
52+
for (arg_string, result) in cases:
53+
with self.subTest(arg_string):
54+
self.assertEqual(result, parse_arg(arg_string))
555

656

757
class TestParseArgs(unittest.TestCase):
@@ -46,42 +96,6 @@ def test_1(self):
4696
),
4797
],
4898
),
49-
(
50-
"bar As listObject",
51-
[
52-
VbaArgumentInfo(
53-
name="bar",
54-
optional=False,
55-
modifier=None,
56-
arg_type="listObject",
57-
default=None,
58-
)
59-
],
60-
),
61-
(
62-
"ByVal v As Variant",
63-
[
64-
VbaArgumentInfo(
65-
name="v",
66-
optional=False,
67-
modifier="ByVal",
68-
arg_type="Variant",
69-
default=None,
70-
)
71-
],
72-
),
73-
(
74-
'Optional ByRef s1 As String = "Hello"',
75-
[
76-
VbaArgumentInfo(
77-
name="s1",
78-
optional=True,
79-
modifier="ByRef",
80-
arg_type="String",
81-
default='"Hello"',
82-
)
83-
],
84-
),
8599
]
86100

87101
for (args_string, result) in cases:

Diff for: test/util/test_parse_signature.py

+18
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,24 @@ def test_1(self):
7171
],
7272
),
7373
),
74+
(
75+
"Function dict(ParamArray Args() As Variant)",
76+
VbaSignatureInfo(
77+
visibility=None,
78+
return_type=None,
79+
procedure_type="Function",
80+
name="dict",
81+
args=[
82+
VbaArgumentInfo(
83+
name="Args",
84+
optional=False,
85+
modifier="ParamArray",
86+
arg_type="Variant",
87+
default=None,
88+
)
89+
],
90+
),
91+
),
7492
]
7593

7694
for (signature, result) in cases:

0 commit comments

Comments
 (0)