public void Visit(StructValue sv)
        {
            var st = GetStructType(sv.Name);

            Raise <TypeCheckException> .IfAreNotEqual(st.Fields.Count, sv.Values.Count, "Wrong field count");

            for (var i = 0; i < st.Fields.Count; ++i)
            {
                sv.Values[i].Accept(this);
                Raise <TypeCheckException> .IfAreNotSame(st.Fields[i].Type, sv.Values[i].Type, "Wrong field type");
            }
            sv.Type = _result = st;
            sv.Temp = _currFunc.AddVariable("$" + _tempCounter++, st);
        }
        public void Visit(FunctionCall fc)
        {
            Raise <TypeCheckException> .If(!_funcDecls.ContainsKey(fc.FunctionName), "Function not existing");

            var fd = _funcDecls[fc.FunctionName];

            Raise <TypeCheckException> .IfAreNotEqual(fc.Arguments.Count, fd.Params.Count, "Wrong argument count!");

            for (var i = 0; i < fd.Params.Count; ++i)
            {
                fc.Arguments[i].Accept(this);
                Raise <TypeCheckException> .IfAreNotSame(fc.Arguments[i].Type, fd.Params[i].Type, "Wrong parameter type");
            }
            fc.Function = fd;
            fc.Type     = _result = fd.ReturnType;
        }