public async System.Threading.Tasks.Task <CodeMemberMethod> CreateSelectedMethod(CodeTypeDeclaration codeClass, string methodName, Type returnType, string defaultValue, LinkPinControl linkHandle, GenerateCodeContext_Method context) { var valueEvaluateMethod = new CodeMemberMethod(); valueEvaluateMethod.Name = methodName; valueEvaluateMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final; valueEvaluateMethod.ReturnType = new CodeTypeReference(returnType); var valueEvaluateMethodContex = new GenerateCodeContext_Method(context.ClassContext, valueEvaluateMethod); var value = await Helper.GetEvaluateValueExpression(codeClass, valueEvaluateMethodContex, valueEvaluateMethod, linkHandle, defaultValue); var cast = new CodeGenerateSystem.CodeDom.CodeCastExpression(typeof(int), value); valueEvaluateMethod.Statements.Add(new CodeMethodReturnStatement(cast)); codeClass.Members.Add(valueEvaluateMethod); return(valueEvaluateMethod); }
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(System.CodeDom.CodeTypeDeclaration codeClass, System.CodeDom.CodeStatementCollection codeStatementCollection, CodeGenerateSystem.Base.LinkPinControl element, CodeGenerateSystem.Base.GenerateCodeContext_Method context) { MethodInvokeParameterControl retCtrl = null; Dictionary <CodeGenerateSystem.Base.BaseNodeControl, System.CodeDom.CodeExpression> paramCodeExps = new Dictionary <CodeGenerateSystem.Base.BaseNodeControl, System.CodeDom.CodeExpression>(); var rcParam = CSParam as ReturnCustomConstructParam; if (rcParam.MethodInfo.IsAsync) { // 异步不能有out,只能有一个返回值 if (mChildNodes.Count == 1) { retCtrl = mChildNodes[0] as MethodInvokeParameterControl; } } else { foreach (var paramNode in mChildNodes) { if (paramNode is MethodInvokeParameterControl) { var pm = paramNode as MethodInvokeParameterControl; var param = pm.CSParam as MethodInvokeParameterControl.MethodInvokeParameterConstructionParams; if (param.ParamInfo.ParamName == "Return") { retCtrl = pm; continue; } if (pm.HasLink()) { await pm.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, pm.ParamPin, context); var exp = new CodeGenerateSystem.CodeDom.CodeCastExpression(param.ParamInfo.ParameterType, pm.GCode_CodeDom_GetValue(pm.ParamPin, context)); paramCodeExps[paramNode] = exp; codeStatementCollection.Add(new System.CodeDom.CodeAssignStatement( new System.CodeDom.CodeVariableReferenceExpression(param.ParamInfo.ParamName), exp)); } else if (mTemplateClassInstance != null) { var proInfo = mTemplateClassInstance.GetType().GetProperty(param.ParamInfo.ParamName); object proValue; if (proInfo == null) { proValue = CodeGenerateSystem.Program.GetDefaultValueFromType(param.ParamInfo.ParameterType); } else { proValue = proInfo.GetValue(mTemplateClassInstance); } var valueExp = Program.GetValueCode(codeStatementCollection, param.ParamInfo.ParameterType, proValue); paramCodeExps[paramNode] = valueExp; codeStatementCollection.Add(new System.CodeDom.CodeAssignStatement(new System.CodeDom.CodeVariableReferenceExpression(param.ParamInfo.ParamName), valueExp)); } } else { throw new InvalidOperationException(); } } } if (retCtrl != null) { if (retCtrl.HasLink()) { await retCtrl.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, retCtrl.ParamPin, context); } System.CodeDom.CodeExpression retExp = null; if (retCtrl.HasLink()) { var retStatement = new System.CodeDom.CodeMethodReturnStatement(); retExp = retCtrl.GCode_CodeDom_GetValue(retCtrl.ParamPin, context); paramCodeExps[retCtrl] = retExp; } else if (mTemplateClassInstance != null) { var param = retCtrl.CSParam as MethodInvokeParameterControl.MethodInvokeParameterConstructionParams; var proInfo = mTemplateClassInstance.GetType().GetProperty(param.ParamInfo.ParamName); object proValue; if (proInfo == null) { proValue = CodeGenerateSystem.Program.GetDefaultValueFromType(param.ParamInfo.ParameterType); } else { proValue = proInfo.GetValue(mTemplateClassInstance); } retExp = Program.GetValueCode(codeStatementCollection, param.ParamInfo.ParameterType, proValue); paramCodeExps[retCtrl] = retExp; } #region Debug var debugCodes = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection); foreach (var paramNode in mChildNodes) { if (paramNode is MethodInvokeParameterControl) { var pm = paramNode as MethodInvokeParameterControl; System.CodeDom.CodeExpression exp; if (paramCodeExps.TryGetValue(paramNode, out exp)) { CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodes, pm.ParamPin.GetLinkPinKeyName(), exp, pm.GCode_GetTypeString(pm.ParamPin, context), context); } } else { throw new InvalidOperationException("未实现"); } } var breakCondStatement = CodeDomNode.BreakPoint.BreakCodeStatement(codeClass, debugCodes, HostNodesContainer.GUID, Id); CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes); #endregion codeStatementCollection.Add(new System.CodeDom.CodeMethodReturnStatement(retExp)); } else { #region Debug var debugCodes = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection); var breakCondStatement = CodeDomNode.BreakPoint.BreakCodeStatement(codeClass, debugCodes, HostNodesContainer.GUID, Id); CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes); #endregion codeStatementCollection.Add(new System.CodeDom.CodeMethodReturnStatement()); } }
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(System.CodeDom.CodeTypeDeclaration codeClass, System.CodeDom.CodeStatementCollection codeStatementCollection, CodeGenerateSystem.Base.LinkPinControl element, CodeGenerateSystem.Base.GenerateCodeContext_Method context) { if (!mCtrlParamLink_1.HasLink || !mCtrlParamLink_2.HasLink) { return; } if (!mCtrlParamLink_1.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlParamLink_1.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlParamLink_1.GetLinkedPinControl(0, true), context); } if (!mCtrlParamLink_2.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlParamLink_2.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlParamLink_2.GetLinkedPinControl(0, true), context); } var param1Exp = mCtrlParamLink_1.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlParamLink_1.GetLinkedPinControl(0, true), context); var param2Exp = mCtrlParamLink_2.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlParamLink_2.GetLinkedPinControl(0, true), context); var type1 = mCtrlParamLink_1.GetLinkedObject(0, true).GCode_GetType(mCtrlParamLink_1.GetLinkedPinControl(0, true), context); var type2 = mCtrlParamLink_2.GetLinkedObject(0, true).GCode_GetType(mCtrlParamLink_2.GetLinkedPinControl(0, true), context); if (type1.IsEnum && !type2.IsEnum) { param1Exp = new CodeGenerateSystem.CodeDom.CodeCastExpression(type2, param1Exp); } else if (!type1.IsEnum && type2.IsEnum) { param2Exp = new CodeGenerateSystem.CodeDom.CodeCastExpression(type1, param2Exp); } var compareExp = new System.CodeDom.CodeBinaryOperatorExpression(); compareExp.Left = param1Exp; compareExp.Right = param2Exp; switch (CSParam.ConstructParam) { case ">": compareExp.Operator = System.CodeDom.CodeBinaryOperatorType.GreaterThan; break; case "=": case "==": compareExp.Operator = System.CodeDom.CodeBinaryOperatorType.ValueEquality; break; case "<": compareExp.Operator = System.CodeDom.CodeBinaryOperatorType.LessThan; break; case "≥": compareExp.Operator = System.CodeDom.CodeBinaryOperatorType.GreaterThanOrEqual; break; case "≤": compareExp.Operator = System.CodeDom.CodeBinaryOperatorType.LessThanOrEqual; break; case "≠": compareExp.Operator = System.CodeDom.CodeBinaryOperatorType.IdentityInequality; break; } if (!context.Method.Statements.Contains(mVariableDeclarationStatement)) { mVariableDeclarationStatement = new System.CodeDom.CodeVariableDeclarationStatement(typeof(bool), GCode_GetValueName(null, context)); context.Method.Statements.Insert(0, mVariableDeclarationStatement); } if (!codeStatementCollection.Contains(mVariableAssignStatement)) { //mVariableDeclarationStatement = new System.CodeDom.CodeVariableDeclarationStatement(typeof(bool), GCode_GetValueName(null, context), compareExp); mVariableAssignStatement = new System.CodeDom.CodeAssignStatement(GCode_CodeDom_GetValue(null, context), compareExp); codeStatementCollection.Add(mVariableAssignStatement); // 收集用于调试的数据的代码 var debugCodes = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection); CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodes, mCtrlresultHandle.GetLinkPinKeyName(), GCode_CodeDom_GetValue(null, context), GCode_GetTypeString(null, context), context); CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes); } }