//Определение типов данных и формирование порожденных параметров public void DefineDataTypes() { foreach (var node in Expr1.Nodes) { node.DefineType(); } var last = Expr1.Nodes.Last(); if (last.Type.DataType != DataType.Void) { var resVar = Vars["calc"]; resVar.Type = resVar.Type.Add(last.Type); } foreach (var node in Expr2.Nodes) { node.DefineType(); } last = Expr2.Nodes.Last(); Type = last.Type; if (Type is ObjectType || Type is BaseObjectType) { MetSignals = Keeper.GetMetSignals(last); MetProps = Keeper.GetMetProps(last); } }
//Сформировать используемые сигналы и свойства по входам типа объекта private void MakeUsedMetSignals() { for (int i = 0; i < Args.Length; i++) { var imet = Param.InputsList[i].MetSignals; if (imet != null) { var amet = Keeper.GetMetSignals(Args[i]); if (amet != null) { foreach (var m in imet.Values) { amet.Add(m); } } if (Args[i].Type is TablikObject) { var ob = (TablikObject)Args[i].Type; var sigs = ob.ObjectType.Signals; foreach (var sigCode in imet.Values) { if (ob.UsedSignals.Contains(sigs[sigCode])) { ob.UsedSignals.Add(sigs[sigCode]); } } } } var iprop = Param.InputsList[i].MetProps; if (iprop != null) { var aprop = Keeper.GetMetProps(Args[i]); if (aprop != null) { foreach (var p in iprop.Values) { aprop.Add(p); } } if (Args[i].Type is TablikObject) { var ob = (TablikObject)Args[i].Type; foreach (var propCode in iprop.Values) { if (ob.UsedProps.ContainsKey(propCode)) { ob.UsedProps.Add(propCode, ob.Props[propCode]); } } } } } }
//Определение типа данных public override void DefineType() { var val = Args[0]; Var.Type = Var.Type.Add(val.Type); if (Var.Type.DataType == DataType.Error) { AddError("Несовместимость типов данных при присвоении переменной"); } Type = new SimpleType(DataType.Void); if (Var.Type is ObjectType || Var.Type is BaseObjectType) { Var.MetSignals = Keeper.GetMetSignals(val); Var.MetProps = Keeper.GetMetProps(val); } }
//Определение типа данных public override void DefineType() { if (Parent.Type is TablikObject) { var ob = (TablikObject)Parent.Type; if (ob.Props.ContainsKey(Prop.Text)) { var prop = ob.Props[Prop.Text]; Type = new SimpleType(prop.DataType); if (!ob.UsedProps.ContainsKey(Prop.Text)) { ob.UsedProps.Add(Prop.Text, prop); } } else { AddError("Не найдено свойство", Prop); } } else if (Parent.Type is ObjectType || Parent.Type is BaseObjectType) { var metProps = Keeper.GetMetProps(Parent); if (((ITablikSignalType)Parent.Type).Connect.ObjectsColumns.ContainsKey(Prop.Text)) { AddError("Не найдено свойство", Prop); } else { Type = new SimpleType(((ITablikSignalType)Parent.Type).Connect.ObjectsColumns[Prop.Text]); if (metProps != null) { metProps.Add(Prop.Text); } } } else { AddError("Недопустимое получение свойства", Prop); } }