Beispiel #1
0
        public override bool VisitRecordInstantiation(RecordInstantiationAST recordInstantiation)
        {
            var other = _other as RecordInstantiationAST;

            if (other == null)
            {
                return(false);
            }

            return(other.Id == recordInstantiation.Id &&
                   IsEqualNodes(other.Fields, recordInstantiation.Fields));
        }
Beispiel #2
0
        public override Unit VisitRecordInstantiation(RecordInstantiationAST recordInstantiation)
        {
            //--->
            bool pushOnStack = code.PushOnStack;

            //crear un instancia de la clase que representa al record
            string recordCodeName = recordInstantiation.CurrentScope.GetTypeInfo(recordInstantiation.Id).CodeName;
            Type   type           = code.DefinedType[recordCodeName];

            ILGenerator il = code.Method.GetILGenerator();

            //crear la instancia del objeto
            il.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));

            //Guardar localmente una referencia al record un LocalBuilder dentro del metodo
            LocalBuilder local = il.DeclareLocal(type);

            //guardar la instancia en la variable local.
            il.Emit(OpCodes.Stloc, local.LocalIndex);

            var rt = (RecordType)recordInstantiation.CurrentScope.GetType(recordInstantiation.Id);

            foreach (var item in recordInstantiation.ExpressionValue)
            {
                //cargar la instancia de la clase.
                il.Emit(OpCodes.Ldloc, local.LocalIndex);
                pushOnStack = true;
                //generar el codigo para inicializar el campo
                item.Value.Accept(this);
                //asignarle  el valor al field

                il.Emit(OpCodes.Stfld, type.GetField(item.Key));
            }
            //dejar la instancia del tipo en la pila
            il.Emit(OpCodes.Ldloc, local.LocalIndex);

            if (!pushOnStack)
            {
                il.Emit(OpCodes.Pop);
            }
            //<---
            code.PushOnStack = pushOnStack;

            return(Unit.Create());
        }
Beispiel #3
0
        public override bool VisitRecordInstantiation(RecordInstantiationAST recordInstantiation)
        {
            recordInstantiation.CurrentScope = _scope;

            TigerType  tt;
            RecordType rt;

            //verificando que exista el tipo,
            if (_scope.HasType(recordInstantiation.Id, out tt) != ScopeLocation.NotDeclared && (rt = tt as RecordType) != null)
            {
                recordInstantiation.ReturnType = rt;
                if (recordInstantiation.ExpressionValue == null)
                {
                    return(true);
                }

                foreach (var kvp in recordInstantiation.ExpressionValue)
                {
                    kvp.Value.Accept(this);
                    if (rt.Contains(kvp.Key))
                    {
                        if (kvp.Value.ReturnType.CanConvertTo(rt[kvp.Key]))
                        {
                            continue;
                        }
                        _errorListener.Add(
                            new AnalysisError(
                                string.Format(AnalysisError.LoadMessage("Match"), kvp.Value.ReturnType, rt[kvp.Key].TypeID),
                                recordInstantiation.Line, recordInstantiation.Columns));
                    }
                    else
                    {
                        _errorListener.Add(new AnalysisError(string.Format(AnalysisError.LoadMessage("RecField"), recordInstantiation.Id, kvp.Key), recordInstantiation.Line,
                                                             recordInstantiation.Columns));
                    }
                    recordInstantiation.ReturnType = TigerType.GetType <ErrorType>();
                }
                return(recordInstantiation.ReturnType != TigerType.GetType <ErrorType>());
            }
            recordInstantiation.ReturnType = TigerType.GetType <ErrorType>();
            _errorListener.Add(AnalysisError.TypeIsNotDefined(recordInstantiation, recordInstantiation.Id));
            return(false);
        }
Beispiel #4
0
 public abstract T VisitRecordInstantiation(RecordInstantiationAST recordInstantiation);