Browse Source

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
shortcuts
Matt Ward 16 years ago
parent
commit
530141994b
  1. 69
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs
  2. 92
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeMethodParametersTestFixture.cs
  3. 1
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj

69
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs

@ -10,6 +10,7 @@ using System.Collections.Generic; @@ -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 @@ -33,19 +34,7 @@ namespace ICSharpCode.PythonBinding
{
List<object> args = new List<object>();
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 @@ -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 @@ -137,10 +129,16 @@ namespace ICSharpCode.PythonBinding
/// </summary>
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 @@ -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;
}
}
}

92
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeMethodParametersTestFixture.cs

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
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<object> expectedArgs = new List<object>();
expectedArgs.Add(-1);
string code = "TestClass(-1)";
CallExpression callExpression = PythonParserHelper.GetCallExpression(code);
List<object> args = deserializer.GetArguments(callExpression);
Assert.AreEqual(expectedArgs, args);
}
[Test]
public void EnumParameter()
{
List<object> expectedArgs = new List<object>();
expectedArgs.Add(AnchorStyles.Top);
string code = "TestClass(System.Windows.Forms.AnchorStyles.Top)";
CallExpression callExpression = PythonParserHelper.GetCallExpression(code);
List<object> args = deserializer.GetArguments(callExpression);
Assert.AreEqual(expectedArgs, args);
}
[Test]
public void BooleanParameter()
{
List<object> expectedArgs = new List<object>();
expectedArgs.Add(true);
string code = "TestClass(True)";
CallExpression callExpression = PythonParserHelper.GetCallExpression(code);
List<object> 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<object> expectedArgs = new List<object>();
expectedArgs.Add(s);
string code = "TestClass(localVariable)";
CallExpression callExpression = PythonParserHelper.GetCallExpression(code);
List<object> args = deserializer.GetArguments(callExpression);
Assert.AreEqual(expectedArgs, args);
}
}
}

1
src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj

@ -169,6 +169,7 @@ @@ -169,6 +169,7 @@
<Compile Include="Designer\DeserializeComponentAssignmentTestFixture.cs" />
<Compile Include="Designer\DeserializeDateTimeArrayTestFixture.cs" />
<Compile Include="Designer\DeserializeLocalVariableTestFixture.cs" />
<Compile Include="Designer\DeserializeMethodParametersTestFixture.cs" />
<Compile Include="Designer\DeserializerConstructorStringArrayTestFixture.cs" />
<Compile Include="Designer\DeserializeStringArrayTestFixture.cs" />
<Compile Include="Designer\DeserializeToolStripItemArrayTestFixture.cs" />

Loading…
Cancel
Save