[svn] r6579: nemerle/trunk/ncc: external/InternalTypes.n external/LibrariesLoader.n passes.n

VladD2 svnadmin at nemerle.org
Sat Aug 26 15:28:12 CEST 2006


Log:
Fix loading extension methods from external assemblies.

Author: VladD2
Date: Sat Aug 26 15:28:05 2006
New Revision: 6579

Modified:
   nemerle/trunk/ncc/external/InternalTypes.n
   nemerle/trunk/ncc/external/LibrariesLoader.n
   nemerle/trunk/ncc/passes.n

Modified: nemerle/trunk/ncc/external/InternalTypes.n
==============================================================================
--- nemerle/trunk/ncc/external/InternalTypes.n	(original)
+++ nemerle/trunk/ncc/external/InternalTypes.n	Sat Aug 26 15:28:05 2006
@@ -72,8 +72,6 @@
   public mutable ParamArrayAttribute : System.Type;
 
   // set in LibrariesLoader upon first possiblity
-  public mutable ExtensionAttribute : System.Type;
-  public mutable SQ_ExtensionAttribute : System.Type;
 
   public mutable Decimal_ctors : Hashtable [string, SR.ConstructorInfo];
   public mutable Type_GetTypeFromHandle : SR.MethodInfo;
@@ -395,7 +393,6 @@
   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;
@@ -644,7 +641,6 @@
       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	Sat Aug 26 15:28:05 2006
@@ -355,11 +355,6 @@
       def assembly = lib.GetAssembly ();
       def types = assembly.GetExportedTypes ();
 
-      when (SystemTypeCache.ExtensionAttribute == null)
-        SystemTypeCache.ExtensionAttribute = assembly.GetType ("Nemerle.Internal.ExtensionAttribute");
-      when (SystemTypeCache.SQ_ExtensionAttribute == null)
-        SystemTypeCache.SQ_ExtensionAttribute = assembly.GetType ("System.Runtime.CompilerServices.ExtensionAttribute");
-
       mutable i = 0;
       for (; i < types.Length; ++i) {
         def t = types[i];
@@ -368,13 +363,9 @@
         def e = ExternalType (t, lib, null);
 
         def (ns_node, path_to_type) = framework_nesting (t);
-
         def mainnode = ns_node.Path (path_to_type);
 
-        when (SystemTypeCache.ExtensionAttribute != null &&
-              t.IsDefined (SystemTypeCache.ExtensionAttribute, false) ||
-              SystemTypeCache.SQ_ExtensionAttribute != null &&
-              t.IsDefined (SystemTypeCache.SQ_ExtensionAttribute, false))
+        when (IsExtension (t))
           _construct_right_away ::= mainnode;
 
         mutable tinfo_cache = null;
@@ -397,6 +388,13 @@
       }
     }
 
+    public static IsExtension (attrsProvider : System.Reflection.ICustomAttributeProvider) : bool
+    {
+      def attrs = attrsProvider.GetCustomAttributes(false);
+      NArray.Exists(attrs, attr => attr.GetType().Name == "ExtensionAttribute")
+    }
+
+
     internal static CacheTypeInfo (t : System.Type, tc : TypeInfo, node : NamespaceTree.Node) : void
     {
       match (node.Value) {
@@ -737,8 +735,7 @@
         when (lib.LibRefManager.add_buildins) AddBuiltins ();
 //        else Message.Debug ($"omiititng $FullName");
 
-        decode_extension_methods (lib.LibRefManager, SystemTypeCache.ExtensionAttribute);
-        decode_extension_methods (lib.LibRefManager, SystemTypeCache.SQ_ExtensionAttribute);
+        decode_extension_methods (lib.LibRefManager);
         
         when (InternalType.Obsolete_tc != null)
           is_obsolete = HasAttribute (InternalType.Obsolete_tc);
@@ -1340,16 +1337,13 @@
         }
       }
 
-      decode_extension_methods (mgr : LibraryReferenceManager, t : System.Type) : void
+      decode_extension_methods (mgr : LibraryReferenceManager) : void
       {
-        when (t != null) {
-          when (system_type.IsDefined (t, false)) {
+        when (LibraryReferenceManager.IsExtension (system_type))
             foreach (m is IMethod in GetMembers ())
-              when (m.IsStatic && m.GetHandle ().IsDefined (t, false))
+            when (m.IsStatic && LibraryReferenceManager.IsExtension (m.GetHandle ()))
                 mgr.AddExtensionMethod (m);
           }
-        }
-      }
       
       internal override GetObsoletionDetails () : string * bool
       {

Modified: nemerle/trunk/ncc/passes.n
==============================================================================
--- nemerle/trunk/ncc/passes.n	(original)
+++ nemerle/trunk/ncc/passes.n	Sat Aug 26 15:28:05 2006
@@ -358,7 +358,8 @@
         LibrariesManager.AddLibrary ("System.Xml");
         };
      
-        Options.ReferencedLibraries.Reverse().Iter (LibrariesManager.AddLibrary);
+        foreach (lib in Options.ReferencedLibraries.Reverse())
+          LibrariesManager.AddLibrary (lib);
 
         foreach (file in Options.MacrosToLoad.Reverse())
           LibrariesManager.LoadMacrosFrom (file);
@@ -369,6 +370,7 @@
         LibrariesManager.LoadExtensions ();
         LibrariesManager.AllowLoadingExtensions = true;
 
+
         unless (Options.DoNotLoadMacros)
           LibrariesManager.LoadMacrosFrom ("Nemerle.Macros");
           



More information about the svn mailing list