public static string GetParameterTypeName(Parameter parameter, MemberNameOptions givenOptions, Scope scope) { if (parameter == null) return ""; Reference r = parameter.Type as Reference; TypeNode typeNode = null; StringBuilder sb = new StringBuilder(); string backUpName = null; if (r != null) { if ((parameter.Flags & ParameterFlags.Out) != 0) { if ( IsOptionActive(givenOptions, MemberNameOptions.PutParameterModifiers) ) sb.Append("out "); typeNode = r.ElementType; } else { if (IsOptionActive(givenOptions, MemberNameOptions.PutParameterModifiers)) sb.Append("ref "); typeNode = r.ElementType; } } else if (parameter.GetParamArrayElementType() != null) { if (IsOptionActive(givenOptions, MemberNameOptions.PutParameterModifiers)) sb.Append("params "); typeNode = parameter.Type; } else { typeNode = parameter.Type; if (typeNode == null && parameter.TypeExpression != null) backUpName = parameter.TypeExpression.SourceContext.SourceText; } sb.Append(backUpName != null ? MemberNameBuilder.GetAtPrefixedIfRequired(backUpName, givenOptions) : GetMemberNameRaw(typeNode, givenOptions, scope)); if (IsOptionActive(givenOptions, MemberNameOptions.PutParameterName) && parameter.Name!= null) { sb.Append(' '); sb.Append(MemberNameBuilder.GetAtPrefixedIfRequired(parameter.Name.ToString(), givenOptions)); } return sb.ToString(); }
public override Expression CoerceArgument(Expression argument, Parameter parameter) { Expression result = base.CoerceArgument(argument, parameter); if (result != null) { Reference r = parameter.Type as Reference; if (r != null) { UnaryExpression unexp = argument as UnaryExpression; if (parameter.IsOut) { if (unexp == null) { if (argument.SourceContext.Document != null) this.HandleError(argument, Error.NoImplicitConversion, this.typeSystem.GetTypeName(r.ElementType), this.typeSystem.GetTypeName(r)); } else { if (unexp.NodeType == NodeType.RefAddress) this.HandleError(argument, Error.NoImplicitConversion, "ref " + this.typeSystem.GetTypeName(r.ElementType), this.typeSystem.GetTypeName(r)); else if (unexp.NodeType != NodeType.OutAddress) this.HandleError(argument, Error.NoImplicitConversion, this.typeSystem.GetTypeName(r.ElementType), this.typeSystem.GetTypeName(r)); } } else { if (unexp == null) { if (argument.SourceContext.Document != null) this.HandleError(argument, Error.NoImplicitConversion, this.typeSystem.GetTypeName(r.ElementType), this.typeSystem.GetTypeName(r)); } else { if (unexp.NodeType == NodeType.OutAddress) this.HandleError(argument, Error.NoImplicitConversion, "out " + this.typeSystem.GetTypeName(r.ElementType), this.typeSystem.GetTypeName(r)); else if (unexp.NodeType != NodeType.RefAddress) this.HandleError(argument, Error.NoImplicitConversion, this.typeSystem.GetTypeName(r.ElementType), this.typeSystem.GetTypeName(r)); } } } else if (!(parameter.Type is Reference)) { if (argument.NodeType == NodeType.OutAddress) this.HandleError(((UnaryExpression)argument).Operand, Error.BadArgExtraRef, (parameter.ParameterListIndex + 1).ToString(), "out"); else if (argument.NodeType == NodeType.RefAddress) this.HandleError(((UnaryExpression)argument).Operand, Error.BadArgExtraRef, (parameter.ParameterListIndex + 1).ToString(), "ref"); } } // Special case to handle arglist when the parameter is a params object[] // and the argument constains __arglist(). We will flatten that __arglist. // This is an effort to simulate CSC. // Note, if passing an __arglist and an object for params object[], CSC generates // invalid code while we are ok. See SingSharpConformance.Suite. TypeNode maybeObjectType = parameter.GetParamArrayElementType(); if (maybeObjectType == SystemTypes.Object) { result = FlattenArglist(result); } return result; }