[svn] r6101: nemerle/trunk: macros/core.n
ncc/external/InternalTypes.n ncc/external/LibrariesLoader.n ncc/...
malekith
svnadmin at nemerle.org
Tue Jan 31 14:10:59 CET 2006
Log:
Load and save extension methods.
Author: malekith
Date: Tue Jan 31 14:10:58 2006
New Revision: 6101
Added:
nemerle/trunk/ncc/testsuite/positive/extension-methods-lib.n
Modified:
nemerle/trunk/macros/core.n
nemerle/trunk/ncc/external/InternalTypes.n
nemerle/trunk/ncc/external/LibrariesLoader.n
nemerle/trunk/ncc/hierarchy/ExtensionMethod.n
nemerle/trunk/ncc/testsuite/positive/extension-methods.n
Modified: nemerle/trunk/macros/core.n
==============================================================================
--- nemerle/trunk/macros/core.n (original)
+++ nemerle/trunk/macros/core.n Tue Jan 31 14:10:58 2006
@@ -629,9 +629,15 @@
[Nemerle.MacroUsage (Nemerle.MacroPhase.WithTypedMembers,
Nemerle.MacroTargets.Parameter)]
- macro _N_ExtensionMethodOnThisParameter (_tb : TypeBuilder, mb : MethodBuilder, p : ParameterBuilder)
+ macro _N_ExtensionMethodOnThisParameter (tb : TypeBuilder, mb : MethodBuilder, p : ParameterBuilder)
syntax ("this")
{
+ def add_attr (m) {
+ unless (m.GetCustomAttributes ().Exists (
+ _ is <[ Nemerle.Internal.Extension () ]>))
+ m.AddCustomAttribute (<[ Nemerle.Internal.Extension () ]>)
+ }
+
if (p : object != mb.GetParameters ().Head)
Message.Error ("'this' modifier (for extension method) can only be "
"used on the first parameter");
@@ -641,6 +647,8 @@
else
match (p.ty.Fix ()) {
| Class (tc, []) =>
+ add_attr (tb.GetModifiers ());
+ add_attr (mb.GetModifiers ());
tc.AddExtensionMethod (mb);
| t =>
Message.Error ($ "extension methods not yet supported on generic "
Modified: nemerle/trunk/ncc/external/InternalTypes.n
==============================================================================
--- nemerle/trunk/ncc/external/InternalTypes.n (original)
+++ nemerle/trunk/ncc/external/InternalTypes.n Tue Jan 31 14:10:58 2006
@@ -131,6 +131,16 @@
get { InternalType.ImmutableAttribute_tc.SystemType }
}
+ public ExtensionAttribute : System.Type
+ {
+ get {
+ if (InternalType.ExtensionAttribute_tc == null ||
+ InternalType.ExtensionAttribute_tc is TypeBuilder) null
+ else
+ InternalType.ExtensionAttribute_tc.SystemType
+ }
+ }
+
public ConstantVariantOptionAttribute : System.Type
{
get { InternalType.ConstantVariantOptionAttribute_tc.SystemType }
@@ -376,6 +386,7 @@
public mutable TypeAttribute_tc : TypeInfo;
public mutable VariantAttribute_tc : TypeInfo;
public mutable ImmutableAttribute_tc : TypeInfo;
+ public mutable ExtensionAttribute_tc : TypeInfo;
public mutable TypeAliasAttribute_tc : TypeInfo;
public mutable VariantOptionAttribute_tc : TypeInfo;
public mutable VolatileModifier_tc : TypeInfo;
@@ -592,6 +603,7 @@
InternalType.VariantOptionAttribute_tc = lookup ("Nemerle.Internal.VariantOptionAttribute");
InternalType.VolatileModifier_tc = lookup ("Nemerle.Internal.VolatileModifier");
InternalType.ImmutableAttribute_tc = lookup ("Nemerle.Internal.ImmutableAttribute");
+ InternalType.ExtensionAttribute_tc = lookup ("Nemerle.Internal.ExtensionAttribute");
InternalType.ConstantVariantOptionAttribute_tc = lookup ("Nemerle.Internal.ConstantVariantOptionAttribute");
InternalType.ExtensionPatternEncodingAttribute_tc = lookup ("Nemerle.Internal.ExtensionPatternEncodingAttribute");
Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n (original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n Tue Jan 31 14:10:58 2006
@@ -662,6 +662,8 @@
when (LibraryReference.add_buildins) AddBuiltins ();
// else Message.Debug ($"omiititng $FullName");
+
+ decode_extension_methods ();
}
#region Special numeric overloads
@@ -1273,6 +1275,22 @@
library.TypeInfoOfType (system_type.GetField ("value__").FieldType)
}
}
+
+ decode_extension_methods () : void
+ {
+ when (SystemType.ExtensionAttribute != null) {
+ def t = SystemType.ExtensionAttribute;
+ when (system_type.IsDefined (t, false)) {
+ foreach (m is IMethod in GetMembers ())
+ when (m.IsStatic && m.GetHandle ().IsDefined (t, false))
+ match (m.GetParameters ().Head.ty.Fix ()) {
+ | Class (tc, []) =>
+ tc.AddExtensionMethod (m);
+ | _ => Util.ice ()
+ }
+ }
+ }
+ }
}
private class FieldInfo : IField
Modified: nemerle/trunk/ncc/hierarchy/ExtensionMethod.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ExtensionMethod.n (original)
+++ nemerle/trunk/ncc/hierarchy/ExtensionMethod.n Tue Jan 31 14:10:58 2006
@@ -39,8 +39,10 @@
base (parent, BuiltinMethodKind.ExtensionMethod (impl));
//Message.Debug ($"adding extension method $impl to $parent");
def h = impl.GetHeader ();
+ assert (h != null);
+ assert (h.parms != null);
assert (h.typarms is []);
- assert (h.tenv.IsEmpty);
+ assert (h.tenv == null || h.tenv.IsEmpty);
header = Fun_header (h.loc, h.name, h.ret_type, h.parms.Tail, [], h.tenv);
}
Added: nemerle/trunk/ncc/testsuite/positive/extension-methods-lib.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/positive/extension-methods-lib.n Tue Jan 31 14:10:58 2006
@@ -0,0 +1,20 @@
+// OPTIONS: -t:library
+#pragma indent
+using System.Console
+
+public class A
+ public v : int
+ public this (v : int)
+ this.v = v
+ public foo () : void
+ Write ("foo()\n")
+
+public class B
+ public static foo (this a : A, p : int) : void
+ Write ($"foo($(a.v),$p)\n")
+
+ public static Run () : void
+ def a = A (42)
+ a.foo ()
+ a.foo (1)
+ B.foo (a, 2)
Modified: nemerle/trunk/ncc/testsuite/positive/extension-methods.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/extension-methods.n (original)
+++ nemerle/trunk/ncc/testsuite/positive/extension-methods.n Tue Jan 31 14:10:58 2006
@@ -1,17 +1,8 @@
+// OPTIONS: -r:extension-methods-lib.dll
#pragma indent
using System.Console
-class A
- public v : int
- public this (v : int)
- this.v = v
- public foo () : void
- Write ("foo()\n")
-
-class B
- public static foo (this a : A, p : int) : void
- Write ($"foo($(a.v),$p)\n")
-
+B.Run ()
def a = A (42)
a.foo ()
a.foo (1)
@@ -22,5 +13,8 @@
foo()
foo(42,1)
foo(42,2)
+foo()
+foo(42,1)
+foo(42,2)
END-OUTPUT
*/
More information about the svn
mailing list