Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0ee3d63

Browse files
authored
Add a --debug-build flag to build ty and pyrefly in debug mode (#214)
1 parent 5050c1d commit 0ee3d63

4 files changed

Lines changed: 108 additions & 122 deletions

File tree

mypy_primer/globals.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class _Args:
1717
repo: str | None
1818
type_checker: str
1919
mypyc_compile_level: int | None
20+
debug_build: bool
2021

2122
custom_typeshed_repo: str
2223
new_typeshed: str | None
@@ -91,6 +92,11 @@ def parse_options(argv: list[str]) -> _Args:
9192
"then fall back to github)"
9293
),
9394
)
95+
type_checker_group.add_argument(
96+
"--debug-build",
97+
action="store_true",
98+
help="build the type checker in debug mode (only relevant for pyrefly/ty)",
99+
)
94100
type_checker_group.add_argument(
95101
"--mypyc-compile-level",
96102
default=None,
@@ -222,8 +228,16 @@ def parse_options(argv: list[str]) -> _Args:
222228
primer_group.add_argument("--clear", action="store_true", help="delete repos and venvs")
223229

224230
ret = _Args(**vars(parser.parse_args(argv)))
231+
225232
if (ret.num_shards is not None) != (ret.shard_index is not None):
226233
parser.error("--shard-index and --num-shards must be used together")
234+
if ret.type_checker != "mypy" and ret.mypyc_compile_level is not None:
235+
parser.error("--mypyc-compile-level can only be used with --type-checker=mypy")
236+
if ret.debug_build and ret.type_checker not in {"pyrefly", "ty"}:
237+
parser.error(
238+
"`--debug-build` can only be used with `--type-checker=pyrefly` or `--type-checker=ty`"
239+
)
240+
227241
return ret
228242

229243

mypy_primer/main.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from mypy_primer.model import Project, TypeCheckResult
2020
from mypy_primer.projects import get_projects
2121
from mypy_primer.type_checker import (
22+
RustBuildMode,
2223
setup_mypy,
2324
setup_pyrefly,
2425
setup_pyright,
@@ -48,10 +49,17 @@ def setup_type_checker(
4849
kwargs = {"repo": ARGS.repo}
4950
elif ARGS.type_checker == "ty":
5051
setup_fn = setup_ty
51-
kwargs = {"repo": ARGS.repo}
52+
kwargs = {
53+
"repo": ARGS.repo,
54+
"build_mode": (RustBuildMode.DEBUG if ARGS.debug_build else RustBuildMode.RELEASE),
55+
}
5256
elif ARGS.type_checker == "pyrefly":
5357
setup_fn = setup_pyrefly
54-
kwargs = {"repo": ARGS.repo, "typeshed_dir": typeshed_dir}
58+
kwargs = {
59+
"repo": ARGS.repo,
60+
"typeshed_dir": typeshed_dir,
61+
"build_mode": (RustBuildMode.DEBUG if ARGS.debug_build else RustBuildMode.RELEASE),
62+
}
5563
else:
5664
raise ValueError(f"Unknown type checker {ARGS.type_checker}")
5765

mypy_primer/type_checker.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import enum
34
import os
45
import shutil
56
import subprocess
@@ -116,6 +117,7 @@ async def setup_ty(
116117
ty_dir: Path,
117118
revision_like: RevisionLike,
118119
*,
120+
build_mode: RustBuildMode,
119121
repo: str | None,
120122
) -> Path:
121123
ty_dir.mkdir(parents=True, exist_ok=True)
@@ -131,7 +133,7 @@ async def setup_ty(
131133

132134
try:
133135
await run(
134-
["cargo", "build", "--bin", "ty", "--release"],
136+
["cargo", "build", "--bin", "ty", *build_mode.flags()],
135137
cwd=repo_dir,
136138
env=env,
137139
output=True,
@@ -142,7 +144,7 @@ async def setup_ty(
142144
print(e.stderr, file=sys.stderr)
143145
raise e
144146

145-
ty_exe = cargo_target_dir / "release" / "ty"
147+
ty_exe = cargo_target_dir / build_mode.artifact_directory() / "ty"
146148
assert ty_exe.exists()
147149
return ty_exe
148150

@@ -151,6 +153,7 @@ async def setup_pyrefly(
151153
pyrefly_dir: Path,
152154
revision_like: RevisionLike,
153155
*,
156+
build_mode: RustBuildMode,
154157
repo: str | None,
155158
typeshed_dir: Path | None,
156159
) -> Path:
@@ -169,7 +172,7 @@ async def setup_pyrefly(
169172
if not os.environ.get("MYPY_PRIMER_NO_REBUILD", False):
170173
try:
171174
await run(
172-
["cargo", "build", "--release"],
175+
["cargo", "build", *build_mode.flags()],
173176
cwd=repo_dir / "pyrefly",
174177
env=env,
175178
output=True,
@@ -180,7 +183,7 @@ async def setup_pyrefly(
180183
print(e.stderr, file=sys.stderr)
181184
raise e
182185

183-
pyrefly_exe = repo_dir / "target" / "release" / "pyrefly"
186+
pyrefly_exe = repo_dir / "target" / build_mode.artifact_directory() / "pyrefly"
184187
assert pyrefly_exe.exists()
185188
return pyrefly_exe
186189

@@ -190,3 +193,20 @@ async def setup_typeshed(parent_dir: Path, *, repo: str, revision_like: Revision
190193
shutil.rmtree(parent_dir)
191194
parent_dir.mkdir(exist_ok=True)
192195
return await ensure_repo_at_revision(repo, parent_dir, revision_like)
196+
197+
198+
class RustBuildMode(enum.Enum):
199+
RELEASE = "release"
200+
DEBUG = "debug"
201+
202+
def flags(self) -> list[str]:
203+
if self == RustBuildMode.RELEASE:
204+
return ["--release"]
205+
else:
206+
return []
207+
208+
def artifact_directory(self) -> Path:
209+
if self == RustBuildMode.RELEASE:
210+
return Path("release")
211+
else:
212+
return Path("debug")

0 commit comments

Comments
 (0)