[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