Esempio n. 1
0
        public override bool VisitRecordDeclaration(RecordDeclarationAST recordDeclaration)
        {
            recordDeclaration.CurrentScope = _scope;

            //se asuma que no habra problemas
            recordDeclaration.ReturnType = TigerType.GetType <NoType>();
            //la clase base verifica el ID del type
            if (VisitTypeDeclaration(recordDeclaration))
            {
                var rt = new RecordType(recordDeclaration.TypeId);
                //se anade el record creado al scope para q puedan haber records recursivos en su def
                _scope.AddType(recordDeclaration.TypeId, rt);
                //se verifica cada una de las declaraciones de los campos del record
                int savedErrorPos = _errorListener.Count;
                foreach (var kvp in recordDeclaration.Fields)
                {
                    if (!rt.Contains(kvp.Key))
                    {
                        TigerType tt;
                        if (_scope.HasType(kvp.Value, out tt) == ScopeLocation.NotDeclared)
                        {
                            KeyValuePair <string, string> savedKvp = kvp;
                            _scope.TypeAdded += (sender, args) =>
                            {
                                if (args.TypeName == savedKvp.Value)
                                {
                                    rt.AddField(savedKvp.Key, args.NewType);
                                }
                            };
                            _scope.FinalizeScope += (sender, args) =>
                            {
                                if (sender.HasType(savedKvp.Value) ==
                                    ScopeLocation.NotDeclared)
                                {
                                    _errorListener.Insert(savedErrorPos,
                                                          new AnalysisError(
                                                              string.Format(
                                                                  AnalysisError.LoadMessage("TypeUndecl"),
                                                                  savedKvp.Value), recordDeclaration.Line, recordDeclaration.Columns));
                                    recordDeclaration.ReturnType = TigerType.GetType <ErrorType>();
                                }
                            };
                        }
                        else
                        {
                            rt.AddField(kvp.Key, tt);
                        }
                    }
                    else
                    {
                        _errorListener.Add(new AnalysisError(string.Format(AnalysisError.LoadMessage("RecDecl"), kvp.Key, recordDeclaration.TypeId),
                                                             recordDeclaration.Line, recordDeclaration.Columns));
                    }
                }
                //TODO aqui se ve el prob con los ret Types y los return true pq no se puede decir nada en este momento
                return(true);
            }
            return(false);
        }
Esempio n. 2
0
        public override bool VisitRecordDeclaration(RecordDeclarationAST recordDeclaration)
        {
            var other = _other as RecordDeclarationAST;

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

            return(other.Fields.Count == recordDeclaration.Fields.Count &&
                   other.Fields.Zip(recordDeclaration.Fields, (x, y) => x.Key == y.Key && x.Value == y.Value).All(x => x) &&
                   (other.TypeId == recordDeclaration.TypeId));
        }
Esempio n. 3
0
        public override Unit VisitRecordDeclaration(RecordDeclarationAST recordDeclaration)
        {
            ModuleBuilder mod          = code.Module;
            string        typeCodeName = recordDeclaration.CurrentScope.GetTypeInfo(recordDeclaration.TypeId).CodeName;
            //definiendo el tipo en IL
            //esto es para pedir el tipo ,si  ya esta me lo devuelve sino me lo crea.
            var type = (TypeBuilder)code.GetTypeBuilderMaybeNotCreated(typeCodeName);

            FieldBuilder field;
            Type         itemType;

            foreach (var item in recordDeclaration.Fields)
            {
                //aca es para coger el type del campo
                // es posible que el tipo de este campo no exista todavia por tanto esta es la funcion a usar.
                itemType = CreateTypeNotFounded(recordDeclaration, item.Value);
                //aca es para crear el campo.
                type.DefineField(item.Key, itemType, FieldAttributes.Public | FieldAttributes.HasDefault);
                //guardar estos campos .
            }
            //crear el tipo
            type.CreateType();
            return(Unit.Create());
        }
Esempio n. 4
0
 public abstract T VisitRecordDeclaration(RecordDeclarationAST recordDeclaration);