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); }
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)); }
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()); }
public abstract T VisitRecordDeclaration(RecordDeclarationAST recordDeclaration);