from _typeshed import Incomplete
from argparse import Namespace
from ast import AST
from collections.abc import Generator
from logging import Logger
from tokenize import TokenInfo
from typing import Any, Final, TypeAlias

from .plugins.finder import LoadedPlugin

LOG: Logger
NEWLINE: Final[frozenset[int]]
SKIP_TOKENS: Final[frozenset[int]]

_LogicalMapping: TypeAlias = list[tuple[int, tuple[int, int]]]
_Logical: TypeAlias = tuple[list[str], list[str], _LogicalMapping]

class FileProcessor:
    noqa: bool
    options: Incomplete
    filename: Incomplete
    lines: Incomplete
    blank_before: int
    blank_lines: int
    checker_state: Incomplete
    hang_closing: Incomplete
    indent_char: Incomplete
    indent_level: int
    indent_size: Incomplete
    line_number: int
    logical_line: str
    max_line_length: Incomplete
    max_doc_length: Incomplete
    multiline: bool
    previous_indent_level: int
    previous_logical: str
    previous_unindented_logical_line: str
    tokens: Incomplete
    total_lines: Incomplete
    verbose: Incomplete
    statistics: Incomplete
    def __init__(self, filename: str, options: Namespace, lines: list[str] | None = None) -> None: ...
    @property
    def file_tokens(self) -> list[TokenInfo]: ...
    def tstring_start(self, lineno: int) -> None: ...
    def fstring_start(self, lineno: int) -> None: ...
    def multiline_string(self, token: TokenInfo) -> Generator[str]: ...
    def reset_blank_before(self) -> None: ...
    def delete_first_token(self) -> None: ...
    def visited_new_blank_line(self) -> None: ...
    def update_state(self, mapping: _LogicalMapping) -> None: ...
    def update_checker_state_for(self, plugin: LoadedPlugin) -> None: ...
    def next_logical_line(self) -> None: ...
    def build_logical_line_tokens(self) -> _Logical: ...
    def build_ast(self) -> AST: ...
    def build_logical_line(self) -> tuple[str, str, _LogicalMapping]: ...
    def keyword_arguments_for(self, parameters: dict[str, bool], arguments: dict[str, Any]) -> dict[str, Any]: ...
    def generate_tokens(self) -> Generator[TokenInfo]: ...
    def noqa_line_for(self, line_number: int) -> str | None: ...
    def next_line(self) -> str: ...
    def read_lines(self) -> list[str]: ...
    def read_lines_from_filename(self) -> list[str]: ...
    def read_lines_from_stdin(self) -> list[str]: ...
    def should_ignore_file(self) -> bool: ...
    def strip_utf_bom(self) -> None: ...

def is_eol_token(token: TokenInfo) -> bool: ...
def is_multiline_string(token: TokenInfo) -> bool: ...
def token_is_newline(token: TokenInfo) -> bool: ...
def count_parentheses(current_parentheses_count: int, token_text: str) -> int: ...
def expand_indent(line: str) -> int: ...
def mutate_string(text: str) -> str: ...
