[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