[svn] r6312: nemerle/trunk/ncc: generation/HierarchyEmitter.n hierarchy/ClassMembers.n typing/TypedTree.n

malekith svnadmin at nemerle.org
Sat May 20 22:14:13 CEST 2006


Log:
Allow modreq/modopt on properties too. Needed for boogie integration. By Wojtek Walewski.

Author: malekith
Date: Sat May 20 22:14:13 2006
New Revision: 6312

Modified:
   nemerle/trunk/ncc/generation/HierarchyEmitter.n
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/typing/TypedTree.n

Modified: nemerle/trunk/ncc/generation/HierarchyEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/HierarchyEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/HierarchyEmitter.n	Sat May 20 22:14:13 2006
@@ -895,23 +895,13 @@
         foreach (gp in fun_header.typarms) gp.UpdateConstraints ();
       }
 
-      mutable paramTypeRequiredModifiers = [];
-      mutable paramTypeOptionalModifiers = [];
-
-      foreach (p in fun_header.parms)
-      {
-        paramTypeRequiredModifiers ::= p.required_modifiers.ToArray ();
-        paramTypeOptionalModifiers ::= p.optional_modifiers.ToArray ();
-      }
-
       method_builder.SetSignature (
         fun_header.ret_type.SystemType,
-        fun_header.ret_type_required_modifiers.ToArray (),
-        fun_header.ret_type_optional_modifiers.ToArray (),
+        fun_header.GetRetTypeRequiredModifiers (),
+        fun_header.GetRetTypeOptionalModifiers (),
         param_types (),
-        paramTypeRequiredModifiers.Reverse ().ToArray (),
-        paramTypeOptionalModifiers.Reverse ().ToArray ());
-
+        fun_header.GetParamTypeRequiredModifiers (),
+        fun_header.GetParamTypeOptionalModifiers ());
 
       /* add the runtime modifiers for delegate methods */
       when (DeclaringType.IsDelegate) {
@@ -949,23 +939,16 @@
     {
       // Message.Debug ($"-- AddConstructorBuilder: $this");
 
-      mutable paramTypeRequiredModifiers = [];
-      mutable paramTypeOptionalModifiers = [];
-
-      foreach (p in fun_header.parms)
-      {
-        paramTypeRequiredModifiers ::= p.required_modifiers.ToArray ();
-        paramTypeOptionalModifiers ::= p.optional_modifiers.ToArray ();
-      }
-
       /* create the constructor builder */
       ctor_builder =
-        tb.DefineConstructor (make_method_attributes (Attributes) |
+        tb.DefineConstructor (
+          make_method_attributes (Attributes) |
                               MethodAttributes.RTSpecialName |
                               MethodAttributes.SpecialName,
-                              CallingConventions.Standard, param_types (),
-                              paramTypeRequiredModifiers.Reverse ().ToArray (),
-                              paramTypeOptionalModifiers.Reverse ().ToArray ());
+          CallingConventions.Standard, 
+          param_types (),
+          fun_header.GetParamTypeRequiredModifiers (),
+          fun_header.GetParamTypeOptionalModifiers ());
 
       /* add the runtime modifiers for delegate constructors */
       when (DeclaringType.IsDelegate) {
@@ -1113,12 +1096,43 @@
         result
       }
 
-      def parms = parms.MapToArray (fun (t : MType) { t.SystemType });
-      
       def attrs = make_property_attributes (Attributes);
       def ty = GetMemType ().SystemType;
+      mutable parms = null;
 
-      property_builder = tb.DefineProperty (Name, attrs, ty, parms);
+      def (ret_type_req_mods, ret_type_opt_mods) = {
+        def getter = GetGetter ();
+
+        if (getter == null)
+          (null, null)
+        else
+          ( (getter :> MethodBuilder).fun_header.GetRetTypeRequiredModifiers (),
+            (getter :> MethodBuilder).fun_header.GetRetTypeOptionalModifiers () )
+      }
+
+      def (param_type_req_mods, param_type_opt_mods) = {
+        def setter = GetSetter ();
+
+        if (setter == null)
+          (null, null)
+        else
+        {
+          parms = (setter :> MethodBuilder).fun_header.parms.MapToArray (
+            fun (t : Fun_parm) { t.SystemType });
+          ( (setter :> MethodBuilder).fun_header.GetParamTypeRequiredModifiers (),
+            (setter :> MethodBuilder).fun_header.GetParamTypeOptionalModifiers () )
+        }
+      }
+
+      property_builder = tb.DefineProperty (
+        Name, 
+        attrs, 
+        ty, 
+        ret_type_req_mods, 
+        ret_type_opt_mods,
+        parms,
+        param_type_req_mods,
+        param_type_opt_mods);
     }
     
     internal override Compile () : void

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Sat May 20 22:14:13 2006
@@ -60,6 +60,9 @@
 
   internal mutable disable_type_attr : bool;
   
+  public mutable required_modifiers : list[System.Type] = [];
+  public mutable optional_modifiers : list[System.Type] = [];
+  
   protected this (par : TypeBuilder, d : PT.ClassMember)
   {
     loc = d.loc;
@@ -394,9 +397,6 @@
   public mutable const_value : Literal;
   mutable has_been_assigned = false;
 
-  public mutable required_modifiers : list[System.Type] = [];
-  public mutable optional_modifiers : list[System.Type] = [];
-  
   public this (par : TypeBuilder, f : PT.ClassMember.Field) {
     base (par, f);
     

Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n	(original)
+++ nemerle/trunk/ncc/typing/TypedTree.n	Sat May 20 22:14:13 2006
@@ -284,6 +284,48 @@
     {
       name
     }
+
+    public GetRetTypeRequiredModifiers () : array [System.Type]
+    {
+      ret_type_required_modifiers.ToArray ()
+    }
+
+    public GetRetTypeOptionalModifiers () : array [System.Type]
+    {
+      ret_type_optional_modifiers.ToArray ()
+    }
+
+    public GetParamTypeRequiredModifiers () : array [array [System.Type]]
+    {
+      mutable mods = [];
+
+      foreach (p in parms)
+        if (p.required_modifiers.IsEmpty)
+          mods ::= null;
+        else
+          mods ::= p.required_modifiers.ToArray ();
+
+      if (mods.ForAll (fun (x) { x == null }) )
+        null
+      else
+        mods.Reverse ().ToArray ()
+    }
+
+    public GetParamTypeOptionalModifiers () : array [array [System.Type]]
+    {
+      mutable mods = [];
+
+      foreach (p in parms)
+        if (p.optional_modifiers.IsEmpty)
+          mods ::= null;
+        else
+          mods ::= p.optional_modifiers.ToArray ();
+
+      if (mods.ForAll (fun (x) { x == null }) )
+        null
+      else
+        mods.Reverse ().ToArray ()
+    }
   }
 
   



More information about the svn mailing list