X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fparameter.cs;h=2bd2a498a919444a5862a395038f7d42e5500862;hb=098e88f3a87205d92516a1fe912b6f84164d0a59;hp=f1215173cb255a34c9c645bd0ff5540d53cc9ad9;hpb=2ab02d99c44321dfc73fd10bee7a6fbf7016116b;p=mono.git diff --git a/mcs/mcs/parameter.cs b/mcs/mcs/parameter.cs index f1215173cb2..2bd2a498a91 100644 --- a/mcs/mcs/parameter.cs +++ b/mcs/mcs/parameter.cs @@ -142,6 +142,9 @@ namespace Mono.CSharp { } public class ParamsParameter : Parameter { + + bool ParamsAttributeEmit; + public ParamsParameter (FullNamedExpression type, string name, Attributes attrs, Location loc): base (type, name, Parameter.Modifier.PARAMS, attrs, loc) { @@ -158,13 +161,18 @@ namespace Mono.CSharp { return null; } + var mc = ec as MemberCore; + ParamsAttributeEmit = mc == null || (mc.ModFlags & Modifiers.OVERRIDE) == 0; + return parameter_type; } public override void ApplyAttributes (MethodBuilder mb, ConstructorBuilder cb, int index, PredefinedAttributes pa) { base.ApplyAttributes (mb, cb, index, pa); - pa.ParamArray.EmitAttribute (builder); + + if (ParamsAttributeEmit) + pa.ParamArray.EmitAttribute (builder); } } @@ -222,8 +230,7 @@ namespace Mono.CSharp { CallerMask = CallerMemberName | CallerLineNumber | CallerFilePath } - static readonly string[] attribute_targets = new string[] { "param" }; - static readonly string[] attribute_targets_primary = new string[] { "param", "field" }; + static readonly string[] attribute_targets = new [] { "param" }; FullNamedExpression texpr; Modifier modFlags; @@ -234,7 +241,6 @@ namespace Mono.CSharp { protected int idx; public bool HasAddressTaken; - Constructor primary_constructor; TemporaryVariableReference expr_tree_variable; HoistedParameter hoisted_variant; @@ -309,7 +315,7 @@ namespace Mono.CSharp { public override string[] ValidAttributeTargets { get { - return primary_constructor != null ? attribute_targets_primary : attribute_targets; + return attribute_targets; } } @@ -317,12 +323,6 @@ namespace Mono.CSharp { public override void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, PredefinedAttributes pa) { - if (a.Target == AttributeTargets.Field) { - var field = MemberCache.FindMember (primary_constructor.Spec.DeclaringType, MemberFilter.Field (name, parameter_type), BindingRestriction.DeclaredOnly); - ((Field)field.MemberDefinition).ApplyAttributeBuilder (a, ctor, cdata, pa); - return; - } - if (a.Type == pa.In && ModFlags == Modifier.OUT) { a.Report.Error (36, a.Location, "An out parameter cannot have the `In' attribute"); return; @@ -399,10 +399,6 @@ namespace Mono.CSharp { if (attributes != null) attributes.AttachTo (this, rc); - var ctor = rc.CurrentMemberDefinition as Constructor; - if (ctor != null && ctor.IsPrimaryConstructor) - primary_constructor = ctor; - parameter_type = texpr.ResolveAsType (rc); if (parameter_type == null) return null; @@ -465,7 +461,7 @@ namespace Mono.CSharp { if (atype == pa.CallerLineNumberAttribute) { caller_type = rc.BuiltinTypes.Int; - if (caller_type != parameter_type && !Convert.ImplicitNumericConversionExists (caller_type, parameter_type)) { + if (caller_type != parameter_type && !Convert.ImplicitStandardConversionExists (new IntConstant (caller_type, int.MaxValue, Location.Null), parameter_type)) { rc.Report.Error (4017, attr.Location, "The CallerLineNumberAttribute attribute cannot be applied because there is no standard conversion from `{0}' to `{1}'", caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ()); @@ -575,7 +571,8 @@ namespace Mono.CSharp { if (TypeSpecComparer.IsEqual (default_expr.Type, parameter_type) || (default_expr is NullConstant && TypeSpec.IsReferenceType (parameter_type) && !parameter_type.IsGenericParameter) || - parameter_type.BuiltinType == BuiltinTypeSpec.Type.Object) { + parameter_type.BuiltinType == BuiltinTypeSpec.Type.Object || + parameter_type.BuiltinType == BuiltinTypeSpec.Type.Dynamic) { return; } @@ -729,6 +726,10 @@ namespace Mono.CSharp { } else if (parameter_type.HasDynamicElement) { pa.Dynamic.EmitAttribute (builder, parameter_type, Location); } + + if (parameter_type.HasNamedTupleElement) { + pa.TupleElementNames.EmitAttribute (builder, parameter_type, Location); + } } } @@ -789,6 +790,11 @@ namespace Mono.CSharp { return new TypeExpression (p_type, location); } + public void SetIndex (int index) + { + idx = index; + } + public void Warning_UselessOptionalParameter (Report Report) { Report.Warning (1066, 1, Location, @@ -965,6 +971,19 @@ namespace Mono.CSharp { return sb.ToString (); } + public static bool HasSameParameterDefaults (AParametersCollection a, AParametersCollection b) + { + if (a == null) + return b == null; + + for (int i = 0; i < a.Count; ++i) { + if (a.FixedParameters [i].HasDefaultValue != b.FixedParameters [i].HasDefaultValue) + return false; + } + + return true; + } + public bool HasArglist { get { return has_arglist; } } @@ -1151,6 +1170,23 @@ namespace Mono.CSharp { return new ParametersCompiled (parameters, types); } + public static ParametersCompiled Prefix (ParametersCompiled parameters, Parameter p, TypeSpec type) + { + var ptypes = new TypeSpec [parameters.Count + 1]; + ptypes [0] = type; + Array.Copy (parameters.Types, 0, ptypes, 1, parameters.Count); + + var param = new Parameter [ptypes.Length]; + param [0] = p; + for (int i = 0; i < parameters.Count; ++i) { + var pi = parameters [i]; + param [i + 1] = pi; + pi.SetIndex (i + 1); + } + + return ParametersCompiled.CreateFullyResolved (param, ptypes); + } + // // TODO: This does not fit here, it should go to different version of AParametersCollection // as the underlying type is not Parameter and some methods will fail to cast @@ -1312,6 +1348,9 @@ namespace Mono.CSharp { for (int i = 0; i < parameters.Length; ++i) { Parameter p = (Parameter) parameters [i]; + if (p.Type != null) + p.Type.CheckObsoleteness (m, p.Location); + // // Try not to enter default values resolution if there are is not any default value possible // @@ -1408,10 +1447,12 @@ namespace Mono.CSharp { expr = Child; - if (!(expr is Constant || expr is DefaultValueExpression || (expr is New && ((New) expr).IsDefaultStruct))) { - rc.Report.Error (1736, Location, - "The expression being assigned to optional parameter `{0}' must be a constant or default value", - p.Name); + if (!(expr is Constant || expr is DefaultValueExpression || (expr is New && ((New) expr).IsGeneratedStructConstructor))) { + if (!(expr is ErrorExpression)) { + rc.Report.Error (1736, Location, + "The expression being assigned to optional parameter `{0}' must be a constant or default value", + p.Name); + } return; }