Null constant cannot be used for ref/out variables
[mono.git] / mcs / tools / csharp / repl.cs
index 75bc3d434d860f39c6ae08f4a58ecbac6a463a4d..5137fcb4c4ad768a9b2ea9c3c8b468a0eb432df0 100644 (file)
@@ -28,7 +28,6 @@ using System.Net.Sockets;
 using System.Collections.Generic;
 
 using Mono.CSharp;
-using Mono.Attach;
 
 namespace Mono {
 
@@ -36,27 +35,67 @@ namespace Mono {
                
                static int Main (string [] args)
                {
+#if !ON_DOTNET
                        if (args.Length > 0 && args [0] == "--attach") {
                                new ClientCSharpShell (Int32.Parse (args [1])).Run (null);
                                return 0;
-                       } else if (args.Length > 0 && args [0].StartsWith ("--agent:")) {
+                       }
+
+                       if (args.Length > 0 && args [0].StartsWith ("--agent:")) {
                                new CSharpAgent (args [0]);
                                return 0;
-                       } else {
-                               string [] startup_files;
-                               try {
-                                       startup_files = Evaluator.InitAndGetStartupFiles (args);
-                               } catch {
-                                       return 1;
-                               }
+                       }
+#endif
+                       return Startup(args);
+               }
+
+               static int Startup (string[] args)
+               {
+                       string[] startup_files;
+                       try {
+                               startup_files = Evaluator.InitAndGetStartupFiles (args);
+                               Evaluator.DescribeTypeExpressions = true;
+                               Evaluator.SetInteractiveBaseClass (typeof (InteractiveBaseShell));
+                       } catch {
+                               return 1;
+                       }
+
+                       return new CSharpShell ().Run (startup_files);
+               }
+       }
+
+       public class InteractiveBaseShell : InteractiveBase {
+               static bool tab_at_start_completes;
+               
+               static InteractiveBaseShell ()
+               {
+                       tab_at_start_completes = false;
+               }
+
+               internal static Mono.Terminal.LineEditor Editor;
+               
+               public static bool TabAtStartCompletes {
+                       get {
+                               return tab_at_start_completes;
+                       }
+
+                       set {
+                               tab_at_start_completes = value;
+                               if (Editor != null)
+                                       Editor.TabAtStartCompletes = value;
+                       }
+               }
 
-                               return new CSharpShell ().Run (startup_files);
+               public static new string help {
+                       get {
+                               return InteractiveBase.help +
+                                       "  TabAtStartCompletes - Whether tab will complete even on emtpy lines\n";
                        }
                }
        }
        
        public class CSharpShell {
-               static bool isatty = true;
+               static bool isatty = true, is_unix = false;
                string [] startup_files;
                
                Mono.Terminal.LineEditor editor;
@@ -72,10 +111,25 @@ namespace Mono {
                
                void SetupConsole ()
                {
-                       string term = Environment.GetEnvironmentVariable ("TERM");
-                       dumb = term == "dumb" || term == null || isatty == false;
+                       if (is_unix){
+                               string term = Environment.GetEnvironmentVariable ("TERM");
+                               dumb = term == "dumb" || term == null || isatty == false;
+                       } else
+                               dumb = false;
                        
                        editor = new Mono.Terminal.LineEditor ("csharp", 300);
+                       InteractiveBaseShell.Editor = editor;
+
+                       editor.AutoCompleteEvent += delegate (string s, int pos){
+                               string prefix = null;
+
+                               string complete = s.Substring (0, pos);
+                               
+                               string [] completions = Evaluator.GetCompletions (complete, out prefix);
+                               
+                               return new Mono.Terminal.LineEditor.Completion (prefix, completions);
+                       };
+                       
 #if false
                        //
                        // This is a sample of how completions sould be implemented.
@@ -121,13 +175,24 @@ namespace Mono {
 
                void InitTerminal ()
                {
-                       isatty = UnixUtils.isatty (0) && UnixUtils.isatty (1);
+#if ON_DOTNET
+                       is_unix = false;
+                       isatty = true;
+#else
+                       int p = (int) Environment.OSVersion.Platform;
+                       is_unix = (p == 4) || (p == 128);
+
+                       if (is_unix)
+                               isatty = UnixUtils.isatty (0) && UnixUtils.isatty (1);
+                       else
+                               isatty = true;
+#endif
 
                        // Work around, since Console is not accounting for
                        // cursor position when writing to Stderr.  It also
                        // has the undesirable side effect of making
                        // errors plain, with no coloring.
-                       Report.Stderr = Console.Out;
+//                     Report.Stderr = Console.Out;
                        SetupConsole ();
 
                        if (isatty)
@@ -199,7 +264,7 @@ namespace Mono {
 
                public int ReadEvalPrintLoop ()
                {
-                       if (startup_files.Length == 0)
+                       if (startup_files != null && startup_files.Length == 0)
                                InitTerminal ();
 
                        InitializeUsing ();
@@ -363,6 +428,7 @@ namespace Mono {
                
        }
 
+#if !ON_DOTNET
        //
        // A shell connected to a CSharpAgent running in a remote process.
        //  - maybe add 'class_name' and 'method_name' arguments to LoadAgent.
@@ -385,7 +451,7 @@ namespace Mono {
                                                          ((IPEndPoint)listener.Server.LocalEndPoint).Port,
                                                          ((IPEndPoint)interrupt_listener.Server.LocalEndPoint).Port);
        
-                       VirtualMachine vm = new VirtualMachine (pid);
+                       var vm = new Attach.VirtualMachine (pid);
                        vm.Attach (agent_assembly, agent_arg);
        
                        /* Wait for the client to connect */
@@ -575,7 +641,7 @@ namespace Mono {
                                try {
                                        string error_string;
                                        StringWriter error_output = new StringWriter ();
-                                       Report.Stderr = error_output;
+//                                     Report.Stderr = error_output;
                                        
                                        string line = s.GetString ();
        
@@ -624,6 +690,21 @@ namespace Mono {
                        }
                }
        }
+
+       public class UnixUtils {
+               [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")]
+               extern static int _isatty (int fd);
+                       
+               public static bool isatty (int fd)
+               {
+                       try {
+                               return _isatty (fd) == 1;
+                       } catch {
+                               return false;
+                       }
+               }
+       }
+#endif
 }
        
 namespace Mono.Management
@@ -633,4 +714,3 @@ namespace Mono.Management
        }
 }
 
-