[svn] r6521: nemerle/trunk: boot/Nemerle.Compiler.dll boot/Nemerle.MSBuild.Tasks.dll boot/Nemerle.Macros.d...

nazgul svnadmin at nemerle.org
Mon Aug 14 22:19:40 CEST 2006


Log:
Support obsolete attribute warnings. Some refactoring of hierarchy model

Author: nazgul
Date: Mon Aug 14 22:17:36 2006
New Revision: 6521

Modified:
   nemerle/trunk/boot/Nemerle.Compiler.dll
   nemerle/trunk/boot/Nemerle.MSBuild.Tasks.dll
   nemerle/trunk/boot/Nemerle.Macros.dll
   nemerle/trunk/boot/Nemerle.dll
   nemerle/trunk/boot/ncc.exe
   nemerle/trunk/ncc/codedom/NemerleCodeProvider.n
   nemerle/trunk/ncc/external/InternalTypes.n
   nemerle/trunk/ncc/external/LibrariesLoader.n
   nemerle/trunk/ncc/hierarchy/BuiltinMethod.n
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/hierarchy/CustomAttribute.n
   nemerle/trunk/ncc/hierarchy/TypeBuilder.n
   nemerle/trunk/ncc/hierarchy/TypeInfo.n
   nemerle/trunk/ncc/passes.n
   nemerle/trunk/ncc/testsuite/positive/attributes.n
   nemerle/trunk/snippets/blogComments.n

Modified: nemerle/trunk/boot/Nemerle.Compiler.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/boot/Nemerle.MSBuild.Tasks.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/boot/Nemerle.Macros.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/boot/Nemerle.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/boot/ncc.exe
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/ncc/codedom/NemerleCodeProvider.n
==============================================================================
--- nemerle/trunk/ncc/codedom/NemerleCodeProvider.n	(original)
+++ nemerle/trunk/ncc/codedom/NemerleCodeProvider.n	Mon Aug 14 22:17:36 2006
@@ -21,11 +21,13 @@
       get { "n" }
     }
 
+    [Obsolete ("do not use CreateCompiler directly")]
     public override CreateCompiler () : ICodeCompiler
     {
       NemerleCodeCompiler ();
     }
 
+    [Obsolete ("do not use CreateGenerator directly")]
     public override CreateGenerator () : ICodeGenerator
     {
       NemerleCodeGenerator();

Modified: nemerle/trunk/ncc/external/InternalTypes.n
==============================================================================
--- nemerle/trunk/ncc/external/InternalTypes.n	(original)
+++ nemerle/trunk/ncc/external/InternalTypes.n	Mon Aug 14 22:17:36 2006
@@ -416,6 +416,7 @@
   public mutable Generic_Nullable_tc : TypeInfo;
   public mutable DllImport_tc : TypeInfo;
   public mutable Serializable_tc : TypeInfo;    
+  public mutable Obsolete_tc : TypeInfo;    
 
   mutable function_types : array [FunctionType];
   mutable tuple_types : array [TupleType];
@@ -587,6 +588,7 @@
     Generic_Nullable_tc = lookup ("System.Nullable", 1);
     DllImport_tc = lookup ("System.Runtime.InteropServices.DllImportAttribute");
     Serializable_tc = lookup ("System.SerializableAttribute");    
+    Obsolete_tc = lookup ("System.ObsoleteAttribute");    
     IObjectReference = MType.Class (lookup ("System.Runtime.Serialization.IObjectReference"), []);
     Reflection_Missing = MType.Class (lookup ("System.Reflection.Missing"), []);
     

Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n	(original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n	Mon Aug 14 22:17:36 2006
@@ -311,9 +311,10 @@
       
       // If assembly not loaded try load it by partial name (may be it in GAC).
       // It's a hack!!! LoadWithPartialName is obsolete!
+#pragma warning disable 618      
       when (assembly == null)
         assembly = SR.Assembly.LoadWithPartialName (if (strongPart == null) name else name + strongPart);
-
+#pragma warning restore 618      
       if (assembly == null)
         Message.Error ("cannot load assembly with macros `" + name + "'")
       else
@@ -671,7 +672,6 @@
     internal class NetType : TypeInfo
     {
       protected library : LibraryReference;
-      protected attributes : NemerleAttributes;
 
       internal tenv : Map [string, StaticTyVar] = Map ();
       protected direct_supertypes : list [MType.Class];
@@ -739,6 +739,9 @@
 
         decode_extension_methods (lib.LibRefManager, SystemTypeCache.ExtensionAttribute);
         decode_extension_methods (lib.LibRefManager, SystemTypeCache.SQ_ExtensionAttribute);
+        
+        when (InternalType.Obsolete_tc != null)
+          is_obsolete = HasAttribute (InternalType.Obsolete_tc);
       }
 
       #region Special numeric overloads
@@ -1016,9 +1019,6 @@
       internal override GetLibraryReference () : LibraryReference
       { library }
 
-      public override IsSealed : bool
-      { get { system_type.IsSealed } }
-      
       public override IsDelegate : bool
       {
         [Nemerle.Memoize]
@@ -1046,11 +1046,6 @@
         get { library._location }
       }
 
-      public override Attributes : NemerleAttributes
-      {
-        get { attributes }
-      }
-
       public override GetModifiers () : Modifiers
       {
         Util.ice ("GetModifiers not supported on external entities")
@@ -1098,12 +1093,6 @@
         get { true }
       }
       
-      public override HasBeenUsed : bool
-      {
-        get { true }
-        set { ignore (value) }
-      }
-      
       public override GetTydecl () : TypeDeclaration
       {
         if (system_type.IsInterface)
@@ -1361,23 +1350,74 @@
           }
         }
       }
