Remove Thread.[Abort|Suspend|Resume] from TvOS/WatchOS.
[mono.git] / mcs / mcs / eval.cs
index 115429e3f874488644b7d2ae1c32226778fdf81a..62c02b1fd5602de8f4a01d5096f183472d3d2b9a 100644 (file)
@@ -24,6 +24,11 @@ using System.Linq;
 namespace Mono.CSharp
 {
 
+       /// <summary>
+       /// Experimental!
+       /// </summary>
+       public delegate void ValueModificationHandler (string variableName, int row, int column, object value);
+
        /// <summary>
        ///   Evaluator: provides an API to evaluate C# statements and
        ///   expressions dynamically.
@@ -187,8 +192,13 @@ namespace Mono.CSharp
                        if (!inited || !invoking)
                                return;
                        
-                       if (invoke_thread != null)
+                       if (invoke_thread != null) {
+#if MONO_FEATURE_THREAD_ABORT
                                invoke_thread.Abort ();
+#else
+                               invoke_thread.Interrupt ();
+#endif
+                       }
                }
 
                /// <summary>
@@ -362,9 +372,14 @@ namespace Mono.CSharp
                                invoke_thread = System.Threading.Thread.CurrentThread;
                                invoking = true;
                                compiled (ref retval);
+#if MONO_FEATURE_THREAD_ABORT
                        } catch (ThreadAbortException e){
                                Thread.ResetAbort ();
                                Console.WriteLine ("Interrupted!\n{0}", e);
+#else
+                       } catch (ThreadInterruptedException e) {
+                               Console.WriteLine ("Interrupted!\n{0}", e);
+#endif
                        } finally {
                                invoking = false;
 
@@ -410,11 +425,7 @@ namespace Mono.CSharp
                                };
                                host.SetBaseTypes (baseclass_list);
 
-#if NET_4_0
                                var access = AssemblyBuilderAccess.RunAndCollect;
-#else
-                               var access = AssemblyBuilderAccess.Run;
-#endif
                                var a = new AssemblyDefinitionDynamic (module, "completions");
                                a.Create (AppDomain.CurrentDomain, access);
                                module.SetDeclaringAssembly (a);
@@ -479,8 +490,10 @@ namespace Mono.CSharp
                        return result;
                }
 
-               // Experimental
-               public Action<string, int, int, object> ModificationListener { get; set; }
+               /// <summary>
+               /// Experimental!
+               /// </summary>
+               public ValueModificationHandler ModificationListener { get; set; }
 
                enum InputKind {
                        EOF,
@@ -514,6 +527,7 @@ namespace Mono.CSharp
                        // These are toplevels
                        case Token.EXTERN:
                        case Token.OPEN_BRACKET:
+                       case Token.OPEN_BRACKET_EXPR:
                        case Token.ABSTRACT:
                        case Token.CLASS:
                        case Token.ENUM:
@@ -553,7 +567,7 @@ namespace Mono.CSharp
                                if (t == Token.EOF)
                                        return InputKind.EOF;
 
-                               if (t == Token.IDENTIFIER)
+                               if (t == Token.IDENTIFIER || t == Token.STATIC)
                                        return InputKind.CompilationUnit;
                                return InputKind.StatementOrExpression;
 
@@ -686,11 +700,7 @@ namespace Mono.CSharp
                                assembly = new AssemblyDefinitionDynamic (module, current_debug_name, current_debug_name);
                                assembly.Importer = importer;
                        } else {
-#if NET_4_0
                                access = AssemblyBuilderAccess.RunAndCollect;
-#else
-                               access = AssemblyBuilderAccess.Run;
-#endif
                                assembly = new AssemblyDefinitionDynamic (module, current_debug_name);
                        }
 
@@ -856,13 +866,19 @@ namespace Mono.CSharp
 
                public string GetUsing ()
                {
+                       if (source_file == null || source_file.Usings == null)
+                               return string.Empty;
+
                        StringBuilder sb = new StringBuilder ();
                        // TODO:
                        //foreach (object x in ns.using_alias_list)
                        //    sb.AppendFormat ("using {0};\n", x);
 
                        foreach (var ue in source_file.Usings) {
-                               sb.AppendFormat ("using {0};", ue.ToString ());
+                               if (ue.Alias != null || ue.ResolvedExpression == null)
+                                       continue;
+
+                               sb.AppendFormat("using {0};", ue.ToString ());
                                sb.Append (Environment.NewLine);
                        }
 
@@ -873,7 +889,11 @@ namespace Mono.CSharp
                {
                        var res = new List<string> ();
 
-                       foreach (var ue in source_file.Usings) {
+                       if (source_file == null || source_file.Usings == null)
+                               return res;
+
+                       foreach (var ue in source_file.Usings)
+                       {
                                if (ue.Alias != null || ue.ResolvedExpression == null)
                                        continue;
 
@@ -1270,7 +1290,7 @@ namespace Mono.CSharp
 
                        if (current_container.Containers != null)
                        {
-                               var existing = current_container.Containers.FirstOrDefault (l => l.Basename == tc.Basename);
+                               var existing = current_container.Containers.FirstOrDefault (l => l.MemberName.Basename == tc.MemberName.Basename);
                                if (existing != null) {
                                        current_container.RemoveContainer (existing);
                                        undo_actions.Add (() => current_container.AddTypeContainer (existing));
@@ -1295,11 +1315,11 @@ namespace Mono.CSharp
 
        static class ListenerProxy
        {
-               static readonly Dictionary<int, Action<string, int, int, object>> listeners = new Dictionary<int, Action<string, int, int, object>> (); 
+               static readonly Dictionary<int, ValueModificationHandler> listeners = new Dictionary<int, ValueModificationHandler> ();
 
                static int counter;
 
-               public static int Register (Action<string, int, int, object> listener)
+               public static int Register (ValueModificationHandler listener)
                {
                        lock (listeners) {
                                var id = counter++;
@@ -1317,7 +1337,7 @@ namespace Mono.CSharp
 
                public static void ValueChanged (object value, int row, int col, string name, int listenerId)
                {
-                       Action<string, int, int, object> action;
+                       ValueModificationHandler action;
                        lock (listeners) {
                                if (!listeners.TryGetValue (listenerId, out action))
                                        return;