X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fattribute.cs;h=2152674d2da63e7d766bea3b3f36bde38a0a0b18;hb=17183a6fbf75a5ca960d7541676aea7fd7b09d21;hp=87174664d48c31202fac13d59a1e44b2e973b4d8;hpb=6dae772d495d85e1f4f33c1c660cbcc9589d20c6;p=mono.git diff --git a/mcs/mcs/attribute.cs b/mcs/mcs/attribute.cs index 87174664d48..2152674d2da 100644 --- a/mcs/mcs/attribute.cs +++ b/mcs/mcs/attribute.cs @@ -284,7 +284,8 @@ namespace Mono.CSharp { /// void ResolveAttributeType (bool comparisonOnly) { - SessionReportPrinter resolve_printer = new SessionReportPrinter (); + var resolve_printer = new SessionReportPrinter (); + SessionReportPrinter secondary_printer = null; ReportPrinter prev_recorder = Report.SetPrinter (resolve_printer); bool t1_is_attr = false; @@ -297,20 +298,25 @@ namespace Mono.CSharp { try { t1 = expression.ResolveAsType (context); - if (t1 != null) - t1_is_attr = t1.IsAttribute; - resolve_printer.EndSession (); + if (t1 != null && resolve_printer.ErrorsCount == 0) + t1_is_attr = t1.IsAttribute; + if (nameEscaped) { t2 = null; } else { expanded = (ATypeNameExpression) expression.Clone (null); expanded.Name += "Attribute"; + secondary_printer = new SessionReportPrinter (); + Report.SetPrinter (secondary_printer); t2 = expanded.ResolveAsType (context); - if (t2 != null) + secondary_printer.EndSession (); + if (t2 != null && secondary_printer.ErrorsCount == 0) t2_is_attr = t2.IsAttribute; + + secondary_printer.EndSession (); } } finally { context.Module.Compiler.Report.SetPrinter (prev_recorder); @@ -341,17 +347,25 @@ namespace Mono.CSharp { resolve_error = true; - if (t1 != null) { - resolve_printer.Merge (prev_recorder); + if (t1 != null) { + if (resolve_printer.IsEmpty) { + Report.SymbolRelatedToPreviousError (t1); + Report.Error (616, Location, "`{0}': is not an attribute class", t1.GetSignatureForError ()); + } else { + resolve_printer.Merge (prev_recorder); + } - Report.SymbolRelatedToPreviousError (t1); - Report.Error (616, Location, "`{0}': is not an attribute class", t1.GetSignatureForError ()); return; } if (t2 != null) { - Report.SymbolRelatedToPreviousError (t2); - Report.Error (616, Location, "`{0}': is not an attribute class", t2.GetSignatureForError ()); + if (secondary_printer.IsEmpty) { + Report.SymbolRelatedToPreviousError (t2); + Report.Error (616, Location, "`{0}': is not an attribute class", t2.GetSignatureForError ()); + } else { + secondary_printer.Merge (prev_recorder); + } + return; } @@ -1651,6 +1665,7 @@ namespace Mono.CSharp { public readonly PredefinedAttribute UnmanagedFunctionPointer; public readonly PredefinedDebuggerBrowsableAttribute DebuggerBrowsable; public readonly PredefinedAttribute DebuggerStepThrough; + public readonly PredefinedDebuggableAttribute Debuggable; // New in .NET 3.5 public readonly PredefinedAttribute Extension; @@ -1718,6 +1733,7 @@ namespace Mono.CSharp { UnmanagedFunctionPointer = new PredefinedAttribute (module, "System.Runtime.InteropServices", "UnmanagedFunctionPointerAttribute"); DebuggerBrowsable = new PredefinedDebuggerBrowsableAttribute (module, "System.Diagnostics", "DebuggerBrowsableAttribute"); DebuggerStepThrough = new PredefinedAttribute (module, "System.Diagnostics", "DebuggerStepThroughAttribute"); + Debuggable = new PredefinedDebuggableAttribute (module, "System.Diagnostics", "DebuggableAttribute"); Extension = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "ExtensionAttribute"); @@ -1878,6 +1894,40 @@ namespace Mono.CSharp { } } + public class PredefinedDebuggableAttribute : PredefinedAttribute + { + public PredefinedDebuggableAttribute (ModuleContainer module, string ns, string name) + : base (module, ns, name) + { + } + + public void EmitAttribute (AssemblyBuilder builder, System.Diagnostics.DebuggableAttribute.DebuggingModes modes) + { + var atype = module.PredefinedAttributes.Debuggable; + if (!atype.Define ()) + return; + + MethodSpec ctor = null; + foreach (MethodSpec m in MemberCache.FindMembers (atype.TypeSpec, CSharp.Constructor.ConstructorName, true)) { + if (m.Parameters.Count != 1) + continue; + + if (m.Parameters.Types[0].Kind == MemberKind.Enum) { + ctor = m; + } + } + + if (ctor == null) + return; + + AttributeEncoder encoder = new AttributeEncoder (); + encoder.Encode ((int) modes); + encoder.EncodeEmptyNamedArguments (); + + builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ()); + } + } + public class PredefinedDecimalAttribute : PredefinedAttribute { public PredefinedDecimalAttribute (ModuleContainer module, string ns, string name)