Skip to content

Commit d7aa750

Browse files
committed
feat(cli): adding --extract-func-names to list all symbols
1 parent 1dd3a96 commit d7aa750

File tree

2 files changed

+52
-11
lines changed

2 files changed

+52
-11
lines changed

arkdoc/__main__.py

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import sys
55
import argparse
66

7+
from arkdoc.generator.utils import extractor
8+
from arkdoc.parser import Source
79
from . import logger
810
from .logger_utils import LogLevel
911
from .reader import parse_all_in
@@ -14,28 +16,61 @@
1416
EXIT_FAILURE = 1
1517

1618

17-
def compute(args) -> bool:
19+
def check_folders(source_folder) -> bool:
1820
global logger
1921

20-
for folder in args.source_folder:
22+
for folder in source_folder:
2123
if not os.path.exists(folder):
2224
logger.error(f"Folder `{folder}` does not exists")
2325
return False
26+
return True
2427

25-
if args.dry_run:
26-
logger.level = LogLevel.DEBUG
28+
29+
def parse_all(source_folder, dry_run) -> list:
30+
global logger
2731

2832
parsers = []
29-
for folder in args.source_folder:
33+
for folder in source_folder:
3034
parsers += parse_all_in(folder)
3135
for p in parsers:
3236
logger.info(f"Parsing {p.filename}...")
3337
p.parse()
3438

35-
if args.dry_run:
39+
if dry_run:
3640
_ = list(p.extract_documentation())
3741

42+
return parsers
43+
44+
def compute(args) -> bool:
45+
global logger
46+
47+
if not check_folders(args.source_folder):
48+
return False
49+
if args.dry_run:
50+
logger.level = LogLevel.DEBUG
51+
52+
parsers = parse_all(args.source_folder, args.dry_run)
53+
3854
if not args.dry_run:
55+
if args.extract_func_names:
56+
functions = []
57+
for p in parsers:
58+
prefix = os.path.splitext(os.path.basename(p.filename))[0].lower()
59+
for doc in p.extract_documentation():
60+
if doc.source == Source.ArkScript:
61+
kw, name, *args = doc.signature()
62+
if kw == "$":
63+
# macro!
64+
functions.append(name)
65+
else:
66+
functions.append(prefix + ":" + name)
67+
elif doc.source == Source.Cpp:
68+
data, _ = extractor({"name": ""}, doc)
69+
functions.append(data["name"])
70+
print("\n".join(functions))
71+
# early exit if the flag is present
72+
return True
73+
3974
if args.html:
4075
gen = HTMLGenerator(parsers, args.html, args.ark_version, args.root_dir)
4176
gen()
@@ -57,6 +92,11 @@ def main() -> int:
5792
action="store_true",
5893
help="Run and log everything but don't generate any file",
5994
)
95+
cli.add_argument(
96+
"--extract-func-names",
97+
action="store_true",
98+
help="Extract only the function names, print them on separate lines and exit",
99+
)
60100
cli.add_argument("--html", type=str, help="Output folder for the HTML docs")
61101
cli.add_argument(
62102
"--root-dir", type=str, default="", help="The root dir for the links"

arkdoc/generator/utils.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ def extractor(data: Dict, doc: Documentation) -> Tuple[Dict, str]:
3838
margin = code[0].index("(")
3939
code = [line[margin:] for line in code]
4040

41-
for i, param in enumerate(data["param"]):
42-
param_name, desc = param.split(" ", 1)
43-
data["param"][i] = spec.Param(param_name, desc)
44-
45-
data["author"] = [el.strip() for el in data["author"].split(",") if data["author"]]
41+
if "param" in data:
42+
for i, param in enumerate(data["param"]):
43+
param_name, desc = param.split(" ", 1)
44+
data["param"][i] = spec.Param(param_name, desc)
45+
if "author" in data:
46+
data["author"] = [el.strip() for el in data["author"].split(",") if data["author"]]
4647

4748
return data, "\n".join(code)
4849

0 commit comments

Comments
 (0)