# Copyright (c) 2017 Claudiu Popa <pcmanticore@gmail.com>

# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER

import sys

import astroid


def _clone_node_with_lineno(node, parent, lineno):
    cls = node.__class__
    other_fields = node._other_fields
    _astroid_fields = node._astroid_fields
    init_params = {
        'lineno': lineno,
        'col_offset': node.col_offset,
        'parent': parent
    }
    postinit_params = {
        param: getattr(node, param)
        for param in _astroid_fields
    }
    if other_fields:
        init_params.update({
            param: getattr(node, param)
            for param in other_fields
        })
    new_node = cls(**init_params)
    if hasattr(node, 'postinit') and _astroid_fields:
        new_node.postinit(**postinit_params)
    return new_node


def _transform_formatted_value(node):
    if node.value and node.value.lineno == 1:
        if node.lineno != node.value.lineno:
            new_node = astroid.FormattedValue(
                lineno=node.lineno,
                col_offset=node.col_offset,
                parent=node.parent
            )
            new_value = _clone_node_with_lineno(
                node=node.value,
                lineno=node.lineno,
                parent=new_node
            )
            new_node.postinit(value=new_value,
                              format_spec=node.format_spec)
            return new_node


if sys.version_info[:2] >= (3, 6):
    # TODO: this fix tries to *patch* http://bugs.python.org/issue29051
    # The problem is that FormattedValue.value, which is a Name node,
    # has wrong line numbers, usually 1. This creates problems for pylint,
    # which expects correct line numbers for things such as message control.
    astroid.MANAGER.register_transform(
        astroid.FormattedValue,
        _transform_formatted_value)
