/// <summary>Model helper only: Initialize the core properties of a variable reference</summary>
        /// <param name="model"></param>
        /// <param name="result">The initialized variable reference</param>
        /// <param name="refKind">The kind of variable reference to create</param>
        /// <param name="refTypeMember">Returns the proto member we've initialized the result to</param>
        /// <param name="refMemberName">The specific member of the variable reference to initialize to</param>
        /// <param name="dataTypeName">Only used if the reference member has a data type property</param>
        internal static void Initialize(MegaloScriptModel model,
                                        out MegaloScriptVariableReferenceData result, MegaloScriptVariableReferenceType refKind,
                                        out Proto.MegaloScriptProtoVariableReferenceMember refTypeMember,
                                        string refMemberName, string dataTypeName = null)
        {
            result.mReferenceKind = refKind;

            var protoType = model.Database.VariableRefTypes[refKind];

            result.Type = MegaloScriptVariableReferenceData.ToMemberIndex(protoType, refMemberName);

            refTypeMember = protoType.Members[result.Type];
            if (refTypeMember.HasDataType)
            {
                Contract.Assert(dataTypeName != null, "Reference type uses a data type parameter, but one wasn't defined");
                var id_resolving_ctxt = new Proto.MegaloScriptEnum.EnumNameResolvingContext(model.Database, refTypeMember.EnumValueType);
                result.DataType = Proto.MegaloScriptEnum.EnumNameResolvingContext.IdResolver(id_resolving_ctxt, dataTypeName);
            }
            else
            {
                result.DataType = TypeExtensions.kNone;
            }

            result.Data = TypeExtensions.kNone;
        }
Пример #2
0
        public void ChangeValue(MegaloScriptModel model, string enumMemberName)
        {
            Contract.Requires(!string.IsNullOrEmpty(enumMemberName));

            var id_resolving_ctxt = new Proto.MegaloScriptEnum.EnumNameResolvingContext(model.Database, ValueType);

            Value = Proto.MegaloScriptEnum.EnumNameResolvingContext.IdResolver(id_resolving_ctxt, enumMemberName);
        }
Пример #3
0
        internal static void SerializeValue <TDoc, TCursor>(MegaloScriptModel model, IO.TagElementStream <TDoc, TCursor, string> s,
                                                            MegaloScriptValueType valueType, ref int value,
                                                            IO.TagElementNodeType nodeType = IO.TagElementNodeType.Text, string nodeName = null)
            where TDoc : class
            where TCursor : class
        {
            Contract.Requires(valueType.BaseType == MegaloScriptValueBaseType.Enum);

            if ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.UseEnumNames) != 0)
            {
                var id_resolving_ctxt = new Proto.MegaloScriptEnum.EnumNameResolvingContext(model.Database, valueType);
                var id_resolver       = Proto.MegaloScriptEnum.EnumNameResolvingContext.IdResolver;
                var name_resolver     = Proto.MegaloScriptEnum.EnumNameResolvingContext.NameResolver;

                switch (nodeType)
                {
                case IO.TagElementNodeType.Element:
                    s.StreamElementIdAsString(nodeName, ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;

                case IO.TagElementNodeType.Attribute:
                    s.StreamAttributeIdAsString(nodeName, ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;

                case IO.TagElementNodeType.Text:
                    s.StreamCursorIdAsString(ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;
                }
            }
            else
            {
                switch (nodeType)
                {
                case IO.TagElementNodeType.Element:             s.StreamElement(nodeName, ref value); break;

                case IO.TagElementNodeType.Attribute:   s.StreamAttribute(nodeName, ref value); break;

                case IO.TagElementNodeType.Text:                s.StreamCursor(ref value); break;
                }
            }
        }
Пример #4
0
        /// <summary></summary>
        /// <param name="refKind">The kind of variable we're this reference</param>
        /// <param name="refMemberName">The variable's reference type</param>
        /// <param name="enumMemberName">Actual 'data' value for the variable reference</param>
        /// <param name="dataTypeName">Optional type info for <paramref name="enumMemberName"/></param>
        /// <returns></returns>
        public MegaloScriptVariableReferenceData NewVarReferenceWithEnumData(MegaloScriptVariableReferenceType refKind,
                                                                             string refMemberName, string enumMemberName,
                                                                             string dataTypeName = null)
        {
            Contract.Requires(!string.IsNullOrEmpty(refMemberName));
            Contract.Requires(!string.IsNullOrEmpty(enumMemberName));

            MegaloScriptVariableReferenceData result;

            Proto.MegaloScriptProtoVariableReferenceMember member;
            MegaloScriptVariableReferenceData.Initialize(this,
                                                         out result, refKind, out member, refMemberName, dataTypeName);

            Contract.Assert(member.HasDataValue, "Member has no data field, let alone enum data");

            var id_resolving_ctxt = new Proto.MegaloScriptEnum.EnumNameResolvingContext(Database, member.EnumValueType);

            result.Data = Proto.MegaloScriptEnum.EnumNameResolvingContext.IdResolver(id_resolving_ctxt, enumMemberName);

            return(result);
        }