示例#1
0
        protected void member(string name, string type, params string[] options)
        {
            if (_curStructDef == null)
            {
                throw new Exception("member allowed only in define_struct");
            }
            MemberDef md = new MemberDef {
                Name = name, TypeName = type
            };

            _curStructDef.Members.Add(md);
        }
示例#2
0
        /// <summary>
        /// Compares two object instances, determining its data field (not properties) differences.
        /// Uses reflection or Entity-getters to access instance data, whatever is more appropriate.
        /// </summary>
        /// <typeparam name="TInstance">Type of the instances to compare.</typeparam>
        /// <param name="Primary">First instance to compare.</param>
        /// <param name="Secondary">Second instance to compare.</param>
        /// <param name="ValuesEqualityComparer">Determines, returning true, if the supplied two objects are/represents the same value. Optional. By default, compared with IsEqual().</param>
        /// <returns>Null if instances are equal. Else, the detected differences, informing field-name plus primary and secondary field values.</returns>
        public static Dictionary <string, Tuple <object, object> > DetermineDifferences <TInstance>(TInstance Primary, TInstance Secondary,
                                                                                                    Func <object, object, bool> ValuesEqualityComparer = null)
        {
            if (Primary.IsEqual(Secondary))
            {
                return(null);
            }

            var Result = new Dictionary <string, Tuple <object, object> >();

            var PrimaryInstance   = Primary as IMModelClass;
            var SecondaryInstance = Secondary as IMModelClass;

            ValuesEqualityComparer = ValuesEqualityComparer.NullDefault(IsEqual);

            if (PrimaryInstance != null && SecondaryInstance != null)
            {
                foreach (var MemberDef in PrimaryInstance.ClassDefinition.Properties)
                {
                    var PrimaryValue   = MemberDef.Read(PrimaryInstance);
                    var SecondaryValue = MemberDef.Read(SecondaryInstance);

                    if (!ValuesEqualityComparer(PrimaryValue, SecondaryValue))
                    {
                        Result.Add(MemberDef.TechName, Tuple.Create <object, object>(PrimaryValue, SecondaryValue));
                    }
                }
            }
            else
            {
                foreach (var MemberDef in typeof(TInstance).GetFields())
                {
                    var PrimaryValue   = MemberDef.GetValue(Primary);
                    var SecondaryValue = MemberDef.GetValue(Secondary);

                    if (!ValuesEqualityComparer(PrimaryValue, SecondaryValue))
                    {
                        Result.Add(MemberDef.Name, Tuple.Create <object, object>(PrimaryValue, SecondaryValue));
                    }
                }
            }

            return(Result.Count < 1 ? null : Result);
        }
示例#3
0
        private void DeserializeMembers(Json.Expression members, ref MemberDef[] memberDefs)
        {
            //
            // TODO: confirm this behavior, technically "optional" in Bonsai spec, so value could be null.
            //
            if (members is not Json.ArrayExpression memberTable)
            {
                throw new BonsaiParseException("Expected a JSON array containing the members table.", members);
            }

            var n = memberTable.ElementCount;

            memberDefs = new MemberDef[n];

            for (var i = 0; i < n; i++)
            {
                var member = memberTable.GetElement(i);

                var memberDef = MemberDef.FromJson(this, member);
                memberDefs[i] = memberDef;
            }
        }
示例#4
0
 public RecordDef(string name, string baseTypeName = null, RecordDefFlags flags = 0, string comment = null, MemberDef[] members = null)
 {
     Name = name;
     BaseTypeName = baseTypeName;
     Flags = flags;
     Comment = comment;
     Members = members;
 }
示例#5
0
 /// <summary> Adds a new entity into <see cref="DeclaredEntities" />. </summary>
 internal void RegisterEntity(MemberDef member, IEntity entity)
 {
     declaredEntities.Add(member.Signature, entity);
     SymbolLoader.RegisterDeclaredEntity(entity, member.Signature);
 }