示例#1
0
 /// <summary>
 /// Creates a structurally equivalent union type from a given type.
 /// </summary>
 /// <param name="type">The type to copy the structure of.</param>
 /// <returns>A structurally equivalent copy of the given type.</returns>
 public static IStonUnionType Copy(IStonUnionType type)
 {
     if (type == null)
     {
         throw new ArgumentNullException("type");
     }
     return(new StonUnionType(type));
 }
示例#2
0
        /// <summary>
        /// Determines whether two union types are equivalent.
        /// </summary>
        /// <param name="x">The first union type to compare.</param>
        /// <param name="y">The second union type to compare.</param>
        /// <returns>True when types are equivalent, false otherwise.</returns>
        public bool Equals(IStonUnionType x, IStonUnionType y)
        {
            if (x == y)
            {
                return(true);
            }
            else if (x == null || y == null)
            {
                return(false);
            }

            return(x.PermittedTypes.SequenceEqual(y.PermittedTypes, this));
        }
示例#3
0
 /// <summary>
 /// Checks the validity of a given STON union type.
 /// </summary>
 /// <param name="type">The type to check the validity of.</param>
 public static void ValidateType(IStonUnionType type)
 {
     if (type == null)
     {
         throw new ArgumentNullException("type");
     }
     if (type.PermittedTypes == null || !type.PermittedTypes.Skip(1).Any())
     {
         throw new StonException("A union type must have at least two permitted types.");
     }
     if (type.PermittedTypes.Contains(null))
     {
         throw new StonException("A union type cannot have a non-existing permitted type.");
     }
 }
示例#4
0
        /// <summary>
        /// Returns a hash code for a given union type.
        /// </summary>
        /// <param name="obj">The union type to get a hash code of.</param>
        /// <returns>The hash code for the type.</returns>
        public int GetHashCode(IStonUnionType obj)
        {
            if (obj == null)
            {
                return(0);
            }

            unchecked
            {
                int result = 17;
                foreach (var parameter in obj.PermittedTypes)
                {
                    result = result * 31 + GetHashCode(parameter);
                }

                return(result);
            }
        }
示例#5
0
        // writes a union type
        private void WriteType(StonTokenWriter writer, IStonUnionType type)
        {
            bool first = true;

            foreach (var permittedType in type.PermittedTypes)
            {
                if (!first)
                {
                    writer.Write('|');
                }
                if (permittedType is IStonUnionType)
                {
                    writer.Write('<');
                }
                WriteType(writer, permittedType);
                if (permittedType is IStonUnionType)
                {
                    writer.Write('>');
                }
                first = false;
            }
        }
示例#6
0
 /// <summary>
 /// Creates a structurally equivalent union type from a given type.
 /// </summary>
 /// <param name="type">The type to copy the structure of.</param>
 public StonUnionType(IStonUnionType type)
     : this(type.PermittedTypes)
 {
 }