From 530141994b3ceae60d62c9eff9e33c13143e5e69 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 16 Aug 2009 18:57:10 +0000 Subject: [PATCH] Python forms designer now converts constructor parameters to the correct objects when loading a form. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4700 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/PythonCodeDeserializer.cs | 69 +++++++++----- .../DeserializeMethodParametersTestFixture.cs | 92 +++++++++++++++++++ .../Test/PythonBinding.Tests.csproj | 1 + 3 files changed, 138 insertions(+), 24 deletions(-) create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeMethodParametersTestFixture.cs diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs index 8231e3986d..2533c6d621 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.ComponentModel.Design; using System.Drawing; using System.Reflection; +using IronPython.Compiler; using IronPython.Compiler.Ast; namespace ICSharpCode.PythonBinding @@ -33,19 +34,7 @@ namespace ICSharpCode.PythonBinding { List args = new List(); foreach (Arg a in expression.Args) { - ConstantExpression constantExpression = a.Expression as ConstantExpression; - MemberExpression memberExpression = a.Expression as MemberExpression; - CallExpression callExpression = a.Expression as CallExpression; - NameExpression nameExpression = a.Expression as NameExpression; - if (constantExpression != null) { - args.Add(constantExpression.Value); - } else if (memberExpression != null) { - args.Add(Deserialize(memberExpression)); - } else if (callExpression != null) { - args.Add(Deserialize(callExpression)); - } else if (nameExpression != null) { - args.Add(Deserialize(nameExpression)); - } + args.Add(Deserialize(a.Expression)); } return args; } @@ -62,15 +51,18 @@ namespace ICSharpCode.PythonBinding throw new ArgumentNullException("node"); } - MemberExpression memberExpression = node as MemberExpression; - CallExpression callExpression = node as CallExpression; - BinaryExpression binaryExpression = node as BinaryExpression; - if (callExpression != null) { - return Deserialize(callExpression); - } else if (binaryExpression != null) { - return Deserialize(binaryExpression); - } else if (memberExpression != null) { - return Deserialize(memberExpression); + if (node is CallExpression) { + return Deserialize((CallExpression)node); + } else if (node is BinaryExpression) { + return Deserialize((BinaryExpression)node); + } else if (node is MemberExpression) { + return Deserialize((MemberExpression)node); + } else if (node is UnaryExpression) { + return Deserialize((UnaryExpression)node); + } else if (node is ConstantExpression) { + return Deserialize((ConstantExpression)node); + } else if (node is NameExpression) { + return Deserialize((NameExpression)node); } return null; } @@ -137,10 +129,16 @@ namespace ICSharpCode.PythonBinding /// object Deserialize(NameExpression nameExpression) { - if ("self" == nameExpression.Name.ToString().ToLowerInvariant()) { + string name = nameExpression.Name.ToString(); + if ("self" == name.ToLowerInvariant()) { return componentCreator.RootComponent; + } else { + bool result; + if (Boolean.TryParse(name, out result)) { + return result; + } } - return null; + return componentCreator.GetInstance(name); } Type GetType(PythonControlFieldExpression field) @@ -207,5 +205,28 @@ namespace ICSharpCode.PythonBinding } return null; } + + object Deserialize(UnaryExpression expression) + { + object rhs = Deserialize(expression.Expression); + switch (expression.Op) { + case PythonOperator.Negate: + return Negate(rhs); + } + return rhs; + } + + object Negate(object value) + { + if (value is int) { + return -1 * (int)value; + } + return value; + } + + object Deserialize(ConstantExpression expression) + { + return expression.Value; + } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeMethodParametersTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeMethodParametersTestFixture.cs new file mode 100644 index 0000000000..05ca945641 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeMethodParametersTestFixture.cs @@ -0,0 +1,92 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Windows.Forms; +using ICSharpCode.PythonBinding; +using IronPython.Compiler.Ast; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + [TestFixture] + public class DeserializeCallParametersTestFixture + { + PythonCodeDeserializer deserializer; + MockComponentCreator componentCreator; + + [SetUp] + public void Init() + { + componentCreator = new MockComponentCreator(); + MockDesignerLoaderHost mockDesignerLoaderHost = new MockDesignerLoaderHost(); + deserializer = new PythonCodeDeserializer(componentCreator); + } + + [Test] + public void NegativeIntegerParameter() + { + List expectedArgs = new List(); + expectedArgs.Add(-1); + + string code = "TestClass(-1)"; + CallExpression callExpression = PythonParserHelper.GetCallExpression(code); + List args = deserializer.GetArguments(callExpression); + + Assert.AreEqual(expectedArgs, args); + } + + [Test] + public void EnumParameter() + { + List expectedArgs = new List(); + expectedArgs.Add(AnchorStyles.Top); + + string code = "TestClass(System.Windows.Forms.AnchorStyles.Top)"; + CallExpression callExpression = PythonParserHelper.GetCallExpression(code); + List args = deserializer.GetArguments(callExpression); + + Assert.AreEqual(expectedArgs, args); + } + + [Test] + public void BooleanParameter() + { + List expectedArgs = new List(); + expectedArgs.Add(true); + + string code = "TestClass(True)"; + CallExpression callExpression = PythonParserHelper.GetCallExpression(code); + List args = deserializer.GetArguments(callExpression); + + Assert.AreEqual(expectedArgs, args); + } + + [Test] + public void LocalVariableInstance() + { + string s = "abc"; + CreatedInstance instance = new CreatedInstance(typeof(string), new object[0], "localVariable", false); + instance.Object = s; + componentCreator.CreatedInstances.Add(instance); + List expectedArgs = new List(); + expectedArgs.Add(s); + + string code = "TestClass(localVariable)"; + CallExpression callExpression = PythonParserHelper.GetCallExpression(code); + List args = deserializer.GetArguments(callExpression); + + Assert.AreEqual(expectedArgs, args); + } + + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj index 8412ca8dd9..6f1ece3ef0 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj @@ -169,6 +169,7 @@ +