+      
+      internal override GetObsoletionDetails () : string * bool
+      {
+        def cust = System.Attribute.GetCustomAttribute (system_type, library.Manager.InternalType.Obsolete_tc.SystemType, false) :> System.ObsoleteAttribute;
+        assert (cust != null);
+        (cust.Message, cust.IsError)
+      }
+      
+      public override GlobalEnv : GlobalEnv
+      {
+        get { library.Manager.CoreEnv }
+      }
+    }
+    
+    private abstract class ExternalMemberInfo : MemberInfo
+    {
+      protected library : LibraryReference;      
+      
+      public this (lib : LibraryReference) {
+        library = lib;
+        when (lib.Manager.InternalType.Obsolete_tc != null)
+          is_obsolete = HasAttribute (lib.Manager.InternalType.Obsolete_tc);
+      }
+      
+      internal override GetObsoletionDetails () : string * bool
+      {
+        def cust = System.Attribute.GetCustomAttribute (GetHandle (), library.Manager.InternalType.Obsolete_tc.SystemType, false) :> System.ObsoleteAttribute;
+        assert (cust != null);
+        (cust.Message, cust.IsError)
+      }
+      
+      public HasAttribute (attribute : TypeInfo) : bool
+      {
+        def t = attribute.SystemType;
+        GetHandle ().IsDefined (t, false)
+      }
+      
+      public Location : Location
+      {
+        get { library._location }
+      }
+      
+      public abstract GetHandle () : SR.MemberInfo;
+      
+      public override GlobalEnv : GlobalEnv
+      {
+        get { library.Manager.CoreEnv }
+      }
+      
+      public override GetModifiers () : Modifiers
+      {
+        Util.ice ("GetModifiers not supported on external entities")
+      }
     }
    
     [ManagerAccess (library.Manager)]
-    private class FieldInfo : IField
+    private class FieldInfo : ExternalMemberInfo, IField
     {
       protected handle : SR.FieldInfo;
-      protected library : LibraryReference;
+
       protected id : int;
       protected mutable tt_type : MType;
-      protected mutable attributes : NemerleAttributes;
 
-      public this (tenv : Map [string, StaticTyVar], lib : LibraryReference,
-                   h : SR.FieldInfo)
+      public this (tenv : Map [string, StaticTyVar], lib : LibraryReference, h : SR.FieldInfo)
       {
-        id = Util.next_id ();
-        library = lib;
         handle = h;
+        base (lib);
+        id = Util.next_id ();
        
         tt_type = library.TypeOfType (tenv, handle.FieldType);
         set_attributes ();
@@ -1427,7 +1467,7 @@
         handle
       }
       
-      public GetHandle () : SR.MemberInfo
+      public override GetHandle () : SR.MemberInfo
       {
         handle
       }
@@ -1449,36 +1489,10 @@
         MemberKind.Field (this)
       }
 
-      public Location : Location
-      {
-        get { library._location }
-      }
-
-      public Attributes : NemerleAttributes
-      {
-        get { attributes }
-      }
-
-      public GetModifiers () : Modifiers
-      {
-        Util.ice ("GetModifiers not supported on external entities")
-      }
-
-      public IsStatic : bool
-      {
-        get { handle.IsStatic }
-      }
-
-      public HasBeenUsed : bool
-      {
-        get { true }
-        set { ignore (value) }
-      }
-
       public HasBeenAssigned : bool
       {
         get { true }
-        set { ignore (value) }
+        set { base.HasBeenUsed = value }
       }
       
       public IsLiteral : bool
@@ -1543,29 +1557,22 @@
     }
 
     [ManagerAccess (library.Manager)]
-    class NetEvent : IEvent
+    class NetEvent : ExternalMemberInfo, IEvent
     {
       protected handle : SR.EventInfo;
-      protected library : LibraryReference;
       protected id : int;
-      protected is_static : bool;
       protected adder : MethodInfo;
       protected remover : MethodInfo;
       protected mutable mem_type : MType;
 
       public this (lib : LibraryReference, h : SR.EventInfo)
       {
-        id = Util.next_id ();
-        library = lib;
         handle = h;
-        
+        base (lib);
+        id = Util.next_id ();
         def add_method = handle.GetAddMethod (true);
         def remove_method = handle.GetRemoveMethod (true);
 
-        is_static =
-          (add_method != null && add_method.IsStatic) ||
-          (remove_method != null && remove_method.IsStatic);
-
         def tenv = (DeclaringType :> NetType).tenv;
         adder = library.MethodOfMethodInfo (tenv, add_method);
         remover = library.MethodOfMethodInfo (tenv, remove_method);
@@ -1577,6 +1584,8 @@
           | MType.Fun (t, _) => mem_type = t.FixedValue
           | _ => assert (false)
         }
+        
+        attributes = adder.Attributes;
       }
 
       public DeclaringType : TypeInfo
@@ -1617,7 +1626,7 @@
         handle
       }
       
-      public GetHandle () : SR.MemberInfo
+      public override GetHandle () : SR.MemberInfo
       {
         handle
       }
@@ -1638,32 +1647,6 @@
         MemberKind.Event (this)
       }
 
