コード例 #1
0
        // WriteType unification

        #region Unify
        /// <summary>
        /// This method unifies two type expressions (this and te)
        /// </summary>
        /// <param name="te">The expression to be unfied with this</param>
        /// <param name="unification">Indicates if the kind of unification (equivalent, incremental or override).</param>
        /// <param name="previouslyUnified">To detect infinite loops. The previously unified pairs of type expressions.</param>
        /// <returns>If the unification was successful</returns>
        public override bool Unify(TypeExpression te, SortOfUnification unification, IList <Pair <TypeExpression, TypeExpression> > previouslyUnified)
        {
            MethodType mt = te as MethodType;

            if (mt != null)
            {
                if (mt.ParameterListCount != this.ParameterListCount)
                {
                    return(false);
                }
                bool success = true;
                for (int i = 0; i < this.ParameterListCount; i++)
                {
                    if (!this.paramList[i].Unify(mt.GetParameter(i), unification, previouslyUnified))
                    {
                        success = false;
                        break;
                    }
                }
                if (success)
                {
                    success = this.Return.Unify(mt.Return, unification, previouslyUnified);
                }
                // * Clears the type expression cache
                this.ValidTypeExpression = false;
                te.ValidTypeExpression   = false;
                return(success);
            }
            if (te is TypeVariable && unification != SortOfUnification.Incremental)
            {
                // * No incremental unification is commutative
                return(te.Unify(this, unification, previouslyUnified));
            }
            return(false);
        }