#!/usr/bin/python

"""
This catches upcasts like this: Some_Type * const an_identifier =
dynamic_cast<Some_Type *>(source) This is unnecessarily verbose and should be
abbreviated with the upcast macro: upcast(Some_Type, an_identifier, source)
"""

regexp=r"""(^\s*|[^:][^_a-zA-Z0-9]|:[^: ]) *(([_a-zA-Z][_a-zA-Z0-9]* *::)* *[_a-zA-Z][_a-zA-Z0-9]*(( +const)? *\*)*) *(const *)?\* *const +[_a-zA-Z][_a-zA-Z0-9]* *= *dynamic_cast *< *\2 *(const *)?\* *>"""

error_msg = "Your upcast is ugly. Use upcast() macro!"

forbidden = [
    '	B_t * const hej = dynamic_cast<B_t *>(du);',
    'if (B_t const * const hej = dynamic_cast<B_t *>(du)) {',
    'B_t const*const hej=dynamic_cast  < B_t* >(du)) {',
    'const B_t *const hej=dynamic_cast<B_t*>',
    'MN:B_t *const hej=dynamic_cast<B_t*>',
    'MN::B_t *const hej=dynamic_cast<MN::B_t*>',
    ' B_t const * const hej=dynamic_cast<B_t const*>',
    'B_t const * const hej=dynamic_cast<B_t const*>',
]


allowed = [
    'Some_Type ha = dynamic_cast<Some_Type>',
    'Some_Type ha = dynamic_cast<Some_Typ>',
    'const B_t * hej = dymamic_cast<B_t *>',
    'MN::B_t *const hej=dynamic_cast<B_t*>',
]