-      public Location : Location
-      {
-        get { library._location }
-      }
-
-      public Attributes : NemerleAttributes
-      {
-        get { adder.Attributes }
-      }
-
-      public GetModifiers () : Modifiers
-      {
-        Util.ice ("GetModifiers not supported on external entities")
-      }
-
-      public IsStatic : bool
-      {
-        get { is_static }
-      }
-
-      public HasBeenUsed : bool
-      {
-        get { true }
-        set { ignore (value) }
-      }
-      
       public override GetHashCode () : int
       {
         id
@@ -1677,12 +1660,10 @@
     }
     
     [ManagerAccess (library.Manager)]
-    class NetProperty : IProperty
+    class NetProperty : ExternalMemberInfo, IProperty
     {
       protected handle : SR.PropertyInfo;
-      protected library : LibraryReference;
       protected id : int;
-      protected is_static : bool;
       protected getter : MethodInfo;
       protected setter : MethodInfo;
       protected any_method : MethodInfo;
@@ -1690,10 +1671,10 @@
 
       public this (tenv : Map [string, StaticTyVar], lib : LibraryReference, h : SR.PropertyInfo)
       {
-        id = Util.next_id ();
-        library = lib;
         handle = h;
+        base (lib);
         
+        id = Util.next_id ();        
         def get_method = handle.GetGetMethod (true);
         def set_method = handle.GetSetMethod (true);
 
@@ -1707,8 +1688,6 @@
 
         assert (any_method != null);
 
-        is_static = any_method.Attributes %&& NemerleAttributes.Static;
-        
         def ret_type = library.TypeOfType (tenv, handle.PropertyType);
 
         def (args, ret_type) =
@@ -1732,6 +1711,8 @@
           mem_type = ret_type
         else
           mem_type = MType.ConstructFunctionType (args, ret_type);
+          
+        attributes = any_method.Attributes;
       }
 
       public DeclaringType : TypeInfo
@@ -1772,7 +1753,7 @@
         handle
       }
       
-      public GetHandle () : SR.MemberInfo
+      public override GetHandle () : SR.MemberInfo
       {
         handle
       }
@@ -1793,32 +1774,6 @@
         MemberKind.Property (this)
       }
 
-      public Location : Location
-      {
-        get { library._location }
-      }
-
-      public Attributes : NemerleAttributes
-      {
-        get { any_method.Attributes }
-      }
-
-      public GetModifiers () : Modifiers
-      {
-        Util.ice ("GetModifiers not supported on external entities")
-      }
-
-      public IsStatic : bool
-      {
-        get { is_static }
-      }
-      
-      public HasBeenUsed : bool
-      {
-        get { true }
-        set { ignore (value) }
-      }
-
       public override GetHashCode () : int
       {
         id
@@ -1847,23 +1802,35 @@
     }
     
     [ManagerAccess (library.Manager)]
-    class MethodInfo : IMethod
+    class MethodInfo : ExternalMemberInfo, IMethod
     {
       protected handle : SR.MethodBase;
-      protected library : LibraryReference;
       protected id : int;
       protected fun_header : Fun_header;
-      protected attributes : NemerleAttributes;
       protected is_var_args : bool;
       
       public this (tenv : Map [string, StaticTyVar], lib : LibraryReference, h : SR.MethodBase)
       {
-        library = lib;
         handle = h;
+        base(lib);
 
         def (tyvars, tenv) = TyCodec.ReflectTyparms (lib, tenv, h);
         
-        def mkparm (p : SR.ParameterInfo) {
+        def ret_type =
+          match (handle) {
+            | m is SR.MethodInfo => library.TypeOfType (tenv, m.ReturnType)
+            | _ => InternalType.Void // it is ctor
+          }
+        
+        def parms = handle.GetParameters ();
+
+        when (parms.Length > 0) {
+          is_var_args = parms [parms.Length - 1].IsDefined (SystemTypeCache.ParamArrayAttribute, false);
+        }
+
+        mutable fparms = [];
+        for (mutable i = parms.Length - 1; i >= 0; i--) {
+          def p = parms [i];
           def (parmkind, ty) =
             if (p.ParameterType.IsByRef) {
               def ty = library.TypeOfType (tenv, p.ParameterType.GetElementType ());
@@ -1895,26 +1862,15 @@
                   Some (TExpr.DefaultValue (ty))
               }
           }
-          fp
+          fparms ::= fp;
         };
-        def ret_type =
-          if (handle.Name == ".ctor" || handle.Name == ".cctor")
-            InternalType.Void
-          else
-            library.TypeOfType (tenv, (handle :> SR.MethodInfo).ReturnType);
-        
-        def parms = handle.GetParameters ();
-
-        when (parms.Length > 0) {
-          is_var_args = parms [parms.Length - 1].IsDefined (SystemTypeCache.ParamArrayAttribute, false);
-        }
 
         fun_header =
           Fun_header (
             loc = library._location,
             name = Name,
             ret_type = ret_type,
-            parms = List.MapFromArray (parms, mkparm),
+            parms = fparms,
             typarms = tyvars,
             tenv = null
           );
@@ -1965,7 +1921,7 @@
         handle
       }
       
-      public GetHandle () : SR.MemberInfo
+      public override GetHandle () : SR.MemberInfo
       {
         handle
       }
@@ -1987,35 +1943,9 @@
         MemberKind.Method (this)
       }
 
-      public Location : Location
-      {
-        get { library._location }
-      }
-
-      public Attributes : NemerleAttributes
-      {
-        get { attributes }
-      }
-
-      public GetModifiers () : Modifiers
-      {
-        Util.ice ("GetModifiers not supported on external entities")
-      }
-
       public IsFinal : bool
       { get { handle.IsFinal } }
       
