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)); } }