/// <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);
 }
Esempio n. 3
0
 /// <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)));
        }
Esempio n. 8
0
 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;
		}		
Esempio n. 11
0
        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);
		}