/// <summary> /// Creates a PythonControlField from a call expression: /// /// self._menuItem1.Items.AddRange(...) /// </summary> public static PythonControlFieldExpression Create(CallExpression expression) { string[] allNames = GetMemberNames(expression.Target as MemberExpression); // Remove last member since it is the method name. int lastItemIndex = allNames.Length - 1; string[] memberNames = new string[lastItemIndex]; Array.Copy(allNames, memberNames, lastItemIndex); PythonControlFieldExpression field = Create(memberNames); field.methodName = allNames[lastItemIndex]; return(field); }
/// <summary> /// Gets the fully qualified name of the base class. /// </summary> public static string GetBaseClassName(ClassDefinition classDefinition) { if (classDefinition.Bases.Count > 0) { Expression baseClassExpression = classDefinition.Bases[0]; NameExpression nameExpression = baseClassExpression as NameExpression; MemberExpression memberExpression = baseClassExpression as MemberExpression; if (nameExpression != null) { return(nameExpression.Name); } return(PythonControlFieldExpression.GetMemberName(memberExpression)); } return(String.Empty); }
/// <summary> /// Looks for any base types for the class defined in the /// list of expressions and adds them to the class. /// </summary> void AddBaseTypes(IClass c, IList <Expression> baseTypes) { foreach (Expression expression in baseTypes) { NameExpression nameExpression = expression as NameExpression; MemberExpression memberExpression = expression as MemberExpression; if (nameExpression != null) { AddBaseType(c, nameExpression.Name); } else if (memberExpression != null) { AddBaseType(c, PythonControlFieldExpression.GetMemberName(memberExpression)); } } }
/// <summary> /// Walks a method call. Typical method calls are: /// /// self._menuItem1.Items.AddRange(...) /// /// This method will execute the method call. /// </summary> void WalkMethodCall(CallExpression node) { // Try to get the object being called. Try the form first then // look for other controls. object member = PythonControlFieldExpression.GetMember(component, node); PythonControlFieldExpression field = PythonControlFieldExpression.Create(node); if (member == null) { member = field.GetMember(componentCreator); } // Execute the method on the object. if (member != null) { object[] args = deserializer.GetArguments(node).ToArray(); InvokeMethod(member, field.MethodName, args); } }
/// <summary> /// Creates a new instance with the specified name. /// </summary> object CreateInstance(string name, CallExpression node) { MemberExpression memberExpression = node.Target as MemberExpression; if (memberExpression != null) { string typeName = PythonControlFieldExpression.GetMemberName(memberExpression); Type type = componentCreator.GetType(typeName); if (type != null) { if (type.IsAssignableFrom(typeof(ComponentResourceManager))) { return(componentCreator.CreateInstance(type, new object[0], name, false)); } List <object> args = deserializer.GetArguments(node); return(componentCreator.CreateInstance(type, args, name, false)); } } return(null); }
/// <summary> /// Walks a statement of the form: /// /// self.a += self.b /// </summary> public override bool Walk(AugmentedAssignStatement node) { if (!FoundInitializeComponentMethod) { return(false); } MemberExpression eventExpression = node.Left as MemberExpression; string eventName = eventExpression.Name.ToString(); PythonControlFieldExpression field = PythonControlFieldExpression.Create(eventExpression); MemberExpression eventHandlerExpression = node.Right as MemberExpression; string eventHandlerName = eventHandlerExpression.Name.ToString(); IComponent currentComponent = fieldExpression.GetObject(componentCreator) as IComponent; EventDescriptor eventDescriptor = TypeDescriptor.GetEvents(currentComponent).Find(eventName, false); PropertyDescriptor propertyDescriptor = componentCreator.GetEventProperty(eventDescriptor); propertyDescriptor.SetValue(currentComponent, eventHandlerName); return(false); }
/// <summary> /// Deserializes expressions of the form: /// /// 1) System.Windows.Forms.Cursors.AppStarting /// </summary> object Deserialize(MemberExpression memberExpression) { PythonControlFieldExpression field = PythonControlFieldExpression.Create(memberExpression); Type type = GetType(field); if (type != null) { if (type.IsEnum) { return(Enum.Parse(type, field.MemberName)); } else { BindingFlags propertyBindingFlags = BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static | BindingFlags.Instance; PropertyInfo propertyInfo = type.GetProperty(field.MemberName, propertyBindingFlags); if (propertyInfo != null) { return(propertyInfo.GetValue(type, null)); } } } return(componentCreator.GetInstance(PythonControlFieldExpression.GetVariableName(field.MemberName))); }
string GetFieldName(AssignmentStatement node) { string[] memberNames = PythonControlFieldExpression.GetMemberNames(node.Left[0] as MemberExpression); return(GetFieldName(memberNames)); }
public override bool Walk(AssignmentStatement node) { if (!FoundInitializeComponentMethod) { return false; } if (node.Left.Count > 0) { MemberExpression lhsMemberExpression = node.Left[0] as MemberExpression; NameExpression lhsNameExpression = node.Left[0] as NameExpression; if (lhsMemberExpression != null) { fieldExpression = PythonControlFieldExpression.Create(lhsMemberExpression); WalkMemberExpressionAssignmentRhs(node.Right); } else if (lhsNameExpression != null) { CallExpression callExpression = node.Right as CallExpression; if (callExpression != null) { object instance = CreateInstance(lhsNameExpression.Name.ToString(), callExpression); if (instance == null) { ThrowCouldNotFindTypeException(callExpression.Target as MemberExpression); } } } } return false; }
/// <summary> /// Walks a statement of the form: /// /// self.a += self.b /// </summary> public override bool Walk(AugmentedAssignStatement node) { if (!FoundInitializeComponentMethod) { return false; } MemberExpression eventExpression = node.Left as MemberExpression; string eventName = eventExpression.Name.ToString(); fieldExpression = PythonControlFieldExpression.Create(eventExpression); MemberExpression eventHandlerExpression = node.Right as MemberExpression; string eventHandlerName = eventHandlerExpression.Name.ToString(); IComponent currentComponent = fieldExpression.GetObject(componentCreator) as IComponent; EventDescriptor eventDescriptor = TypeDescriptor.GetEvents(currentComponent).Find(eventName, false); PropertyDescriptor propertyDescriptor = componentCreator.GetEventProperty(eventDescriptor); propertyDescriptor.SetValue(currentComponent, eventHandlerName); return false; }
void AddBaseType(MemberExpression memberExpression) { string name = PythonControlFieldExpression.GetMemberName(memberExpression); AddBaseType(name); }
public void LocalVariable() { AssignmentStatement statement = PythonParserHelper.GetAssignmentStatement("listViewItem1.TooltipText = \"abc\""); PythonControlFieldExpression field = PythonControlFieldExpression.Create(statement.Left[0] as MemberExpression); PythonControlFieldExpression expectedField = new PythonControlFieldExpression("TooltipText", "listViewItem1", String.Empty, "listViewItem1.TooltipText"); Assert.AreEqual(expectedField, field); }
Type GetType(MemberExpression memberExpression) { string typeName = PythonControlFieldExpression.GetMemberName(memberExpression); return(componentCreator.GetType(typeName)); }
Type GetType(PythonControlFieldExpression field) { string typeName = PythonControlFieldExpression.GetPrefix(field.FullMemberName); return(componentCreator.GetType(typeName)); }
void AssertAreEqual(PythonControlFieldExpression field, string variableName, string memberName, string methodName, string fullMemberName) { string expected = "Variable: " + variableName + " Member: " + memberName + " Method: " + methodName + " FullMemberName: " + fullMemberName; string actual = "Variable: " + field.VariableName + " Member: " + field.MemberName + " Method: " + field.MethodName + " FullMemberName: " + field.FullMemberName; Assert.AreEqual(expected, actual, actual); }
void ThrowCouldNotFindTypeException(MemberExpression memberExpression) { string typeName = PythonControlFieldExpression.GetMemberName(memberExpression); throw new PythonComponentWalkerException(String.Format(StringParser.Parse("${res:ICSharpCode.PythonBinding.UnknownTypeName}"), typeName)); }
/// <summary> /// Returns true if the expression is of the form: /// /// resources.GetObject(...) or /// resources.GetString(...) /// </summary> bool IsResource(MemberExpression memberExpression) { string fullName = PythonControlFieldExpression.GetMemberName(memberExpression); return(fullName.StartsWith("resources.", StringComparison.InvariantCultureIgnoreCase)); }
Type GetType(PythonControlFieldExpression field) { string typeName = PythonControlFieldExpression.GetPrefix(field.FullMemberName); return componentCreator.GetType(typeName); }