def run_transformer(
    line: Line,
    transform: Transformer,
    mode: Mode,
    features: Collection[Feature],
    *,
    line_str: str = "",
) -> List[Line]:
    if not line_str:
        line_str = line_to_string(line)
    result: List[Line] = []
    for transformed_line in transform(line, features):
        if str(transformed_line).strip("\n") == line_str:
            raise CannotTransform(
                "Line transformer returned an unchanged result")

        result.extend(
            transform_line(transformed_line, mode=mode, features=features))

    if (transform.__class__.__name__ != "rhs"
            or not line.bracket_tracker.invisible
            or any(bracket.value for bracket in line.bracket_tracker.invisible)
            or line.contains_multiline_strings()
            or result[0].contains_uncollapsable_type_comments()
            or result[0].contains_unsplittable_type_ignore()
            or is_line_short_enough(result[0], line_length=mode.line_length)
            # If any leaves have no parents (which _can_ occur since
            # `transform(line)` potentially destroys the line's underlying node
            # structure), then we can't proceed. Doing so would cause the below
            # call to `append_leaves()` to fail.
            or any(leaf.parent is None for leaf in line.leaves)):
        return result

    line_copy = line.clone()
    append_leaves(line_copy, line, line.leaves)
    features_fop = set(features) | {Feature.FORCE_OPTIONAL_PARENTHESES}
    second_opinion = run_transformer(line_copy,
                                     transform,
                                     mode,
                                     features_fop,
                                     line_str=line_str)
    if all(
            is_line_short_enough(ln, line_length=mode.line_length)
            for ln in second_opinion):
        result = second_opinion
    return result
Beispiel #2
0
def run_transformer(
    line: Line,
    transform: Transformer,
    mode: Mode,
    features: Collection[Feature],
    *,
    line_str: str = "",
) -> List[Line]:
    if not line_str:
        line_str = line_to_string(line)
    result: List[Line] = []
    for transformed_line in transform(line, features):
        if str(transformed_line).strip("\n") == line_str:
            raise CannotTransform(
                "Line transformer returned an unchanged result")

        result.extend(
            transform_line(transformed_line, mode=mode, features=features))

    if not (transform.__name__ == "rhs" and line.bracket_tracker.invisible
            and not any(bracket.value
                        for bracket in line.bracket_tracker.invisible)
            and not line.contains_multiline_strings()
            and not result[0].contains_uncollapsable_type_comments()
            and not result[0].contains_unsplittable_type_ignore() and
            not is_line_short_enough(result[0], line_length=mode.line_length)):
        return result

    line_copy = line.clone()
    append_leaves(line_copy, line, line.leaves)
    features_fop = set(features) | {Feature.FORCE_OPTIONAL_PARENTHESES}
    second_opinion = run_transformer(line_copy,
                                     transform,
                                     mode,
                                     features_fop,
                                     line_str=line_str)
    if all(
            is_line_short_enough(ln, line_length=mode.line_length)
            for ln in second_opinion):
        result = second_opinion
    return result