示例#1
0
        /// <summary>
        /// 分析绑定member
        /// </summary>
        /// <param name="invocation"></param>
        /// <param name="components"></param>
        protected virtual void AnalysisBindingMembers(InvocationExpression invocation, List <ComponentItem> components)
        {
            var component = components.Find(x => invocation.Arguments.Count > 1 && invocation.Arguments.First().ToString().Contains(string.Format("m_{0}.", x.name)));

            if (component != null)
            {
                var source     = invocation.Arguments.ToArray()[1].ToString().Replace("\"", "");
                var info       = component.viewItems.Find(x => x.bindingSource == source);
                var isMethod   = false;
                var targetName = AnalysisTargetFromLamdaArgument(invocation.Arguments.First().ToString(), out isMethod);
                UnityEngine.Debug.Log(targetName);

                if (targetName == null)
                {
                    UnityEngine.Debug.Assert(!string.IsNullOrEmpty(targetName), "annalysis err:" + invocation.Arguments.First().ToString());
                    return;
                }
                var type = GetTypeClamp(component.componentType, targetName);
                if (info == null)
                {
                    info = new BindingShow();
                    info.bindingSource = source;
                    info.bindingTarget = targetName;
                    info.isMethod      = isMethod;
                    component.viewItems.Add(info);
                }
                info.bindingTargetType.Update(type);
            }
        }
        /// <summary>
        /// 分析代码中的绑定信息
        /// </summary>
        /// <param name="invocation"></param>
        /// <param name="components"></param>
        private static void AnalysisBindingMembers(string invocation, ComponentItem[] components)
        {
            var  arguments = invocation.Replace(" ", "").Split(',');
            bool isMethod;
            var  lamdaArgs = AnalysisTargetFromLamdaArgument(arguments[0], out isMethod);

            for (int i = 0; i < components.Length; i++)
            {
                var component  = components[i];
                var sourceName = arguments[1].Replace(keyword_address, "");
                var targetName = lamdaArgs[2];
                if (component.name == lamdaArgs[1])
                {
                    BindingShow info = component.viewItems.Find(x => x.bindingTarget == targetName);
                    if (info == null)
                    {
                        info = new BindingShow();
                        component.viewItems.Add(info);
                    }
                    info.bindingSource = sourceName;
                    info.bindingTarget = targetName;
                    info.isMethod      = isMethod;
                    var type = GenCodeUtil.GetTypeClamp(component.componentType, targetName);
                    info.bindingTargetType.Update(type);
                }
            }
        }
        /// <summary>
        /// 远端member关联
        /// </summary>
        protected virtual void BindingMemberInvocations(string name, BindingShow bindingInfo)
        {
            var invocations = PropBindingsNode.Body.Descendants.OfType <InvocationExpression>();
            var arg0_name   = "m_" + name + "." + bindingInfo.bindingTarget;
            var arg0        = arg0_name;

            UnityEngine.Debug.Log(bindingInfo.bindingTargetType.type);
            UnityEngine.Debug.Log(bindingInfo.isMethod);

            if (!bindingInfo.isMethod)
            {
                arg0 = string.Format("x=>{0}=x", arg0_name);
            }

            //UnityEngine.Debug.Log(bindingInfo.bindingTarget);
            //UnityEngine.Debug.Log(bindingInfo.bindingTargetType.type);

            var arg1       = string.Format("\"{0}\"", bindingInfo.bindingSource);
            var invocation = invocations.Where(
                x => x.Target.ToString().Contains("Binder") &&
                x.Arguments.Count > 0 &&
                x.Arguments.First().ToString().Replace(" ", "") == arg0 &&
                x.Arguments.ToArray()[1].ToString() == arg1).FirstOrDefault();

            if (invocation == null)
            {
                string methodName = "";
                UnityEngine.Debug.Assert(bindingInfo.bindingTargetType.type != null, name + ":" + bindingInfo.bindingSource + " type Null!");
                if (!bindingInfo.bindingTargetType.type.IsGenericType)
                {
                    var typeName = bindingInfo.bindingTargetType.typeName;
                    methodName = string.Format("RegistMember<{0}>", typeName);
                }
                else
                {
                    var type      = bindingInfo.bindingTargetType.type;
                    var baseName  = type.Name.Remove(type.Name.IndexOf("`"));
                    var arguments = type.GetGenericArguments();
                    baseName  += "<";
                    baseName  += string.Join(",", Array.ConvertAll <Type, string>(arguments, x => x.FullName));
                    baseName  += ">";
                    methodName = string.Format("RegistMember<{0}>", baseName);
                }

                if (!string.IsNullOrEmpty(methodName))
                {
                    invocation        = new InvocationExpression();
                    invocation.Target = new MemberReferenceExpression(new IdentifierExpression("Binder"), methodName, new AstType[0]);
                    invocation.Arguments.Add(new IdentifierExpression(arg0));
                    invocation.Arguments.Add(new PrimitiveExpression(bindingInfo.bindingSource));
                    PropBindingsNode.Body.Add(invocation);
                }
            }
        }
示例#4
0
        /// <summary>
        /// 分析绑定member
        /// </summary>
        /// <param name="invocation"></param>
        /// <param name="components"></param>
        protected virtual void AnalysisBindingMembers(InvocationExpression invocation, List <ComponentItem> components)
        {
            var component = components.Find(x => invocation.Arguments.Count > 1 && invocation.Arguments.First().ToString().Contains("m_" + x.name));

            if (component != null)
            {
                var source = invocation.Arguments.ToArray()[1].ToString().Replace("\"", "");
                var info   = component.viewItems.Find(x => x.bindingSource == source);
                if (info == null)
                {
                    info = new BindingShow();
                    info.bindingSource = source;
                    var arg0       = invocation.Arguments.First().ToString().Replace("\"", "");
                    var targetName = arg0.Substring(arg0.IndexOf(".") + 1);
                    var type       = GetTypeClamp(component.componentType, targetName);
                    info.bindingTarget = targetName;
                    info.bindingTargetType.Update(type);
                    component.viewItems.Add(info);
                }
            }
        }
示例#5
0
 private void AnalysisBindingMembers(string componentName, string targetName, string sourceName, bool isMethod, ComponentItem[] components)
 {
     for (int i = 0; i < components.Length; i++)
     {
         var component = components[i];
         if (component.name == componentName)
         {
             BindingShow info = component.viewItems.Find(x => x.bindingTarget == targetName);
             if (info == null)
             {
                 info = new BindingShow();
                 component.viewItems.Add(info);
             }
             info.bindingSource = sourceName;
             info.bindingTarget = targetName;
             info.isMethod      = isMethod;
             var type = GenCodeUtil.GetTypeClamp(component.componentType, targetName);
             info.bindingTargetType.Update(type);
         }
     }
 }