/// <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); } } }
/// <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); } } }
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); } } }