public override object VisitMethodFeature([NotNull] CoolParser.MethodFeatureContext context)
        {
            List <Tuple <string, Type> > parameters = new List <Tuple <string, Type> >();

            foreach (var formal in context.formal())
            {
                Tuple <string, Type> t = (Tuple <string, Type>)(Visit(formal));
                parameters.Add(t);
            }
            Type outputType = new Type(context.TYPE().GetText(), null, new Coord(0, 0));

            if (p.Types.ContainsKey(context.TYPE().GetText()))
            {
                outputType = p.Types[context.TYPE().GetText()];
            }
            else
            {
                p.Types[context.TYPE().GetText()] = outputType;
            }
            Expression exp = (Expression)Visit(context.expresion());

            Coord c = new Coord(context.Depth(), context.getAltNumber());

            return(new Method(context.ID().GetText(), outputType, parameters, exp, c));
        }
        public MethodNode(CoolParser.MethodFeatureContext context, Node s) : base(s.Childs)
        {
            Symbols = new Dictionary <string, ClassNode>();
            Params  = new Dictionary <string, AttributeNode>();
            //Variables = new Dictionary<string, AttributeNode>();

            CoolParser.ClassdefContext p = (CoolParser.ClassdefContext)context.Parent;
            var classname = p.t.Text;
            var type      = "Object";

            if (context.TYPE().GetText() != null)
            {
                type = context.TYPE().GetText();
            }

            var name = context.ID().GetText();

            Name = name;
            SetType(SymbolTable.Classes[type]);
            //Method c;
            if (SymbolTable.Classes.ContainsKey(type) && !(SymbolTable.Classes[classname].Methods.ContainsKey(name)))// if you know my type and not myself
            {
                //c = new Method(name, SymbolTable.Classes[type])
                {
                    Expression = context.expresion();// this shouln't be on the ctor
                    Self       = context;
                }
                SymbolTable.Classes[classname].Methods.Add(Name, this);//let me introduce myself
                var formals = context.formal();
                //foreach (var item in formals)// add the parameters of the method
                //{
                //    //SymbolTable.Classes[classname].Methods[name].Params.Add(item.id.Text, new FormalNode(item.id.Text, SymbolTable.Classes[item.t.Text]));
                //}
                foreach (var item in Childs)
                {
                    try{ SymbolTable.Classes[classname].Methods[name].Params.Add(((FormalNode)item).ID, new AttributeNode(((FormalNode)item).ID, ((FormalNode)item).GetType())); }catch (System.Exception) {}
                }
            }
            this.context = context;
            var d = (CoolParser.ClassdefContext)context.Parent;

            this.ClassName = d.TYPE(0).GetText();// + ".";
            //this.Childs = s.Childs;
            this.Name = context.ID().GetText();
            if (ClassName.ToLower() == "main")
            {
                ClassName = "";
            }
            foreach (var item in Params)
            {
                Symbols.Add(item.Key, item.Value.GetType());// maybe here we could make a dict of atributes but i think this will be harder after in other places and since i only need the class :)
            }
        }