protected override Expression DoResolve(ResolveContext ec)
        {
            CloneContext cc    = new CloneContext();
            Expression   clone = source.Clone(cc);

            //
            // A useful feature for the REPL: if we can resolve the expression
            // as a type, Describe the type;
            //
            if (Evaluator.DescribeTypeExpressions)
            {
                var old_printer = Evaluator.SetPrinter(new StreamReportPrinter(TextWriter.Null));
                clone = clone.Resolve(ec);
                if (clone == null)
                {
                    clone = source.Clone(cc);
                    clone = clone.Resolve(ec, ResolveFlags.Type);
                    if (clone == null)
                    {
                        Evaluator.SetPrinter(old_printer);
                        clone = source.Clone(cc);
                        clone = clone.Resolve(ec);
                        return(null);
                    }

                    Arguments args = new Arguments(1);
                    args.Add(new Argument(new TypeOf((TypeExpr)clone, Location)));
                    source = new Invocation(new SimpleName("Describe", Location), args).Resolve(ec);
                }
                Evaluator.SetPrinter(old_printer);
            }
            else
            {
                clone = clone.Resolve(ec);
                if (clone == null)
                {
                    return(null);
                }
            }

            // This means its really a statement.
            if (clone.Type == TypeManager.void_type || clone is DynamicInvocation || clone is Assign)
            {
                return(clone);
            }

            return(base.DoResolve(ec));
        }