{
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;
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;
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");
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;
public readonly PredefinedMember<MethodSpec> IEnumerableGetEnumerator;
public readonly PredefinedMember<MethodSpec> InterlockedCompareExchange;
public readonly PredefinedMember<MethodSpec> InterlockedCompareExchange_T;
- public readonly PredefinedMember<MethodSpec> IteratorStateMachineAttributeCtor;
public readonly PredefinedMember<MethodSpec> FixedBufferAttributeCtor;
public readonly PredefinedMember<MethodSpec> MethodInfoGetMethodFromHandle;
public readonly PredefinedMember<MethodSpec> MethodInfoGetMethodFromHandle2;
}, false),
null));
- IteratorStateMachineAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.IteratorStateMachine,
- MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
- btypes.Type)));
-
MethodInfoGetMethodFromHandle = new PredefinedMember<MethodSpec> (module, types.MethodBase,
"GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle);
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)
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;
}
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<TypeSpec> 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);
}
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;
public TypeSpec Resolve ()
{
if (type == null)
- type = Resolve (module, kind, ns, name, arity);
+ type = Resolve (module, kind, ns, name, arity, false, true);
return type;
}
}
}
- partial class TypeManager {
-
- /// <summary>
- /// Returns the C# name of a type if possible, or the full type name otherwise
- /// </summary>
- 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<TypeSpec> types)
+ partial class TypeManager {
+
+ static public string CSharpName(IList<TypeSpec> types)
{
if (types.Count == 0)
return string.Empty;
if (i > 0)
sb.Append (",");
- sb.Append (CSharpName (types [i]));
+ sb.Append (types [i].GetSignatureForError ());
}
return sb.ToString ();
}
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;
}