/// <summary> /// Resolves an expression and performs semantic analysis on it. /// </summary> /// /// <remarks> /// Currently Resolve wraps DoResolve to perform sanity /// checking and assertion checking on what we expect from Resolve. /// </remarks> public Expression Resolve (ResolveContext ec, ResolveFlags flags) { if ((flags & ResolveFlags.MaskExprClass) == ResolveFlags.Type) return ResolveAsTypeStep (ec, false); bool do_flow_analysis = ec.DoFlowAnalysis; bool omit_struct_analysis = ec.OmitStructFlowAnalysis; if ((flags & ResolveFlags.DisableFlowAnalysis) != 0) do_flow_analysis = false; if ((flags & ResolveFlags.DisableStructFlowAnalysis) != 0) omit_struct_analysis = true; Expression e; using (ec.WithFlowAnalysis (do_flow_analysis, omit_struct_analysis)) { if (this is SimpleName) { bool intermediate = (flags & ResolveFlags.Intermediate) == ResolveFlags.Intermediate; e = ((SimpleName) this).DoResolve (ec, intermediate); } else { e = DoResolve (ec); } } if (e == null) return null; if ((flags & e.ExprClassToResolveFlags) == 0) { e.Error_UnexpectedKind (ec, flags, loc); return null; } if (e.type == null && !(e is Namespace)) { throw new Exception ( "Expression " + e.GetType () + " did not set its type after Resolve\n" + "called from: " + this.GetType ()); } return e; }