/// <summary> /// Esta metodo annade todas los campos necesarios a la clase nested. Annade tambien un campo que es una referencia /// padre. /// </summary> /// <param name="code"></param> /// <param name="nested">El tipo nested</param> /// <param name="typeCodeInfo">la informacion asociada al tipo nested</param> /// <param name="container">El padre del tipo nested</param> private void PopulateNestedTypeWithVar(ILCode code, TypeBuilder nested, TypeCodeInfo typeCodeInfo, TypeBuilder container) { //annadir un field del tipo de mi padre typeCodeInfo.FieldNameOfParent = "parent"; FieldBuilder fieldRefPadreClass = nested.DefineField(typeCodeInfo.FieldNameOfParent, container, FieldAttributes.Public); //le annado a la clase TypeCodeInfo que ahora tiene un nuevo campo(la referencia al padre) typeCodeInfo.AddField(typeCodeInfo.FieldNameOfParent, fieldRefPadreClass); FunctionInfo funInfo = _functionDecl.CurrentScope.GetFunction(_functionDecl.FunctionId); foreach (var item in funInfo.VarsUsedForAnotherFunction) { if (item.IsParameterFunction) { Type fieldType = code.DefinedType[item.TypeInfo.CodeName]; FieldBuilder field = nested.DefineField(item.CodeName, fieldType, FieldAttributes.Public); code.DefinedField.Add(item.CodeName, field); //annadir el nuevo campo a la clase que me controlo los campos de un tipo nested typeCodeInfo.AddField(item.CodeName, field); } } }
public override Unit VisitVarDeclaration(VarDeclarationAST expr) { VarInfo varInfo = expr.CurrentScope.GetVarInfo(expr.Id); //nombre de la variable generado string varCodeName = varInfo.CodeName; // necesito el tipo de la variable. string typeCodeName = varInfo.TypeInfo.CodeName; Type varType = code.DefinedType[typeCodeName]; //aca hay que tener en cuenta que las variable que son usadas por otras funciones se declaran en la declaracion de //la funcion a la que pertenecen if (!varInfo.IsUsedForAnotherFunction) { if (!varInfo.IsParameterFunction) //no tengo en cuenta los parametro de funcion porque esos los declara la funcion { //generar la variable como local a la funcion ILGenerator il = code.Method.GetILGenerator(); LocalBuilder local = il.DeclareLocal(varType); // local.SetLocalSymInfo(varCodeName); //adicionarla a las varibles locales code.DefinedLocal.Add(varCodeName, local); } } else { if (!varInfo.IsParameterFunction) { string currentFunction = expr.CurrentScope.CurrentFunction.CodeName; TypeCodeInfo wrapper = code.GetWrapperAsociatteTo(currentFunction); FieldBuilder field = wrapper.Type.DefineField(varInfo.CodeName, varType, FieldAttributes.Public); //añadir el field a la clase ILCode code.DefinedField.Add(varInfo.CodeName, field); //añadida al wrapper wrapper.AddField(varCodeName, field); } } //generar la inicializacion de la variable code.OnBeginMethod += (theCode, e) => code_OnBeginMethod_var(expr, theCode, e); return(Unit.Create()); }