readonly bool nameEscaped;
// It can contain more onwers when the attribute is applied to multiple fiels.
- Attributable[] owners;
+ protected Attributable[] owners;
static readonly AttributeUsageAttribute DefaultUsageAttribute = new AttributeUsageAttribute (AttributeTargets.All);
static Assembly orig_sec_assembly;
att_cache = new PtrHashtable ();
}
- public void AttachTo (Attributable owner)
+ public virtual void AttachTo (Attributable owner)
{
if (this.owners == null) {
this.owners = new Attributable[1] { owner };
Attributable owner = Owner;
EmitContext ec = new EmitContext (owner.ResolveContext, owner.ResolveContext.DeclContainer, owner.ResolveContext.DeclContainer,
- Location, null, null, owner.ResolveContext.DeclContainer.ModFlags, false);
+ Location, null, typeof (Attribute), owner.ResolveContext.DeclContainer.ModFlags, false);
ec.IsAnonymousMethodAllowed = false;
ConstructorInfo ctor = ResolveConstructor (ec);
}
}
- Expression mg = Expression.MemberLookup (ec.ContainerType,
+ MethodGroupExpr mg = Expression.MemberLookup (ec.ContainerType,
Type, ".ctor", MemberTypes.Constructor,
BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly,
- Location);
+ Location) as MethodGroupExpr;
if (mg == null)
return null;
- MethodBase constructor = ((MethodGroupExpr)mg).OverloadResolve (
- ec, PosArguments, false, Location);
-
- if (constructor == null)
+ mg = mg.OverloadResolve (ec, PosArguments, false, Location);
+ if (mg == null)
return null;
+
+ ConstructorInfo constructor = (ConstructorInfo)mg;
+ // TODO: move to OverloadResolve
ObsoleteAttribute oa = AttributeTester.GetMethodObsoleteAttribute (constructor);
if (oa != null && !Owner.ResolveContext.IsInObsoleteScope) {
AttributeTester.Report_ObsoleteMessage (oa, mg.GetSignatureForError (), mg.Location);
if (PosArguments == null) {
pos_values = EmptyObject;
- return (ConstructorInfo)constructor;
+ return constructor;
}
ParameterData pd = TypeManager.GetParameterData (constructor);
public string GetString ()
{
Expression e = GetValue ();
- if (e is StringLiteral)
- return (e as StringLiteral).Value;
+ if (e is StringConstant)
+ return ((StringConstant)e).Value;
return null;
}
public bool GetBoolean ()
{
Expression e = GetValue ();
- if (e is BoolLiteral)
- return (e as BoolLiteral).Value;
+ if (e is BoolConstant)
+ return ((BoolConstant)e).Value;
return false;
}
base (target, left_expr, identifier, args, loc, nameEscaped)
{
this.ns = ns;
+ this.owners = new Attributable[1];
+ }
+
+ public override void AttachTo (Attributable owner)
+ {
+ if (ExplicitTarget == "assembly") {
+ owners [0] = CodeGen.Assembly;
+ return;
+ }
+ if (ExplicitTarget == "module") {
+ owners [0] = CodeGen.Module;
+ return;
+ }
+ throw new NotImplementedException ("Unknown global explicit target " + ExplicitTarget);
}
void Enter ()
}
bool result;
- if (type.IsArray || type.IsByRef) {
+ if (type.IsArray || type.IsByRef) {
result = IsClsCompliant (TypeManager.GetElementType (type));
+ } else if (TypeManager.IsNullableType (type)) {
+ result = IsClsCompliant (TypeManager.GetTypeArguments (type) [0]);
} else {
result = AnalyzeTypeCompliance (type);
}
if (fb != null) {
return fb as IFixedBuffer;
}
+
+ if (TypeManager.GetConstant (fi) != null)
+ return null;
#if NET_2_0
object o = fixed_buffer_cache [fi];
if (o == null) {
- if (System.Attribute.GetCustomAttribute (fi, TypeManager.fixed_buffer_attr_type) == null) {
+ if (!fi.IsDefined (TypeManager.fixed_buffer_attr_type, false)) {
fixed_buffer_cache.Add (fi, FALSE);
return null;
}
public static bool IsConditionalMethodExcluded (MethodBase mb)
{
mb = TypeManager.DropGenericMethodArguments (mb);
+ // TODO: Has to be fixed for partial methods
if ((mb is MethodBuilder) || (mb is ConstructorBuilder))
return false;