X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Ftypemanager.cs;h=870b7be2a754773b25c721b29e0fb28b38d4315c;hb=9a587b5266b8dbb30c8e4c8883faabcfc4c4b6d2;hp=f836bd5860268ee1250d747189ed8f0e24850e8c;hpb=3d43cfdfccc1aa699e599c39f91fb41231304da9;p=mono.git diff --git a/mcs/mcs/typemanager.cs b/mcs/mcs/typemanager.cs index f836bd58602..870b7be2a75 100644 --- a/mcs/mcs/typemanager.cs +++ b/mcs/mcs/typemanager.cs @@ -144,7 +144,7 @@ namespace Mono.CSharp { var ctx = module.Compiler; foreach (var p in types) { - var found = PredefinedType.Resolve (module, p.Kind, p.Namespace, p.Name, p.Arity); + var found = PredefinedType.Resolve (module, p.Kind, p.Namespace, p.Name, p.Arity, true, true); if (found == null || found == p) continue; @@ -186,7 +186,9 @@ namespace Mono.CSharp public readonly PredefinedType IsVolatile; public readonly PredefinedType IEnumeratorGeneric; public readonly PredefinedType IListGeneric; + public readonly PredefinedType IReadOnlyListGeneric; public readonly PredefinedType ICollectionGeneric; + public readonly PredefinedType IReadOnlyCollectionGeneric; public readonly PredefinedType IEnumerableGeneric; public readonly PredefinedType Nullable; public readonly PredefinedType Activator; @@ -246,7 +248,9 @@ namespace Mono.CSharp IsVolatile = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "IsVolatile"); IEnumeratorGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IEnumerator", 1); IListGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IList", 1); + IReadOnlyListGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IReadOnlyList", 1); ICollectionGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "ICollection", 1); + IReadOnlyCollectionGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IReadOnlyCollection", 1); IEnumerableGeneric = new PredefinedType (module, MemberKind.Interface, "System.Collections.Generic", "IEnumerable", 1); Nullable = new PredefinedType (module, MemberKind.Struct, "System", "Nullable", 1); Activator = new PredefinedType (module, MemberKind.Class, "System", "Activator"); @@ -294,13 +298,19 @@ namespace Mono.CSharp ArgIterator.TypeSpec.IsSpecialRuntimeType = true; if (IEnumerableGeneric.Define ()) - IEnumerableGeneric.TypeSpec.IsGenericIterateInterface = true; + IEnumerableGeneric.TypeSpec.IsArrayGenericInterface = true; if (IListGeneric.Define ()) - IListGeneric.TypeSpec.IsGenericIterateInterface = true; + IListGeneric.TypeSpec.IsArrayGenericInterface = true; + + if (IReadOnlyListGeneric.Define ()) + IReadOnlyListGeneric.TypeSpec.IsArrayGenericInterface = true; if (ICollectionGeneric.Define ()) - ICollectionGeneric.TypeSpec.IsGenericIterateInterface = true; + ICollectionGeneric.TypeSpec.IsArrayGenericInterface = true; + + if (IReadOnlyCollectionGeneric.Define ()) + IReadOnlyCollectionGeneric.TypeSpec.IsArrayGenericInterface = true; if (Nullable.Define ()) Nullable.TypeSpec.IsNullableType = true; @@ -358,7 +368,6 @@ namespace Mono.CSharp public readonly PredefinedMember IEnumerableGetEnumerator; public readonly PredefinedMember InterlockedCompareExchange; public readonly PredefinedMember InterlockedCompareExchange_T; - public readonly PredefinedMember IteratorStateMachineAttributeCtor; public readonly PredefinedMember FixedBufferAttributeCtor; public readonly PredefinedMember MethodInfoGetMethodFromHandle; public readonly PredefinedMember MethodInfoGetMethodFromHandle2; @@ -631,10 +640,6 @@ namespace Mono.CSharp }, false), null)); - IteratorStateMachineAttributeCtor = new PredefinedMember (module, atypes.IteratorStateMachine, - MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved ( - btypes.Type))); - MethodInfoGetMethodFromHandle = new PredefinedMember (module, types.MethodBase, "GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle); @@ -696,6 +701,7 @@ namespace Mono.CSharp readonly MemberKind kind; protected readonly ModuleContainer module; protected TypeSpec type; + bool defined; public PredefinedType (ModuleContainer module, MemberKind kind, string ns, string name, int arity) : this (module, kind, ns, name) @@ -758,7 +764,11 @@ namespace Mono.CSharp if (type != null) return true; - type = Resolve (module, kind, ns, name, arity, false); + if (!defined) { + defined = true; + type = Resolve (module, kind, ns, name, arity, false, false); + } + return type != null; } @@ -767,15 +777,20 @@ namespace Mono.CSharp return ns + "." + name; } - public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity) + public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity, bool required, bool reportErrors) { - return Resolve (module, kind, ns, name, arity, true); - } + // + // Cannot call it with true because it could create non-existent namespaces for + // predefined types. It's set to true only for build-in types which all must + // exist therefore it does not matter, for predefined types we don't want to create + // fake namespaces when type is optional and does not exist (e.g. System.Linq). + // + Namespace type_ns = module.GlobalRootNamespace.GetNamespace (ns, required); + + IList found = null; + if (type_ns != null) + found = type_ns.GetAllTypes (name); - public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity, bool reportErrors) - { - Namespace type_ns = module.GlobalRootNamespace.GetNamespace (ns, true); - var found = type_ns.GetAllTypes (name); if (found == null) { if (reportErrors) module.Compiler.Report.Error (518, "The predefined type `{0}.{1}' is not defined or imported", ns, name); @@ -830,15 +845,22 @@ namespace Mono.CSharp } if (best_match == null && reportErrors) { - Location loc; - if (found[0].MemberDefinition is MemberCore) { - loc = ((MemberCore) found[0].MemberDefinition).Location; + var found_member = found[0]; + + if (found_member.Kind == MemberKind.MissingType) { + // CSC: should be different error number + module.Compiler.Report.Error (518, "The predefined type `{0}.{1}' is defined in an assembly that is not referenced.", ns, name); } else { - loc = Location.Null; - module.Compiler.Report.SymbolRelatedToPreviousError (found[0]); - } + Location loc; + if (found_member.MemberDefinition is MemberCore) { + loc = ((MemberCore) found_member.MemberDefinition).Location; + } else { + loc = Location.Null; + module.Compiler.Report.SymbolRelatedToPreviousError (found_member); + } - module.Compiler.Report.Error (520, loc, "The predefined type `{0}.{1}' is not declared correctly", ns, name); + module.Compiler.Report.Error (520, loc, "The predefined type `{0}.{1}' is not declared correctly", ns, name); + } } return best_match; @@ -847,7 +869,7 @@ namespace Mono.CSharp public TypeSpec Resolve () { if (type == null) - type = Resolve (module, kind, ns, name, arity); + type = Resolve (module, kind, ns, name, arity, false, true); return type; } @@ -970,17 +992,22 @@ namespace Mono.CSharp } } - partial class TypeManager { - - /// - /// Returns the C# name of a type if possible, or the full type name otherwise - /// - static public string CSharpName (TypeSpec t) + public class AwaiterDefinition { - return t.GetSignatureForError (); + public PropertySpec IsCompleted { get; set; } + public MethodSpec GetResult { get; set; } + public bool INotifyCompletion { get; set; } + + public bool IsValidPattern { + get { + return IsCompleted != null && GetResult != null && IsCompleted.HasGet; + } + } } - static public string CSharpName (IList types) + partial class TypeManager { + + static public string CSharpName(IList types) { if (types.Count == 0) return string.Empty; @@ -990,7 +1017,7 @@ namespace Mono.CSharp if (i > 0) sb.Append (","); - sb.Append (CSharpName (types [i])); + sb.Append (types [i].GetSignatureForError ()); } return sb.ToString (); } @@ -1078,7 +1105,7 @@ namespace Mono.CSharp rc.Compiler.Report.SymbolRelatedToPreviousError (t); rc.Compiler.Report.Error (208, loc, "Cannot take the address of, get the size of, or declare a pointer to a managed type `{0}'", - CSharpName (t)); + t.GetSignatureForError ()); return false; }