protected virtual T VisitPyMethodInvokeValue(PyMethodInvokeValue node) { if (ThrowNotImplementedException) { throw new NotImplementedException(string.Format("Method {0} is not supported in class {1}", "VisitPyMethodInvokeValue", this.GetType().FullName)); } return(default(T)); }
protected override IPyValue VisitFunctionArgument(FunctionArgument src) { var expression = TransValue(src.MyValue); var a = expression.GetPyCode(null); var result = new PyMethodInvokeValue(expression); if (!string.IsNullOrEmpty(src.RefOrOutKeyword)) { result.ByRef = true; } return(SimplifyPyExpression(result)); }
public override IPyValue TranslateToPython(IExternalTranslationContext ctx, CsharpMethodCallExpression src) { string GetOperatorName() { if (!src.MethodInfo.IsSpecialName) { return(null); } switch (src.MethodInfo.Name) { case "op_Addition": return("+"); case "op_Subtraction": return("-"); case "op_Multiply": return("*"); case "op_Division": return("/"); case "op_Equality": return("=="); case "op_Inequality ": return("!="); case "op_Implicit": return("i"); } return(null); } var ats = src.MethodInfo.GetCustomAttribute <DirectCallAttribute>(); if (ats == null) { return(null); } var name = ats.Name; var opName = GetOperatorName(); if (string.IsNullOrEmpty(name)) { name = src.MethodInfo.Name; } if (opName != null) { name = opName; } var cSharpParameters = src.MethodInfo.GetParameters(); var agrsIndexByName = Enumerable.Range(0, cSharpParameters.Length) .ToDictionary(a => cSharpParameters[a].Name, a => a); var argsValues = new Argument[cSharpParameters.Length]; var info = MapNamedParameters(src); for (var index = 0; index < src.Arguments.Length; index++) { var i = src.Arguments[index]; var pythonArgName = cSharpParameters[index].Name; if (!string.IsNullOrEmpty(i.ExplicitName)) { pythonArgName = i.ExplicitName; } var b = ctx.TranslateValue(i.MyValue); var pyIndex = agrsIndexByName[pythonArgName]; argsValues[pyIndex] = new Argument { Value = b, Name = cSharpParameters[pyIndex].Name }; } if (opName != null) { if (opName == "i" && argsValues.Length == 1) { return(argsValues[0].Value); } switch (argsValues.Length) { case 2: return(new PyBinaryOperatorExpression(opName, argsValues[0].Value, argsValues[1].Value)); case 1: return(new PyUnaryOperatorExpression(argsValues[0].Value, opName)); } throw new NotSupportedException("Unable to convert operator " + opName + " with " + argsValues.Length + " arguments"); } var result = new PyMethodCallExpression(name); var setName = false; foreach (var i in argsValues) { if (i == null) { setName = true; continue; } var item = new PyMethodInvokeValue(i.Value); if (setName) { item.Name = i.Name; } result.Arguments.Add(item); } result.TrySetTargetObjectFromModule(src.MethodInfo.DeclaringType); return(result); }
public PyMethodInvokeValue TransFunctionArgument(FunctionArgument a) { var r = new PyMethodInvokeValue(TransValue(a.MyValue)); return(r); }