/// <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);
                }
            }
        }
Example #2
0
        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());
        }