Skip to content

Commit

Permalink
Define is_name_token (and friends) to resolve some type: ignores (G…
Browse files Browse the repository at this point in the history
…H-2714)

Gets rid of a few # type: ignores by using TypeGuard.
  • Loading branch information
MarcoGorelli authored Dec 21, 2021
1 parent 389e9c2 commit 7c94ed6
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 12 deletions.
5 changes: 3 additions & 2 deletions src/black/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
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
Expand Down Expand Up @@ -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)

Expand Down
13 changes: 7 additions & 6 deletions src/black/linegen.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
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
Expand Down Expand Up @@ -137,7 +138,7 @@ def visit_stmt(
"""
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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down
28 changes: 24 additions & 4 deletions src/black/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,15 @@
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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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

0 comments on commit 7c94ed6

Please sign in to comment.