/// <summary> /// Walks a method call. Typical method calls are: /// /// @menuItem1.Items.AddRange(...) /// /// This method will execute the method call. /// </summary> void WalkMethodCall(MethodCall node) { // Try to get the object being called. Try the form first then // look for other controls. object member = RubyControlFieldExpression.GetMember(component, node); RubyControlFieldExpression field = RubyControlFieldExpression.Create(node); if (member == null) { member = field.GetMember(componentCreator); } // Execute the method on the object. if (member != null) { if (node.Arguments == null) { RegisterEventHandler(node, member); } else { object[] args = deserializer.GetArguments(node).ToArray(); InvokeMethod(member, field.MethodName, args); } } }
object CreateInstance(string name, MethodCall methodCall) { RubyControlFieldExpression field = RubyControlFieldExpression.Create(methodCall); Type type = GetType(field); if (type != null) { if (type.IsEnum) { return(Enum.Parse(type, methodCall.MethodName)); } BindingFlags propertyBindingFlags = BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static | BindingFlags.Instance; PropertyInfo propertyInfo = type.GetProperty(methodCall.MethodName, propertyBindingFlags); if (propertyInfo != null) { return(propertyInfo.GetValue(type, null)); } if (type.IsAssignableFrom(typeof(ComponentResourceManager))) { return(componentCreator.CreateInstance(type, new object[0], name, false)); } if (methodCall.Arguments != null) { return(CreateInstance(type, name, methodCall)); } } else { return(componentCreator.GetInstance(field.MethodName)); } return(null); }
void WalkSimpleAssignment(SimpleAssignmentExpression node) { AttributeAccess attributeAccess = node.Left as AttributeAccess; InstanceVariable instance = node.Left as InstanceVariable; LocalVariable localVariable = node.Left as LocalVariable; if (attributeAccess != null) { RubyControlFieldExpression field = RubyControlFieldExpression.Create(attributeAccess); object propertyValue = deserializer.Deserialize(node.Right); if (propertyValue != null) { field.SetPropertyValue(componentCreator, propertyValue); } else if (IsResource(node.Right)) { field.SetPropertyValue(componentCreator, GetResource(node.Right as MethodCall)); } else { ThrowCouldNotFindTypeException(node.Right); } } else if (instance != null) { string instanceName = RubyControlFieldExpression.GetVariableName(instance.Name); object propertyValue = deserializer.Deserialize(instanceName, node.Right); AddComponent(instanceName, propertyValue); } else if (localVariable != null) { object propertyValue = deserializer.Deserialize(localVariable.Name, node.Right); if (propertyValue == null) { ThrowCouldNotFindTypeException(node.Right); } } }