-      public IsStatic : bool
-      {
-        get { handle.IsStatic }
-      }
-      
-      public HasBeenUsed : bool
-      {
-        get { true }
-        set { ignore (value) }
-      }
-
       public override GetHashCode () : int
       {
         id

Modified: nemerle/trunk/ncc/hierarchy/BuiltinMethod.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/BuiltinMethod.n	(original)
+++ nemerle/trunk/ncc/hierarchy/BuiltinMethod.n	Mon Aug 14 22:17:36 2006
@@ -153,6 +153,11 @@
       get { true }
     }
 
+    public IsObsolete : bool
+    {
+      get { false }
+    }
+    
     public DeclaringType : TypeInfo
     {
       get { declaring }

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Mon Aug 14 22:17:36 2006
@@ -30,14 +30,14 @@
 using Nemerle.Utility;
 using Nemerle.Compiler.Typedtree;
 
-using System.Reflection;
-
+using SR = System.Reflection;
+using SRE = System.Reflection.Emit;
 using PT = Nemerle.Compiler.Parsetree;
 
 namespace Nemerle.Compiler {
 
 [ManagerAccess (declaring_type.Manager)]
-public abstract class MemberBuilder : IMember
+public abstract class MemberBuilder : MemberInfo, IMember
 {
   protected loc : Location;
   [Accessor]
@@ -50,10 +50,13 @@
   id : int;
   protected mutable kind : MemberKind;
   internal mutable ty : MType;
-  protected mutable handle : MemberInfo;
+  protected mutable handle : SR.MemberInfo;
 
-  [Accessor (flags = WantSetter)]
-  protected mutable attributes : NemerleAttributes;
+  public new Attributes : NemerleAttributes
+  {
+    get { attributes }
+    set { attributes = value }
+  }
 
   protected mutable m_has_been_used : bool;
 
@@ -103,7 +106,9 @@
     m_has_been_used =
       (IsPublic || IsProtected) && declaring_type.IsExternallyAccessible ||
       name.StartsWith ("_") || declaring_type.Name.StartsWith ("_") ||
-      name == "value__"
+      name == "value__";
+      
+    is_obsolete = modifiers.FindAttribute (InternalType.Obsolete_tc, par.GlobalEnv).IsSome;
   }
 
   public virtual BodyLocation : Location
@@ -151,6 +156,11 @@
     ty
   }
 
+  public override GlobalEnv : GlobalEnv
+  {
+    get { declaring_type.GlobalEnv }
+  }
+  
   [Nemerle.OverrideObjectEquals]
   public Equals (o : IMember) : bool
   {
@@ -167,42 +177,18 @@
     get { loc }
   }
 
-  public GetModifiers () : Modifiers
+  public override GetModifiers () : Modifiers
   {
     modifiers
   }
   
-  public IsStatic : bool
-  {
-    get { attributes %&& NemerleAttributes.Static }
-  }
-
-  public IsPublic : bool
-  {
-    get { attributes %&& NemerleAttributes.Public }
-  }
-
-  public IsPrivate : bool
-  {
-    get { attributes %&& NemerleAttributes.Private }
-  }
-
-  public IsProtected : bool
-  {
-    get { attributes %&& NemerleAttributes.Protected }
-  }
-
-  public IsInternal : bool
-  {
-    get { attributes %&& NemerleAttributes.Internal }
-  }
-  
-  public virtual HasBeenUsed : bool
+  public override HasBeenUsed : bool
   {
     get { m_has_been_used }
     set {
-      m_has_been_used = m_has_been_used || value;
-      declaring_type.HasBeenUsed = value
+      base.HasBeenUsed = value;
+      m_has_been_used = true;
+      declaring_type.HasBeenUsed = false; // do not trigger obsoletion warning
     }
   }
   
@@ -215,10 +201,7 @@
     id
   }
 
-  public virtual GetHandle () : System.Reflection.MemberInfo
-  {
-    assert (false)
-  }
+  public abstract GetHandle () : System.Reflection.MemberInfo;
 
   public MarkWithSpecialName () : void
   {
@@ -391,13 +374,13 @@
     declaring_type.process_attributes (MacroSelfParams, MacroTarget, MacroPhase.WithTypedMembers, modifiers, null)
   }
 
-  internal abstract CreateEmitBuilder (emit_tb : Emit.TypeBuilder) : void;
+  internal abstract CreateEmitBuilder (emit_tb : SRE.TypeBuilder) : void;
   internal abstract Compile () : void;
 }
 
 public partial class FieldBuilder : MemberBuilder, IField
 {
-  public mutable field_builder : Emit.FieldBuilder;
+  public mutable field_builder : SRE.FieldBuilder;
   public mutable const_value : Literal;
   mutable has_been_assigned = false;
 
@@ -453,7 +436,7 @@
     const_value
   }
 
-  public GetFieldInfo () : Emit.FieldBuilder
+  public GetFieldInfo () : SRE.FieldBuilder
   {
     assert (field_builder != null, Name);
     field_builder
@@ -520,7 +503,7 @@
   internal parms : list [MType];
   mutable parent_property : IProperty = null;
   
-  internal mutable property_builder : Emit.PropertyBuilder;
+  internal mutable property_builder : SRE.PropertyBuilder;
   
   public this (par : TypeBuilder, f : PT.ClassMember.Property) {
     base (par, f);
@@ -576,7 +559,7 @@
     }
   }
   
