Ejemplo n.º 1
0
 private JNode VisitConversion(ResolveResult input, Conversion conversion, IType conversionType)
 {
     ////TODO: HACK: https://github.com/icsharpcode/NRefactory/issues/183
     //var isImplicit = res.Conversion.IsImplicit;
     //if (!isImplicit && res.Conversion.IsExplicit && res.Conversion.Method != null && res.Conversion.Method.Name != null && res.Conversion.Method.Name.Contains("Implicit"))
     //    isImplicit = true;
     if (conversion.IsMethodGroupConversion)
     {
         var me      = conversion.Method;
         var delType = conversionType;
         var exp     = me.JAccess().Invoke(me.Parameters.Select(t => J.Member(t.Name)).ToArray());
         var st      = J.Return(exp);
         var block   = J.Block().Add(st);
         var del2    = CreateDelegate(delType, me.Parameters, me.ReturnType, block);
         return(del2);
         //J.CreateDelegate(conversionType.JAccess(), me.Parameters.Select(t=>t.Acc
         //TODO:  J.CreateDelegate(conversionType.JAccess(),
     }
     else if (conversion.IsUserDefined)
     {
         ITypeDefinition typeDef;
         if (conversion.Method != null && conversion.Method.DeclaringType != null)
         {
             typeDef = conversion.Method.DeclaringType.GetDefinitionOrArrayType(Compiler);
         }
         else
         {
             typeDef = conversionType.GetDefinitionOrArrayType(Compiler);
         }
         var nativeOverloads = JMeta.UseNativeOperatorOverloads(typeDef);
         if (nativeOverloads)
         {
             return(Visit(input));
         }
         var fake  = conversion.Method.InvokeMethod(null, input);
         var node2 = Visit(fake);
         return(node2);
     }
     else if (conversion.IsTryCast || conversion.IsExplicit)
     {
         var typeDef   = conversionType.GetDefinitionOrArrayType(Compiler);
         var omitCasts = JMeta.OmitCasts(typeDef, Project);
         if (omitCasts)
         {
             return(Visit(input));
         }
         if (true)//Sk.NativeCasts(typeDef))
         {
             var exp2  = VisitExpression(input);
             var type2 = JNaming.JAccess(conversionType);
             if (conversion.IsTryCast)
             {
                 var node2 = exp2.InstanceOf(type2).Conditional(exp2, J.Null());
                 return(node2);
             }
             else
             {
                 return(J.Cast(exp2, type2));
             }
         }
         //else
         //{
         //    var cast = conversion.IsTryCast ? "As" : "Cast";
         //    var node2 = J.Member(cast).Invoke(VisitExpression(input), JNaming.JAccess(conversionType));
         //    return node2;
         //}
     }
     return(Visit(input));
 }