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)); }