[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