public virtual IHolderCil Visit(SelfDispatchContext parserRule, IFunctionCil cilTree, IContextCil contextCil)
        {
            var Params = new List <IHolderCil>();

            foreach (var expr in parserRule._expresions)
            {
                //genera el codigo de cada parametro que le paso a los metodos
                var param = Visit(expr, cilTree, contextCil);
                Params.Add(param);
            }
            //Averiguo el tipo dinamico de self es decir( el de la clase que esta usando la funcion en ese momento)
            var varType = new LocalCil($"_Type{cilTree.ThreeDirInses.Count}");

            cilTree.LocalCils.Add(varType);
            var self = cilTree.self;

            cilTree.ThreeDirInses.Add(new TypeOf(varType, self));
            //cada parametro los anado al metodo puede que tenga sentido pasarlos al revez
            cilTree.ThreeDirInses.Add(new ArgExprCil(self));
            foreach (var param in Params)
            {
                cilTree.ThreeDirInses.Add(new ArgExprCil(param));
            }
            //ITypeCil typeCil;
            ////resuelve el metodo en cil de ese tipo estatico
            var functionCil = typeCil.GetFunctionCilsByCoolName(parserRule.id.Text);
            ////nueva variable donde se almacena el valor que retorna el metodo
            var value = new LocalCil($"_value{cilTree.LocalCils.Count}");

            cilTree.LocalCils.Add(value);
            cilTree.ThreeDirInses.Add(new VCallCil(value, varType, functionCil));
            return(value);
        }
 public void Visit(SelfDispatchContext parserRule, IObjectContext <IVar, IVar> context)
 {
     foreach (var expr in parserRule._expresions)
     {
         Visit(expr, context);
     }
     if (!type.IsDefineMethod(parserRule.id.Text))
     {
         errorLogger.LogError($"({parserRule.id.Line},{parserRule.id.Column + 1}) - AttributeError: The type {type.Name} does not contain a method definition named '{parserRule.id.Text}'");
         parserRule.computedType = globalContext.Undefined;
     }
     else
     {
         //Si esta definido el metodo comparamos chequemos los tipos que recibe el metodo
         var method = type.GetMethod(parserRule.id.Text);
         //Los tipos computados los almaceno en un IEnumerable
         var types_expresions = (from t in parserRule._expresions select t.computedType).ToArray();
         if (parserRule._expresions.Count != method.Formals.Length)
         {
             errorLogger.LogError($"({parserRule.id.Line},{parserRule.id.Column + 1})- SemanticError: No overload for method '{parserRule.id.Text}' takes {parserRule._expresions.Count} arguments");
         }
         else
         {
             for (int i = 0; i < types_expresions.Length; i++)
             {
                 if (!types_expresions[i].Conform(method.Formals[i].Type))
                 {
                     errorLogger.LogError($"({parserRule.Start.Line},{parserRule.Start.Column + 1}) - Type Error : In the dispatch of the method {method.ID} the static type of the {i}th actual parameter '{types_expresions[i].Name}' not conform to the declared type of the {i}th formal parameter the type {method.Formals[i].Type.Name}");
                 }
             }
         }
         //es como el dispatch anterior pero la primera expresion es self
         parserRule.computedType = method.Type.DispatchComputedType(new SelfType(type, globalContext));
     }
 }