-  public GetPropertyInfo () : Emit.PropertyBuilder
+  public GetPropertyInfo () : SRE.PropertyBuilder
   {
     assert (property_builder != null);
     property_builder
@@ -640,8 +623,8 @@
   // FIXME: make these private
   public mutable fun_header : Fun_header;
   
-  public mutable method_builder : System.Reflection.Emit.MethodBuilder;
-  public mutable ctor_builder : System.Reflection.Emit.ConstructorBuilder;
+  public mutable method_builder : SRE.MethodBuilder;
+  public mutable ctor_builder : SRE.ConstructorBuilder;
 
   internal mutable overridden_method : IMethod;
 
@@ -650,29 +633,29 @@
   
   is_var_args : bool;
 
-  public GetMethodBase () : MethodBase
+  public GetMethodBase () : SR.MethodBase
   {
     def res =
       if (method_builder == null)
-        (ctor_builder : MethodBase)
+        ctor_builder
       else
         method_builder;
     assert (res != null);
     res
   }
 
-  public override GetHandle () : MemberInfo
+  public override GetHandle () : SR.MemberInfo
   {
     GetMethodBase ()
   }
 
-  public GetConstructorInfo () : Emit.ConstructorBuilder 
+  public GetConstructorInfo () : SRE.ConstructorBuilder 
   {
     assert (ctor_builder != null);
     ctor_builder
   }
   
-  public GetMethodInfo () : Emit.MethodBuilder
+  public GetMethodInfo () : SRE.MethodBuilder
   {
     assert (method_builder != null, declaring_type.FullName + "." + Name);
     method_builder
@@ -686,6 +669,16 @@
     }
   }
   
+  public override HasBeenUsed : bool
+  {
+    get { m_has_been_used }
+    set {
+      base.HasBeenUsed = value;
+      m_has_been_used = true;
+      declaring_type.HasBeenUsed = fun_kind is FunKind.Constructor; // trigger obsoletion warning only if we are ctor
+    }
+  }
+  
   public HasAbstractBody : bool
   {
     get { (fun_header.body is FunBody.Abstract) }
@@ -1115,7 +1108,7 @@
   adder : MethodBuilder;
   remover : MethodBuilder;
   
-  internal mutable event_builder : Emit.EventBuilder;
+  internal mutable event_builder : SRE.EventBuilder;
   internal storage_field : FieldBuilder;
   
   public this (par : TypeBuilder, f : PT.ClassMember.Event) {
@@ -1174,12 +1167,12 @@
     ty.CheckAccessibility (this, accessibility);
   }
 
-  public GetEventInfo () : EventInfo
+  public GetEventInfo () : SR.EventInfo
   {
      assert (false);
   }
 
-  public override GetHandle () : MemberInfo
+  public override GetHandle () : SR.MemberInfo
   {
     // for some reason !(event_builder)...
     /// lame spec: SRE.EventBuilder is not MemberInfo or event EventInfo

Modified: nemerle/trunk/ncc/hierarchy/CustomAttribute.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/CustomAttribute.n	(original)
+++ nemerle/trunk/ncc/hierarchy/CustomAttribute.n	Mon Aug 14 22:17:36 2006
@@ -552,6 +552,23 @@
   
   public partial class Modifiers
   {
+    public FindAttribute (looking_for : TypeInfo, env : GlobalEnv) : option [PT.PExpr * list [PT.PExpr]]
+    {
+      mutable result = None ();
+      // find our attribute
+      foreach (expr in custom_attrs)
+        match (env.Manager.AttributeCompiler.ResolveAttribute (env, expr)) {
+          | Some ((t, args)) =>
+            when (looking_for.Equals (t)) {
+              result = Some ((expr, args));
+              Nemerle.Imperative.Break ()
+            }
+            
+          | _ => ()
+        }
+      result
+    }
+    
     internal SaveCustomAttributes (ti : TypeBuilder,
                                    adder : SY.AttributeTargets * 
                                            SR.Emit.CustomAttributeBuilder -> string) : void

Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n	Mon Aug 14 22:17:36 2006
@@ -68,7 +68,6 @@
   loc : Location;
   [Accessor] mutable parts_location : list [Location];
   modifiers : Modifiers;
-  mutable attributes : NemerleAttributes;
   accessibility : Accessibility;
   
   typarms_count : int;
@@ -78,6 +77,7 @@
   mutable partial_parts : list [PT.TopDeclaration] = [];
   
   is_enum : bool;
+  [Accessor (flags = WantSetter)]
   mutable is_finalized : bool;
   mutable cannot_finalize : bool;
   mutable m_has_been_used : bool;
@@ -206,21 +206,11 @@
     }
   }
 
-  public override IsSealed : bool
-  {
-    get { attributes %&& NemerleAttributes.Sealed }
-  } 
-
   public IsAbstract : bool
   {
     get { attributes %&& NemerleAttributes.Abstract }
   } 
 
-  public IsModule : bool
-  {
-    get { attributes %&& NemerleAttributes.Static }
-  }
-  
   public override IsDelegate : bool
   {
     get
@@ -250,32 +240,12 @@
     get { IsStruct || is_enum }
   }
 
-  public IsPublic : bool
-  {
-    get { attributes %&& NemerleAttributes.Public }
-  }
-
-  public IsInternal : bool
-  {
-    get { attributes %&& NemerleAttributes.Internal }
-  }
-
-  public IsProtected : bool
-  {
-    get { attributes %&& NemerleAttributes.Protected }
-  }
-
-  public IsPrivate : bool
-  {
-    get { attributes %&& NemerleAttributes.Private }
-  }
-  
   public override GetModifiers () : Modifiers
   {
     modifiers
   }
 
-  public GlobalEnv : GlobalEnv
+  public override GlobalEnv : GlobalEnv
   {
     get { pt_name.context }
   }
@@ -321,11 +291,6 @@
     get { accessibility }
   }
 
