From ba27c72861f3d07b20ee34745ae6cb0f219a009b Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Sun, 11 Jun 2023 22:39:18 -0400 Subject: backends/ninja: add sundry typing improvements --- mesonbuild/backend/ninjabackend.py | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 257d7d6..348d0c9 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -56,6 +56,7 @@ if T.TYPE_CHECKING: from ..compilers.cs import CsCompiler from ..compilers.fortran import FortranCompiler + CommandArgOrStr = T.List[T.Union['NinjaCommandArg', str]] RUST_EDITIONS = Literal['2015', '2018', '2021'] @@ -64,20 +65,20 @@ FORTRAN_MODULE_PAT = r"^\s*\bmodule\b\s+(\w+)\s*(?:!+.*)*$" FORTRAN_SUBMOD_PAT = r"^\s*\bsubmodule\b\s*\((\w+:?\w+)\)\s*(\w+)" FORTRAN_USE_PAT = r"^\s*use,?\s*(?:non_intrinsic)?\s*(?:::)?\s*(\w+)" -def cmd_quote(s): +def cmd_quote(arg: str) -> str: # see: https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw#remarks # backslash escape any existing double quotes # any existing backslashes preceding a quote are doubled - s = re.sub(r'(\\*)"', lambda m: '\\' * (len(m.group(1)) * 2 + 1) + '"', s) + arg = re.sub(r'(\\*)"', lambda m: '\\' * (len(m.group(1)) * 2 + 1) + '"', arg) # any terminal backslashes likewise need doubling - s = re.sub(r'(\\*)$', lambda m: '\\' * (len(m.group(1)) * 2), s) + arg = re.sub(r'(\\*)$', lambda m: '\\' * (len(m.group(1)) * 2), arg) # and double quote - s = f'"{s}"' + arg = f'"{arg}"' - return s + return arg -def gcc_rsp_quote(s): +def gcc_rsp_quote(s: str) -> str: # see: the function buildargv() in libiberty # # this differs from sh-quoting in that a backslash *always* escapes the @@ -99,7 +100,7 @@ else: rmfile_prefix = ['rm', '-f', '{}', '&&'] -def get_rsp_threshold(): +def get_rsp_threshold() -> int: '''Return a conservative estimate of the commandline size in bytes above which a response file should be used. May be overridden for debugging by setting environment variable MESON_RSP_THRESHOLD.''' @@ -129,7 +130,7 @@ raw_names = {'DEPFILE_UNQUOTED', 'DESC', 'pool', 'description', 'targetdep', 'dy NINJA_QUOTE_BUILD_PAT = re.compile(r"[$ :\n]") NINJA_QUOTE_VAR_PAT = re.compile(r"[$ \n]") -def ninja_quote(text: str, is_build_line=False) -> str: +def ninja_quote(text: str, is_build_line: bool = False) -> str: if is_build_line: quote_re = NINJA_QUOTE_BUILD_PAT else: @@ -159,22 +160,22 @@ class Quoting(Enum): none = 3 class NinjaCommandArg: - def __init__(self, s, quoting = Quoting.both): + def __init__(self, s: str, quoting: Quoting = Quoting.both) -> None: self.s = s self.quoting = quoting - def __str__(self): + def __str__(self) -> str: return self.s @staticmethod - def list(l, q): + def list(l: str, q: Quoting) -> T.List[NinjaCommandArg]: return [NinjaCommandArg(i, q) for i in l] @dataclass class NinjaComment: comment: str - def write(self, outfile): + def write(self, outfile: T.TextIO) -> None: for l in self.comment.split('\n'): outfile.write('# ') outfile.write(l) @@ -182,11 +183,12 @@ class NinjaComment: outfile.write('\n') class NinjaRule: - def __init__(self, rule, command, args, description, - rspable = False, deps = None, depfile = None, extra = None, + def __init__(self, rule: str, command: CommandArgOrStr, args: CommandArgOrStr, + description: str, rspable: bool = False, deps: T.Optional[str] = None, + depfile: T.Optional[str] = None, extra: T.Optional[str] = None, rspfile_quote_style: RSPFileSyntax = RSPFileSyntax.GCC): - def strToCommandArg(c): + def strToCommandArg(c: T.Union[NinjaCommandArg, str]) -> NinjaCommandArg: if isinstance(c, NinjaCommandArg): return c @@ -209,8 +211,8 @@ class NinjaRule: return NinjaCommandArg(c) self.name = rule - self.command = [strToCommandArg(c) for c in command] # includes args which never go into a rspfile - self.args = [strToCommandArg(a) for a in args] # args which will go into a rspfile, if used + self.command: T.List[NinjaCommandArg] = [strToCommandArg(c) for c in command] # includes args which never go into a rspfile + self.args: T.List[NinjaCommandArg] = [strToCommandArg(a) for a in args] # args which will go into a rspfile, if used self.description = description self.deps = deps # depstyle 'gcc' or 'msvc' self.depfile = depfile @@ -235,7 +237,7 @@ class NinjaRule: # fallthrough return ninja_quote(qf(str(x))) - def write(self, outfile): + def write(self, outfile: T.TextIO) -> None: if self.rspfile_quote_style is RSPFileSyntax.MSVC: rspfile_quote_func = cmd_quote else: -- cgit v1.1