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)); }
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()); }
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); }
public abstract T VisitRecordInstantiation(RecordInstantiationAST recordInstantiation);