-  public override Attributes : NemerleAttributes
-  {
-    get { attributes }
-  }
-
   public override IsExternallyAccessible : bool
   {
     get
@@ -356,9 +321,10 @@
   {
     get { m_has_been_used }
     set {
-      m_has_been_used = m_has_been_used || value;
+      base.HasBeenUsed = value;
+      m_has_been_used = true;
       when (enclosing_type != null)
-        ManagerClass.Instance.MarkAsUsed (enclosing_type)
+        Manager.MarkAsUsed (enclosing_type, value)
     }
   }
 
@@ -392,11 +358,6 @@
     )
   }
 
-  public IsFinalized : bool {
-    get { is_finalized }
-    set { is_finalized = value }
-  }
-
   [Nemerle.Assertions.Requires (TyManager.run_phase <= 2)] 
   public AddImplementedInterface (t : PT.PExpr) : void
   {
@@ -534,21 +495,9 @@
   }
 
 
-  public FindAttribute (looking_for : TypeInfo) : option [PT.PExpr]
+  public FindAttribute (looking_for : TypeInfo) : option [PT.PExpr * list [PT.PExpr]]
   {
-    mutable result = None ();
-    
-    // find our attribute
-    foreach (expr in GetModifiers ().custom_attrs)
-      match (Manager.AttributeCompiler.ResolveAttribute (this.GlobalEnv, expr)) {
-        | Some ((t, _)) =>
-          when (looking_for.Equals (t))
-            result = Some (expr)
-            
-        | _ => ()
-      }
-
-    result
+    GetModifiers ().FindAttribute (looking_for, this.GlobalEnv)
   }
 
   public override AttributeTargets : System.AttributeTargets
@@ -1489,11 +1438,14 @@
               ()
             else if (meth.Attributes %&& NemerleAttributes.Override) {
                 (meth :> MethodBuilder).overridden_method = m;
+                meth.HasBeenUsed = false;
               
                 if (m.Attributes %&& NemerleAttributes.Virtual)
-                  when (m.IsFinal)
+                  if (m.IsFinal)
                     Message.Error ($"`override' specified on $meth, but $x is `sealed'")
                 else
+                    m.HasBeenUsed = !meth.IsObsolete;
+                else
                   Message.Error ($"`override' specified on $meth"
                                  ", but there is no `virtual' modifier on $x");
 
@@ -1502,10 +1454,11 @@
                   Message.Error ($"attempt to change the access modifiers of $meth"
                                  " during override of $x");
             }
-            else
+            else {
               Message.Warning (114, meth.Location, $"$(meth) hides $(x) inherited from base class. "
                                "To make the current member override that implementation, "
                                "add the `override' keyword. Otherwise add the `new' keyword.");
+            }
 
             // return list with the new method inside (and without [x], which is hidden now)
             List.RevAppend (xs, meth :: acc)
@@ -1789,6 +1742,8 @@
    */
   internal add_members () : void
   {
+    is_obsolete = HasAttribute (InternalType.Obsolete_tc);
+    
     assert (member_list == null);
 
     add_derived_members ();
@@ -2109,7 +2064,7 @@
               method_type_ok (iface_meth, meth)
             };
 
