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
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