From 7c94ed61a55f8ae0c60737cbc6cfee3b5066ce11 Mon Sep 17 00:00:00 2001 From: Marco Edward Gorelli Date: Tue, 21 Dec 2021 16:20:55 +0000 Subject: [PATCH] Define is_name_token (and friends) to resolve some `type: ignore`s (GH-2714) Gets rid of a few # type: ignores by using TypeGuard. --- src/black/__init__.py | 5 +++-- src/black/linegen.py | 13 +++++++------ src/black/nodes.py | 28 ++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/black/__init__.py b/src/black/__init__.py index d8b9819..9bc8fc1 100644 --- a/src/black/__init__.py +++ b/src/black/__init__.py @@ -37,6 +37,7 @@ from mypy_extensions import mypyc_attr from black.const import DEFAULT_LINE_LENGTH, DEFAULT_INCLUDES, DEFAULT_EXCLUDES from black.const import STDIN_PLACEHOLDER from black.nodes import STARS, syms, is_simple_decorator_expression +from black.nodes import is_string_token from black.lines import Line, EmptyLineTracker from black.linegen import transform_line, LineGenerator, LN from black.comments import normalize_fmt_off @@ -1156,8 +1157,8 @@ def get_features_used( # noqa: C901 } for n in node.pre_order(): - if n.type == token.STRING: - value_head = n.value[:2] # type: ignore + if is_string_token(n): + value_head = n.value[:2] if value_head in {'f"', 'F"', "f'", "F'", "rf", "fr", "RF", "FR"}: features.add(Feature.F_STRINGS) diff --git a/src/black/linegen.py b/src/black/linegen.py index f234913..c1cd6fa 100644 --- a/src/black/linegen.py +++ b/src/black/linegen.py @@ -9,6 +9,7 @@ from black.nodes import WHITESPACE, RARROW, STATEMENT, STANDALONE_COMMENT from black.nodes import ASSIGNMENTS, OPENING_BRACKETS, CLOSING_BRACKETS from black.nodes import Visitor, syms, first_child_is_arith, ensure_visible from black.nodes import is_docstring, is_empty_tuple, is_one_tuple, is_one_tuple_between +from black.nodes import is_name_token, is_lpar_token, is_rpar_token from black.nodes import is_walrus_assignment, is_yield, is_vararg, is_multiline_string from black.nodes import is_stub_suite, is_stub_body, is_atom_with_invisible_parens from black.nodes import wrap_in_parentheses @@ -137,7 +138,7 @@ class LineGenerator(Visitor[Line]): """ normalize_invisible_parens(node, parens_after=parens) for child in node.children: - if child.type == token.NAME and child.value in keywords: # type: ignore + if is_name_token(child) and child.value in keywords: yield from self.line() yield from self.visit(child) @@ -813,9 +814,9 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None: elif node.type == syms.import_from: # "import from" nodes store parentheses directly as part of # the statement - if child.type == token.LPAR: + if is_lpar_token(child): # make parentheses invisible - child.value = "" # type: ignore + child.value = "" node.children[-1].value = "" # type: ignore elif child.type != token.STAR: # insert invisible parentheses @@ -861,11 +862,11 @@ def maybe_make_parens_invisible_in_atom(node: LN, parent: LN) -> bool: first = node.children[0] last = node.children[-1] - if first.type == token.LPAR and last.type == token.RPAR: + if is_lpar_token(first) and is_rpar_token(last): middle = node.children[1] # make parentheses invisible - first.value = "" # type: ignore - last.value = "" # type: ignore + first.value = "" + last.value = "" maybe_make_parens_invisible_in_atom(middle, parent=parent) if is_atom_with_invisible_parens(middle): diff --git a/src/black/nodes.py b/src/black/nodes.py index 8bf1934..75a2347 100644 --- a/src/black/nodes.py +++ b/src/black/nodes.py @@ -19,11 +19,15 @@ if sys.version_info >= (3, 8): from typing import Final else: from typing_extensions import Final +if sys.version_info >= (3, 10): + from typing import TypeGuard +else: + from typing_extensions import TypeGuard from mypy_extensions import mypyc_attr # lib2to3 fork -from blib2to3.pytree import Node, Leaf, type_repr +from blib2to3.pytree import Node, Leaf, type_repr, NL from blib2to3 import pygram from blib2to3.pgen2 import token @@ -260,8 +264,8 @@ def whitespace(leaf: Leaf, *, complex_subscript: bool) -> str: # noqa: C901 and prevp.parent and prevp.parent.type == syms.shift_expr and prevp.prev_sibling - and prevp.prev_sibling.type == token.NAME - and prevp.prev_sibling.value == "print" # type: ignore + and is_name_token(prevp.prev_sibling) + and prevp.prev_sibling.value == "print" ): # Python 2 print chevron return NO @@ -687,7 +691,7 @@ def is_yield(node: LN) -> bool: if node.type == syms.yield_expr: return True - if node.type == token.NAME and node.value == "yield": # type: ignore + if is_name_token(node) and node.value == "yield": return True if node.type != syms.atom: @@ -854,3 +858,19 @@ def ensure_visible(leaf: Leaf) -> None: leaf.value = "(" elif leaf.type == token.RPAR: leaf.value = ")" + + +def is_name_token(nl: NL) -> TypeGuard[Leaf]: + return nl.type == token.NAME + + +def is_lpar_token(nl: NL) -> TypeGuard[Leaf]: + return nl.type == token.LPAR + + +def is_rpar_token(nl: NL) -> TypeGuard[Leaf]: + return nl.type == token.RPAR + + +def is_string_token(nl: NL) -> TypeGuard[Leaf]: + return nl.type == token.STRING -- 2.39.5