-            ManagerClass.Instance.MarkAsUsed (meth);
+            Manager.MarkAsUsed (meth);
             
             def partition_and_set (meths, methods_map) {
               def (correct, notcorrect) = List.Partition (meths, is_correct);
@@ -2156,7 +2111,7 @@
            unless (meth.Attributes %&& NemerleAttributes.Virtual)
              meth.Attributes |= NemerleAttributes.Sealed %| NemerleAttributes.Virtual %| NemerleAttributes.New;
               
-          foreach (mem in impl') ManagerClass.Instance.MarkAsUsed (mem);
+          foreach (mem in impl') Manager.MarkAsUsed (mem, !meth.IsObsolete);
 
           meth.SetFunKind (FunKind.BoundMethod (impl'))
          
@@ -2189,7 +2144,7 @@
                   } else [];
                 already_bound [meth.Name] = lst + already;
                 unless (lst.IsEmpty)
-                  ManagerClass.Instance.MarkAsUsed (meth);
+                  Manager.MarkAsUsed (meth, false);
                 lst
             }
           | None => []
@@ -2203,7 +2158,7 @@
               def new_impls = impl' + impl;
 
               foreach (impl in new_impls)
-                ManagerClass.Instance.MarkAsUsed (impl);
+                Manager.MarkAsUsed (impl, !meth.IsObsolete);
 
               meth.SetFunKind (FunKind.BoundMethod (new_impls));
 
@@ -2263,6 +2218,7 @@
               ]>) :> MethodBuilder;
 
               wrapper.MarkWithSpecialName ();
+              wrapper.HasBeenUsed = false; // do not trigger obsoletion warning
               // note in method definition what we are implementing 
               // (this cannot be automatic because we are currently resolving implements
               wrapper.SetFunKind (FunKind.BoundMethod (correct));
@@ -2493,97 +2449,23 @@
 
   /**
    * Checks for abstract method in non-abstract class errors.
-   * Marks abstract declaration/implementation pairs as used.
-   *
-   * FIXME: we should store information about abstract overrides
-   *        the same way we store information about interfaces,
-   *        this way this code would be linear instead of n^2
    */
   check_abstract () : void
   {
-    def override_methods = Hashtable (30);
-    def type_members = GetMembers ();
-
     // Message.Debug ($"mems $(type_members.ToString(\"\\n\"))");
-    // first, check for the abstract method/non-abstract class errors
-    foreach (m : IMember in type_members) 
+    // check for the abstract method/non-abstract class errors
+    unless (Attributes %&& NemerleAttributes.Abstract)
+      foreach (m in GetMembers ()) 
       match (m.GetKind ()) {
         | MemberKind.Method when m.Attributes %&& NemerleAttributes.Abstract =>
-          unless (Attributes %&& NemerleAttributes.Abstract)
-          {
             attributes |= NemerleAttributes.Abstract;
             if (m.DeclaringType.Equals (this))
               Message.Error ($"$m is abstract, but its declaring class `$(FullName)' is not");
             else
               Message.Error ($"$m must be overriden, because it is abstract and the current class `$(FullName)' is not");
-          }
-            
-        | _ => ()
-      }
-
-    // find all the `override' methods in this type
-    foreach (m : IMember in type_members)
-      match (m.GetKind ()) {
-        | MemberKind.Method when m.Attributes %&& NemerleAttributes.Override =>
-          def previous_methods =
-            match (override_methods.Get (m.Name)) {
-              | Some (methods) => methods
-              | _ => []
-            }
-            
-          override_methods.Set (m.Name, (m :> IMethod) :: previous_methods);
-          ManagerClass.Instance.MarkAsUsed (m)
     
         | _ => ()
       }
-
-    // then, mark abstract declaration/implementation pair as used
-    def walk_hierarchy (tycon : TypeInfo)
-    {
-      // FIXME: this should be defined on Fun_header -- IsCompatible () (?)
-      def fun_parms_agree (abstract_parms : list [Fun_parm], impl_parms : list [Fun_parm])
-      {          
-        | ([], []) => true
-          
-        | (abstract_parm :: rest_abstract_parms, impl_parm :: rest_impl_parms) =>
-          abstract_parm.name == impl_parm.name &&
-          abstract_parm.ty.Fix ().Equals (impl_parm.ty.Fix ()) &&
-          fun_parms_agree (rest_abstract_parms, rest_impl_parms)
-          
-        | _ => false
-      }
-      
-      override_methods.Iter (fun (name : string, meths : list [IMethod]) {
-        foreach (meth : IMethod in meths) 
-        {
-          def meth_parms = meth.GetParameters ();
-        
-          def possible_abstract_meths =
-            List.RevFilter (tycon.LookupMember (name), fun (mem : IMember) {            
-              mem.Attributes %&& NemerleAttributes.Abstract
-            });
-
-          foreach (abstract_meth : IMember in possible_abstract_meths) {
-            def abstract_meth = abstract_meth :> IMethod;
-
-            when (fun_parms_agree (abstract_meth.GetParameters (), meth_parms)) {
-              ManagerClass.Instance.MarkAsUsed (abstract_meth);
-              ManagerClass.Instance.MarkAsUsed (meth)
-            }
-          }
-        }
-      })
-    }
-    and recurse (supertypes : list [MType.Class])
-    {
-      | ty :: rest =>
-        walk_hierarchy (ty.tycon);
-        recurse (rest)
-
-      | [] => ()
-    }
-
-    recurse (GetDirectSuperTypes ())
   }
 
   /**

Modified: nemerle/trunk/ncc/hierarchy/TypeInfo.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeInfo.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeInfo.n	Mon Aug 14 22:17:36 2006
@@ -80,6 +80,7 @@
   Location : Location { get; }
   GetHandle () : System.Reflection.MemberInfo;
   CanAccess (source : TypeInfo) : bool;
+  IsObsolete : bool { get; }
 
   /* public properties */
   DeclaringType : TypeInfo {get;}
@@ -140,10 +141,80 @@
   GetSetter () : IMethod;
 }
 
+public abstract class MemberInfo 
+{
+  [Accessor]
+  protected mutable is_obsolete : bool;
+  [Accessor]
+  protected mutable attributes : NemerleAttributes;  
+  
+  public virtual IsStatic : bool
+  {
+    get { attributes %&& NemerleAttributes.Static }
+  }
+  
+  public IsPublic : bool
+  {
+    get { attributes %&& NemerleAttributes.Public }
+  }
+
+  public IsPrivate : bool
+  {
+    get { attributes %&& NemerleAttributes.Private }
+  }
+
+  public IsProtected : bool
+  {
+    get { attributes %&& NemerleAttributes.Protected }
+  }
+
+  public IsInternal : bool
+  {
+    get { attributes %&& NemerleAttributes.Internal }
+  }
+  
+  public virtual HasBeenUsed : bool { // for the 'unused' warnings    
+    get { true; } // default impl
+    set {
+      when (is_obsolete && value) { // value indicates if we should warn about obsolete
+        mutable msg, is_error;
+        (msg, is_error) = GetObsoletionDetails ();
+        if (msg == null) 
+          msg = $"$this is obsolete";
+        else
+          msg = $"$this is obsolete: '$msg'";
+        if (is_error)
+          Message.Error (msg);
+        else
+          Message.Warning (618, msg);
+      }
+    }
+  } 
+  
+  public abstract GetModifiers () : Modifiers;
+  public abstract GlobalEnv : GlobalEnv
+  { get; }
+  
+  internal virtual GetObsoletionDetails () : string * bool
+  {
+    def (_, parms) = GetModifiers ().FindAttribute (this.GlobalEnv.Manager.InternalType.Obsolete_tc, this.GlobalEnv).Value;
+    mutable msg = null, is_error = false;
+    foreach (x in parms) {
+      | <[ $(m : string) ]> => msg = m;
+      | <[ $(b : bool) ]> => is_error = b;
+      | <[ Message = $(m : string) ]> => msg = m;
+      | <[ IsError = $(b : bool) ]> => is_error = b;
+      | _ => ()
+    }
+    (msg, is_error)
+  }
+}
+
 [ManagerAccess]
