コード例 #1
0
ファイル: Error.cs プロジェクト: hesam/SketchSharp
 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();
 }
コード例 #2
0
ファイル: Checker.cs プロジェクト: hesam/SketchSharp
 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;
 }