#!/usr/bin/env python
#
# Copyright (c) 2013 Microsoft Corporation. All rights reserved.
# Released under Apache 2.0 license as described in the file LICENSE.
#
# Author: Soonho Kong
#
# What's this?
# ============
# It takes an input from stdin and demangle c++ type if the line
# matches the following patten:
#
#     .* : <C++_TYPE> := .*
#
# which, is the format that we are using in lean_assert.
#
# It calls "c++filt" to do the work.
#
import re
import sys
import subprocess
import fileinput

pattern_str = "(.* : )([A-Za-z0-9]+)( := .*)"
pattern = re.compile(pattern_str)
cppfilt = "c++filt"
cppfilt_option = "--types"

def process_line(line):
    result = pattern.match(line);
    if result == None:
        print line,
    else:
        p = subprocess.Popen(cppfilt + " " + cppfilt_option + " " + result.group(2),
                             shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        ty = p.stdout.readlines()[0].strip()
        retval= p.wait()
        new_str = re.sub(pattern_str, r"\1" + ty + r"\3", line);
        print new_str,

if len(sys.argv) > 1:
    for line in fileinput.input():
        process_line(line)
else:
    while True:
        line = sys.stdin.readline()
        if not line:
            break
        process_line(line)