-public abstract class TypeInfo : IMember, 
+public abstract class TypeInfo : MemberInfo, IMember, 
                                  Nemerle.IComparable [TypeInfo]
 {
+  [Accessor]
   protected mutable system_type : System.Type;
   id : int;
   protected mutable default_indexer : option [string];
@@ -367,15 +438,22 @@
     MemberKind.Type (this)
   }
 
-  public abstract IsSealed : bool
-  { get; }
-  
   /** Types are always static */
-  public IsStatic : bool
+  public override IsStatic : bool
   {
     get { true }
   }
 
+  public IsModule : bool
+  {
+    get { attributes %&& NemerleAttributes.Static }
+  }
+
+  public IsSealed : bool
+  {
+    get { attributes %&& NemerleAttributes.Sealed }
+  } 
+    
   /** Specifies if given type is an interface */
   public abstract IsInterface : bool
   {
@@ -398,13 +476,6 @@
     }
   }
 
-  public SystemType : System.Type
-  {
-    get {
-      system_type
-    }
-  }
-  
   /** Return full qualified type name with namespaces and nesting types,
       all .-separated.
    */
@@ -771,15 +842,10 @@
   public abstract Location : Location { get; }
   public abstract CanAccess (source : TypeInfo) : bool;
 
-  /* public methods */
-  public abstract GetModifiers () : Modifiers;
-
   /* public properties */
   public abstract DeclaringType : TypeInfo {get;}
   public abstract Name : string {get;}
   public abstract MemberType : MemberTypes {get;}
-  public abstract HasBeenUsed : bool { get; set; } // for the 'unused' warnings
-  public abstract Attributes : NemerleAttributes { get; }
   public abstract UnderlyingType : TypeInfo { get; }
 }
 

Modified: nemerle/trunk/ncc/passes.n
==============================================================================
--- nemerle/trunk/ncc/passes.n	(original)
+++ nemerle/trunk/ncc/passes.n	Mon Aug 14 22:17:36 2006
@@ -211,9 +211,14 @@
       Location_file_names_amount = 1;
     }
     
-    public virtual MarkAsUsed (member : IMember) : void
+    public MarkAsUsed (member : IMember) : void
     {
-      member.HasBeenUsed = true;
+      MarkAsUsed (member, true)
+    }
+    
+    public virtual MarkAsUsed (member : IMember, trigger_obsolete_warn : bool) : void
+    {
+      member.HasBeenUsed = trigger_obsolete_warn;
     }
     
     public virtual MarkAsUsed (member : IMember, _location : Location) : void

Modified: nemerle/trunk/ncc/testsuite/positive/attributes.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/attributes.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/attributes.n	Mon Aug 14 22:17:36 2006
@@ -219,6 +219,43 @@
 	}
 }
 
+[System.Obsolete("use class B")]
+class AObso
+{
+    public Method() : void { }
+}
+class BObso
+{
+    [System.Obsolete("use NewMethod", false)]
+    public OldMethod() : void { }
+    public NewMethod() : void { }
+    
+    static Run () : void { 
+      def x = AObso(); // W: AObso is obsolete.*use class B
+      x.Method ();
+      def b = BObso();
+      b.OldMethod (); // W: method BObso.OldMethod.*use NewMethod
+    } 
+}
+
+class BaseObso
+{
+  [System.Obsolete("use class B")]
+  public virtual Method1() : void { }
+    
+  [System.Obsolete("use class B")]
+  public virtual Method2() : void { }
+}
+
+class DerivObso : BaseObso
+{
+  [System.Obsolete("use class B")]
+  public override Method1() : void { } // OK
+
+  public override Method2() : void { } // W: method BaseObso.Method2.*void is obsolete.*use class B
+}
+
+
 
 module M {
   Main () : void

Modified: nemerle/trunk/snippets/blogComments.n
==============================================================================
--- nemerle/trunk/snippets/blogComments.n	(original)
+++ nemerle/trunk/snippets/blogComments.n	Mon Aug 14 22:17:36 2006
@@ -130,16 +130,14 @@
       def ip = getenv ("REMOTE_ADDR");
       def nick = get_with_default (post, "nick");
 
-      def m = System.Web.Mail.MailMessage ();
+      def m = System.Net.Mail.MailMessage ("comment notifier <feedback at nemerle.org>", "feedback at nemerle.org");
       m.Subject = 
         if (comment_rejected)
           $ "Rejected comment by $nick ($ip)";
         else
           $ "New comment by $nick ($ip)";
-      m.To = "feedback at nemerle.org";
-      m.From = "comment notifier <feedback at nemerle.org>";
       m.Body = $ "http://$(getenv(\"SERVER_NAME\"))$output_url.html\n\n$body\n";
-      System.Web.Mail.SmtpMail.Send (m)
+      System.Net.Mail.SmtpClient().Send (m)
     }
 
 



More information about the svn mailing list