Better messages than a throw
[mono.git] / mcs / mcs / anonymous.cs
index 0ebc9091ef1dc03ce9a608a9d075b7b40a7ad9e7..85a6ee95e20e226cd9eb1691debf90f3b74f6588 100644 (file)
@@ -123,8 +123,9 @@ namespace Mono.CSharp {
                                throw new Exception ("Type host is null");
                        
                        if (current_type == type_host && ec.IsStatic){
-                               if (ec.IsStatic)
+                               if (ec.IsStatic){
                                        method_modifiers |= Modifiers.STATIC;
+                               }
                                current_type = null;
                        } 
 
@@ -134,7 +135,6 @@ namespace Mono.CSharp {
                                method_modifiers, false, new MemberName ("<#AnonymousMethod>" + anonymous_method_count++),
                                Parameters, null, loc);
                        method.Block = Block;
-
                        
                        //
                        // Swap the TypeBuilder while we define the method, then restore
@@ -167,15 +167,8 @@ namespace Mono.CSharp {
                        invoke_mb = (MethodInfo) Delegate.GetInvokeMethod (ec, delegate_type, loc);
                        ParameterData invoke_pd = TypeManager.GetParameterData (invoke_mb);
 
-                       //
-                       // If implicit parameters are set, then we must check for out in the parameters
-                       // and flag it accordingly.
-                       //
-                       bool out_invalid_check = false;
-                       
                        if (Parameters == null){
                                int i, j;
-                               out_invalid_check = true;
                                
                                //
                                // We provide a set of inaccessible parameters
@@ -225,6 +218,16 @@ namespace Mono.CSharp {
                        
                        for (int i = 0; i < amp.Count; i++){
                                Parameter.Modifier amp_mod = amp.ParameterModifier (i);
+
+                               if ((amp_mod & (Parameter.Modifier.OUT | Parameter.Modifier.REF)) != 0){
+                                       if (!probe){
+                                               Error_ParameterMismatch (delegate_type);
+                                               Report.Error (1677, loc, "Parameter '{0}' should not be declared with the '{1}' keyword", 
+                                                       i+1, amp.ModifierDesc (i));
+                                       }
+                                       return null;
+                               }
+
                                if (amp_mod != invoke_pd.ParameterModifier (i)){
                                        if (!probe){
                                                Report.Error (1676, loc, 
@@ -244,14 +247,6 @@ namespace Mono.CSharp {
                                        }
                                        return null;
                                }
-                               
-                               if (out_invalid_check && (invoke_pd.ParameterModifier (i) & Parameter.Modifier.OUT) != 0){
-                                       if (!probe){
-                                               Report.Error (1676, loc,"Parameter {0} must include the `out' modifier ", i+1);
-                                               Error_ParameterMismatch (delegate_type);
-                                       }
-                                       return null;
-                               }
                        }
 
                        //
@@ -309,8 +304,7 @@ namespace Mono.CSharp {
                        // Adjust based on the computed state of the
                        // method from CreateMethodHost
                        
-                       if ((method_modifiers & Modifiers.STATIC) != 0)
-                               aec.IsStatic = true;
+                       aec.MethodIsStatic = (method_modifiers & Modifiers.STATIC) != 0;
                        
                        aec.EmitMeta (Block, amp);
                        aec.EmitResolvedTopBlock (Block, unreachable);