// 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); }