X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fecore.cs;h=8475a9e489428c0d98d91267b7b40954a54be3c2;hb=30f6c9933a6c0595a5d1d5cf681be39b4367446e;hp=fd5732f7598dd20feea9bb715a99f508dce247ab;hpb=b8fff1390ab3089e2c9fd980506dde8773575e45;p=mono.git diff --git a/mcs/mcs/ecore.cs b/mcs/mcs/ecore.cs index fd5732f7598..8475a9e4894 100644 --- a/mcs/mcs/ecore.cs +++ b/mcs/mcs/ecore.cs @@ -841,22 +841,29 @@ namespace Mono.CSharp { public static Expression MemberLookup (IMemberContext rc, bool errorMode, TypeSpec queried_type, string name, int arity, MemberLookupRestrictions restrictions, Location loc) { var members = MemberCache.FindMembers (queried_type, name, false); - if (members == null) - return null; - Expression expr; - do { - expr = MemberLookupToExpression (rc, members, errorMode, queried_type, name, arity, restrictions, loc); - if (expr != null) - return expr; + if (members != null) { + Expression expr; + do { + expr = MemberLookupToExpression (rc, members, errorMode, queried_type, name, arity, restrictions, loc); + if (expr != null) + return expr; - if (members [0].DeclaringType.BaseType == null) - members = null; - else - members = MemberCache.FindMembers (members [0].DeclaringType.BaseType, name, false); - } while (members != null); + if (members [0].DeclaringType.BaseType == null) + members = null; + else + members = MemberCache.FindMembers (members [0].DeclaringType.BaseType, name, false); + } while (members != null); + } - return expr; + var tps = queried_type as TypeParameterSpec; + if (tps != null) { + members = MemberCache.FindInterfaceMembers (tps, name); + if (members != null) + return MemberLookupToExpression (rc, members, errorMode, queried_type, name, arity, restrictions, loc); + } + + return null; } public static Expression MemberLookupToExpression (IMemberContext rc, IList members, bool errorMode, TypeSpec queried_type, string name, int arity, MemberLookupRestrictions restrictions, Location loc) @@ -901,15 +908,6 @@ namespace Mono.CSharp { if ((restrictions & MemberLookupRestrictions.InvocableOnly) != 0) { if (member is MethodSpec) { - // - // Interface members that are hidden by class members are removed from the set. This - // step only has an effect if T is a type parameter and T has both an effective base - // class other than object and a non-empty effective interface set - // - var tps = queried_type as TypeParameterSpec; - if (tps != null && tps.HasTypeConstraint) - members = RemoveHiddenTypeParameterMethods (members); - return new MethodGroupExpr (members, queried_type, loc); } @@ -959,57 +957,6 @@ namespace Mono.CSharp { return null; } - static IList RemoveHiddenTypeParameterMethods (IList members) - { - if (members.Count < 2) - return members; - - // - // If M is a method, then all non-method members declared in an interface declaration - // are removed from the set, and all methods with the same signature as M declared in - // an interface declaration are removed from the set - // - - bool copied = false; - for (int i = 0; i < members.Count; ++i) { - var method = members[i] as MethodSpec; - if (method == null) { - if (!copied) { - copied = true; - members = new List (members); - } - - members.RemoveAt (i--); - continue; - } - - if (!method.DeclaringType.IsInterface) - continue; - - for (int ii = 0; ii < members.Count; ++ii) { - var candidate = members[ii] as MethodSpec; - if (candidate == null || !candidate.DeclaringType.IsClass) - continue; - - if (!TypeSpecComparer.Override.IsEqual (candidate.Parameters, method.Parameters)) - continue; - - if (!AParametersCollection.HasSameParameterDefaults (candidate.Parameters, method.Parameters)) - continue; - - if (!copied) { - copied = true; - members = new List (members); - } - - members.RemoveAt (i--); - break; - } - } - - return members; - } - protected static void Error_NamedArgument (NamedArgument na, Report Report) { Report.Error (1742, na.Location, "An element access expression cannot use named argument"); @@ -2929,15 +2876,6 @@ namespace Mono.CSharp { return me; } - // - // Stage 3: Lookup nested types, namespaces and type parameters in the context - // - if ((restrictions & MemberLookupRestrictions.InvocableOnly) == 0 && !variable_found) { - if (IsPossibleTypeOrNamespace (rc)) { - return ResolveAsTypeOrNamespace (rc, false); - } - } - var expr = NamespaceContainer.LookupStaticUsings (rc, Name, Arity, loc); if (expr != null) { if (Arity > 0) { @@ -2950,6 +2888,15 @@ namespace Mono.CSharp { return expr; } + // + // Stage 3: Lookup nested types, namespaces and type parameters in the context + // + if ((restrictions & MemberLookupRestrictions.InvocableOnly) == 0 && !variable_found) { + if (IsPossibleTypeOrNamespace (rc)) { + return ResolveAsTypeOrNamespace (rc, false); + } + } + if ((restrictions & MemberLookupRestrictions.NameOfExcluded) == 0 && Name == "nameof") return new NameOf (this); @@ -3701,6 +3648,11 @@ namespace Mono.CSharp { return this; } + public virtual void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + + } + protected void EmitInstance (EmitContext ec, bool prepare_for_load) { var inst = new InstanceEmitter (InstanceExpression, TypeSpec.IsValueType (InstanceExpression.Type)); @@ -3776,7 +3728,7 @@ namespace Mono.CSharp { // For extension methodgroup we are not looking for base members but parent // namespace extension methods // - public override IList GetBaseMembers (TypeSpec baseType) + public override IList GetBaseMembers (TypeSpec type) { // TODO: candidates are null only when doing error reporting, that's // incorrect. We have to discover same extension methods in error mode @@ -3805,27 +3757,9 @@ namespace Mono.CSharp { Convert.ImplicitBoxingConversion (null, argType, extensionType) != null; } - public bool ResolveNameOf (ResolveContext rc, MemberAccess ma) + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) { - rc.Report.Error (8093, ma.Location, "An argument to nameof operator cannot be extension method group"); - - // Not included in C#6 - /* - ExtensionExpression = ExtensionExpression.Resolve (rc); - if (ExtensionExpression == null) - return false; - - var argType = ExtensionExpression.Type; - foreach (MethodSpec candidate in Candidates) { - if (ExtensionMethodGroupExpr.IsExtensionTypeCompatible (argType, candidate.Parameters.ExtensionMethodType)) - return true; - } - - // TODO: Scan full hierarchy - - ma.Error_TypeDoesNotContainDefinition (rc, argType, ma.Name); - */ - return false; + rc.Report.Error (8093, expr.Location, "An argument to nameof operator cannot be extension method group"); } public override MethodGroupExpr LookupExtensionMethod (ResolveContext rc) @@ -4226,6 +4160,17 @@ namespace Mono.CSharp { return base.ResolveMemberAccess (ec, left, original); } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + if (!HasAccessibleCandidate (rc)) { + ErrorIsInaccesible (rc, expr.GetSignatureForError (), loc); + } + + if (expr.HasTypeArguments) { + rc.Report.Error (8084, expr.Location, "An argument to nameof operator cannot be method group with type arguments"); + } + } + public override void SetTypeArguments (ResolveContext ec, TypeArguments ta) { type_arguments = ta; @@ -4233,9 +4178,19 @@ namespace Mono.CSharp { #region IBaseMembersProvider Members - public virtual IList GetBaseMembers (TypeSpec baseType) + public virtual IList GetBaseMembers (TypeSpec type) { - return baseType == null ? null : MemberCache.FindMembers (baseType, Methods [0].Name, false); + var baseType = type.BaseType; + + IList members = baseType == null ? null : MemberCache.FindMembers (baseType, Methods [0].Name, false); + + if (members == null && !type.IsInterface) { + var tps = queried_type as TypeParameterSpec; + if (tps != null) + members = MemberCache.FindInterfaceMembers (tps, Methods [0].Name); + } + + return members; } public IParametersMember GetOverrideMemberParameters (MemberSpec member) @@ -4826,12 +4781,18 @@ namespace Mono.CSharp { // // A candidate with no default parameters is still better when there - // is no better expression conversion + // is no better expression conversion and does not have more parameters // if (candidate_pd.Count < best_pd.Count) { - if (!candidate_params && !candidate_pd.FixedParameters [j - j].HasDefaultValue) { + if (candidate_params) + return false; + + if (!candidate_pd.FixedParameters [j - 1].HasDefaultValue) return true; - } + + if (best_pd.FixedParameters [j].HasDefaultValue) + return true; + } else if (candidate_pd.Count == best_pd.Count) { if (candidate_params) return false; @@ -5095,7 +5056,7 @@ namespace Mono.CSharp { // The slot has been taken by positional argument if (temp != null && !(temp is NamedArgument)) - break; + return NamedArgumentsMismatch - i - 1; } if (!arg_moved) { @@ -5267,7 +5228,7 @@ namespace Mono.CSharp { if ((fp.ModFlags & Parameter.Modifier.CallerLineNumber) != 0) { e = new IntLiteral (ec.BuiltinTypes, loc.Row, loc); } else if ((fp.ModFlags & Parameter.Modifier.CallerFilePath) != 0) { - e = new StringLiteral (ec.BuiltinTypes, loc.NameFullPath, loc); + e = new StringLiteral (ec.BuiltinTypes, loc.SourceFile.GetFullPathName (ec.Module.Compiler.Settings.PathMap), loc); } else if (ec.MemberContext.CurrentMemberDefinition != null) { e = new StringLiteral (ec.BuiltinTypes, ec.MemberContext.CurrentMemberDefinition.GetCallerMemberName (), loc); } @@ -5632,7 +5593,7 @@ namespace Mono.CSharp { // Restore expanded arguments candidate_args = args; } - } while (best_candidate_rate != 0 && (type_members = base_provider.GetBaseMembers (type_members[0].DeclaringType.BaseType)) != null); + } while (best_candidate_rate != 0 && (type_members = base_provider.GetBaseMembers (type_members[0].DeclaringType)) != null); // // We've found exact match @@ -6196,6 +6157,11 @@ namespace Mono.CSharp { return constant.GetSignatureForError (); } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + constant.CheckObsoleteness (rc, expr.Location); + } + public override void SetTypeArguments (ResolveContext ec, TypeArguments ta) { Error_TypeArgumentsCannotBeUsed (ec, "constant", GetSignatureForError (), loc); @@ -6425,6 +6391,11 @@ namespace Mono.CSharp { return this; } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + spec.CheckObsoleteness (rc, expr.Location); + } + public void SetFieldAssigned (FlowAnalysisContext fc) { if (!IsInstance) @@ -7195,6 +7166,14 @@ namespace Mono.CSharp { return true; } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + if (!best_candidate.IsAccessible (rc)) + ErrorIsInaccesible (rc, best_candidate.GetSignatureForError (), expr.Location); + + best_candidate.CheckObsoleteness (rc, expr.Location); + } + public void SetBackingFieldAssigned (FlowAnalysisContext fc) { if (backing_field != null) { @@ -7616,6 +7595,11 @@ namespace Mono.CSharp { return TypeManager.CSharpSignature (spec); } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + spec.CheckObsoleteness (rc, expr.Location); + } + public override void SetTypeArguments (ResolveContext ec, TypeArguments ta) { Error_TypeArgumentsCannotBeUsed (ec, "event", GetSignatureForError (), loc);