[repl] Add support for -e EXPRESSION to the csharp command
authorMiguel de Icaza <miguel@gnome.org>
Sun, 30 Jan 2011 17:06:10 +0000 (12:06 -0500)
committerMiguel de Icaza <miguel@gnome.org>
Sun, 30 Jan 2011 17:06:24 +0000 (12:06 -0500)
man/csharp.1
mcs/mcs/driver.cs
mcs/mcs/eval.cs
mcs/tools/csharp/repl.cs

index e90aca38294aacca2a3d3cbbc92f19edb3afe7f8..50cbdc86508fd2126437eafdc2b20369563ace69 100644 (file)
@@ -6,7 +6,7 @@
 .SH NAME 
 csharp, gsharp \- Interactive C# Shell 
 .SH SYNOPSIS
-.B csharp [--attach PID] [file1 [file2]]
+.B csharp [--attach PID] [-e EXPRESSION] [file1 [file2]]
 [options] 
 .P
 .B gsharp [file1 [file2]]
@@ -40,6 +40,11 @@ your C# source code look like this:
 Console.WriteLine ("Hello, World");
 .fi
 .SH OPTIONS
+The commands accept all of the commands that are available to the 
+.I mcs
+command, so you can reference assemblies, specify paths, language
+level and so on from the command line.   In addition, the following
+command line options are supported:
 .TP 
 .I "\-\-attach"
 This is an advanced option and should only be used if you have a deep
@@ -52,6 +57,9 @@ special measures to avoid crashing the target application while using
 it.  For example, you might have to take the proper locks before
 issuing any commands that might affect the target process state, or
 sending commands through a method dispatcher.     
+.TP 
+.I "\-e" EXPRESSION
+This will evaluate the specified C# EXPRESSION and exit
 .SH OPERATION
 Once you launch the csharp command, you will be greeted with the
 interactive prompt:
index 014b1caf9c4a39ba40d58082251230b2d0f3e942..1d50a622c78cde9c2baf6ac56bb36944e7fbcbc0 100644 (file)
@@ -42,6 +42,11 @@ namespace Mono.CSharp
 
                static readonly char[] argument_value_separator = new char [] { ';', ',' };
 
+#if !STATIC
+               // The expression to evaluate if -e is passed to the REPL
+               public static string EvalExpression;
+#endif
+
                private Driver (CompilerContext ctx)
                {
                        this.ctx = ctx;
@@ -748,6 +753,17 @@ namespace Mono.CSharp
                                RootContext.LoadDefaultReferences = false;
                                return true;
 
+#if !STATIC
+                       case "-e":
+                               if ((i + 1) >= args.Length){
+                                       Report.Error (
+                                               1900,
+                                               "-e requires an expression");
+                                       Environment.Exit (1);
+                               }
+                               EvalExpression = args [++i];
+                               return true;
+#endif
                        default:
                                if (arg.StartsWith ("--fatal")){
                                        if (arg.StartsWith ("--fatal=")){
@@ -1646,7 +1662,7 @@ namespace Mono.CSharp
                {
                        CSharpParser.yacc_verbose_flag = 0;
                        Location.Reset ();
-
+                       
                        if (!full_flag)
                                return;
 
index a49aff6f425e9ddec7c7c69a77263a1ec03f6064..a17d24c1657e0b760cd27101db9a8128c96cfe57 100644 (file)
@@ -148,6 +148,12 @@ namespace Mono.CSharp
                        }
                }
 
+               public static string StartupEvalExpression {
+                       get {
+                               return Driver.EvalExpression;
+                       }
+               }
+
                static void Init ()
                {
                        Init (new string [0]);
index 5137fcb4c4ad768a9b2ea9c3c8b468a0eb432df0..3172d6a4321b64e80479cf144973ae40df417cb4 100644 (file)
@@ -173,7 +173,7 @@ namespace Mono {
                        Evaluate ("using System; using System.Linq; using System.Collections.Generic; using System.Collections;");
                }
 
-               void InitTerminal ()
+               void InitTerminal (bool show_banner)
                {
 #if ON_DOTNET
                        is_unix = false;
@@ -195,7 +195,7 @@ namespace Mono {
 //                     Report.Stderr = Console.Out;
                        SetupConsole ();
 
-                       if (isatty)
+                       if (isatty && show_banner)
                                Console.WriteLine ("Mono C# Shell, type \"help;\" for help\n\nEnter statements below.");
 
                }
@@ -265,7 +265,7 @@ namespace Mono {
                public int ReadEvalPrintLoop ()
                {
                        if (startup_files != null && startup_files.Length == 0)
-                               InitTerminal ();
+                               InitTerminal (startup_files.Length == 0 && Evaluator.StartupEvalExpression == null);
 
                        InitializeUsing ();
 
@@ -274,9 +274,17 @@ namespace Mono {
                        //
                        // Interactive or startup files provided?
                        //
+                       string startup_expression = Evaluator.StartupEvalExpression;
+                       
                        if (startup_files.Length != 0)
                                ExecuteSources (startup_files, false);
-                       else
+                       else if (Evaluator.StartupEvalExpression != null){
+                               ReadEvalPrintLoopWith (p => {
+                                       var ret = startup_expression;
+                                       startup_expression = null;
+                                       return ret;
+                                       });
+                       } else
                                ReadEvalPrintLoopWith (GetLine);
 
                        return 0;