[svn] r6494: nemerle/trunk/ncc: external/LibrariesLoader.n typing/TypedTree.n typing/Typer-CallTyper.n

dragonfox svnadmin at nemerle.org
Tue Aug 8 20:08:00 CEST 2006


Log:
proper fix for optional parameters (bug 731)

Author: dragonfox
Date: Tue Aug  8 20:07:55 2006
New Revision: 6494

Modified:
   nemerle/trunk/ncc/external/LibrariesLoader.n
   nemerle/trunk/ncc/typing/TypedTree.n
   nemerle/trunk/ncc/typing/Typer-CallTyper.n

Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n	(original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n	Tue Aug  8 20:07:55 2006
@@ -1882,9 +1882,9 @@
             modifiers = Modifiers.Empty // FIXME?
           );
           def deflt = p.DefaultValue;
-          if (p.IsOptional)
-            fp.is_optional = true
-          else when (deflt != System.DBNull.Value)
+          when (p.IsOptional)
+            fp.is_optional = true;
+          when (deflt != System.DBNull.Value && deflt != System.Reflection.Missing.Value)
             fp.default_value = Some (Literal.FromObject (deflt));
           fp
         };

Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n	(original)
+++ nemerle/trunk/ncc/typing/TypedTree.n	Tue Aug  8 20:07:55 2006
@@ -99,13 +99,20 @@
       get { name }
     }
 
-    public HasDefaultValue : bool
+    public IsOptional : bool
     {
       get {
         is_optional || default_value.IsSome || local_default_value.IsSome
       }
     }
 
+    public HasDefaultValue : bool
+    {
+      get {
+        default_value.IsSome || local_default_value.IsSome
+      }
+    }
+
     public DefaultValueAsTExpr () : TExpr
     {
       match (local_default_value) {
@@ -127,7 +134,13 @@
                          $ "default value specified twice for parameter "
                            "`$name'");
         local_default_value = Some (par.TypeExpr (e, Typer.AtLeast (ty)));
+        is_optional = true;
       }
+
+      // store optional flag
+      when (modifiers.custom_attrs.Exists (x => x is <[ System.Runtime.InteropServices.OptionalAttribute ]>) ||
+            modifiers.custom_attrs.Exists (x => x is <[ System.Runtime.InteropServices.OptionalAttribute () ]>))
+        is_optional = true;
     }
     
     internal GetDefaultValueFromModifiers (par : TypeBuilder) : void
@@ -180,6 +193,7 @@
               else lit;
               
             default_value = Some (lit);
+            is_optional = true;
             
           | _ =>
             Message.Error (e.loc,
@@ -194,6 +208,11 @@
           | <[ System.ComponentModel.DefaultValueAttribute ($_) ]> => false
           | _ => true
         });
+
+      // store optional flag
+      when (modifiers.custom_attrs.Exists (x => x is <[ System.Runtime.InteropServices.OptionalAttribute ]>) ||
+            modifiers.custom_attrs.Exists (x => x is <[ System.Runtime.InteropServices.OptionalAttribute () ]>))
+        is_optional = true;
     }
 
 

Modified: nemerle/trunk/ncc/typing/Typer-CallTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-CallTyper.n	(original)
+++ nemerle/trunk/ncc/typing/Typer-CallTyper.n	Tue Aug  8 20:07:55 2006
@@ -354,7 +354,7 @@
           ! is_var_args &&
           header != null && 
           header.parms.Length > call_parms.Length &&
-          header.parms.Exists (fun (fp) { fp.HasDefaultValue });
+          header.parms.Exists (fun (fp) { fp.IsOptional });
 
         when (has_named || need_default)
           if (header == null)
@@ -485,7 +485,7 @@
                   seen_named_parms.Contains (fp.name) || 
                   seen_unnamed_parms.Contains (fp.name);
                 if (seen) false
-                else if (fp.HasDefaultValue) {
+                else if (fp.IsOptional) {
                   used_default_parms = true;
                   use_defaults_for [fp.name] = fp;
                   false
@@ -549,13 +549,14 @@
                              Option.UnSome (seen_named_parms.Get (name)) :: acc)
             else if (use_defaults_for.Contains (name)) {
               def expr =
-                if (fp.is_optional) {
+                if (fp.HasDefaultValue) {
+                  fp.DefaultValueAsTExpr ();
+                } else {
                   if (fp.ty.Fix ().Equals (InternalType.Object))
                     typer.TypeExpr (<[ System.Reflection.Missing.Value ]>)
                   else
                     TExpr.DefaultValue (FreshTyVar ())
-                } else
-                  fp.DefaultValueAsTExpr ();
+                }
               reorder_parms (rest_of_names, Parm (expr) :: acc)
             } else
               Util.ice ("reorder_named_parms: reorder")



More information about the svn mailing list