internal void OutputWrapStructFields(StringBuilder codeBuilder, int indent, CsDslTranslater cs2dsl) { for (int i = 0; i < ReturnValueArgFlags.Count; ++i) { bool flag = ReturnValueArgFlags[i]; if (flag) { var exp = ReturnArgs[i]; var oper = ReturnArgOperations[i]; var leftSym = ReturnArgSymbols[i]; if (null != leftSym && (leftSym.Kind == SymbolKind.Local || leftSym.Kind == SymbolKind.Parameter || SymbolTable.Instance.IsFieldSymbolKind(leftSym))) { if (SymbolTable.Instance.IsCs2DslSymbol(oper.Type)) { cs2dsl.MarkNeedFuncInfo(); codeBuilder.Append(CsDslTranslater.GetIndentString(indent)); cs2dsl.OutputExpressionSyntax(exp); codeBuilder.Append(" = wrapstruct("); cs2dsl.OutputExpressionSyntax(exp); codeBuilder.AppendFormat(", {0});", ClassInfo.GetFullName(oper.Type)); codeBuilder.AppendLine(); } else { string ns = ClassInfo.GetNamespaces(oper.Type); if (ns != "System") { cs2dsl.MarkNeedFuncInfo(); codeBuilder.Append(CsDslTranslater.GetIndentString(indent)); cs2dsl.OutputExpressionSyntax(exp); codeBuilder.Append(" = wrapexternstruct("); cs2dsl.OutputExpressionSyntax(exp); codeBuilder.AppendFormat(", {0});", ClassInfo.GetFullName(oper.Type)); codeBuilder.AppendLine(); } } } } } }
internal void OutputRecycleAndKeepStructFields(StringBuilder codeBuilder, int indent, CsDslTranslater cs2dsl, string oldVarPrefix, string newVarPrefix, string varPostfix) { for (int i = 0; i < ReturnValueArgFlags.Count; ++i) { bool flag = ReturnValueArgFlags[i]; if (flag) { var exp = ReturnArgs[i]; var oper = ReturnArgOperations[i]; var leftSym = ReturnArgSymbols[i]; if (null != leftSym && SymbolTable.Instance.IsCs2DslSymbol(leftSym) && SymbolTable.Instance.IsFieldSymbolKind(leftSym)) { cs2dsl.MarkNeedFuncInfo(); string fieldType = fieldType = ClassInfo.GetFullName(oper.Type); //回收旧值,保持新值 codeBuilder.Append(CsDslTranslater.GetIndentString(indent)); codeBuilder.Append("recycleandkeepstructvalue("); codeBuilder.Append(fieldType); codeBuilder.AppendFormat(", {0}_{2}_{3}, {1}_{2}_{3});", oldVarPrefix, newVarPrefix, i, varPostfix); codeBuilder.AppendLine(); } } } }
internal void OutputInvocation(StringBuilder codeBuilder, CsDslTranslater cs2dsl, ExpressionSyntax exp, bool isMemberAccess, SemanticModel model, SyntaxNode node) { IMethodSymbol sym = MethodSymbol; string mname = GetMethodName(); string prestr = string.Empty; bool externReturnStruct = IsExternMethod && !sym.ReturnsVoid && sym.ReturnType.IsValueType && !SymbolTable.IsBasicType(sym.ReturnType); if (externReturnStruct) { cs2dsl.MarkNeedFuncInfo(); } if (isMemberAccess) { string fnOfIntf = string.Empty; var expOper = model.GetOperationEx(exp); bool isExplicitInterfaceInvoke = cs2dsl.CheckExplicitInterfaceAccess(sym, ref fnOfIntf); bool expIsBasicType = false; if (!sym.IsStatic && null != expOper && SymbolTable.IsBasicType(expOper.Type)) { expIsBasicType = true; } if (sym.MethodKind == MethodKind.DelegateInvoke) { var memberAccess = node as MemberAccessExpressionSyntax; if (null != memberAccess) { var symInfo = model.GetSymbolInfoEx(node); var masym = symInfo.Symbol as ISymbol; if (null != masym) { bool isCs2Lua = SymbolTable.Instance.IsCs2DslSymbol(masym); string kind = SymbolTable.Instance.GetSymbolKind(masym); string fn = ClassInfo.GetFullName(masym.ContainingType); string dt = ClassInfo.GetFullName(sym); if (externReturnStruct) { codeBuilder.Append("callexterndelegationreturnstruct(getinstance(SymbolKind."); } else if (isCs2Lua) { codeBuilder.AppendFormat("call{0}delegation(getinstance(SymbolKind.", IsExternMethod ? "extern" : string.Empty); } else { codeBuilder.AppendFormat("call{0}delegation(getexterninstance(SymbolKind.", IsExternMethod ? "extern" : string.Empty); } codeBuilder.Append(kind); codeBuilder.Append(", "); cs2dsl.OutputExpressionSyntax(exp); codeBuilder.AppendFormat(", {0}, \"{1}\"), \"{2}\"", fn, memberAccess.Name, dt); prestr = ", "; } else { //error; } } else { //error; } } else if (isExplicitInterfaceInvoke) { //这里不区分是否外部符号了,委托到动态语言的脚本库实现,可根据对象运行时信息判断 if (externReturnStruct) { codeBuilder.Append("callexterninstancereturnstruct("); } else { codeBuilder.Append("callinstance("); } cs2dsl.OutputExpressionSyntax(exp); codeBuilder.Append(", "); codeBuilder.Append(ClassKey); codeBuilder.Append(", "); codeBuilder.AppendFormat("\"{0}\"", fnOfIntf); prestr = ", "; } else if (IsExtensionMethod) { if (externReturnStruct) { codeBuilder.Append("callexternextensionreturnstruct("); } else if (IsExternMethod) { codeBuilder.Append("callexternextension("); } else { codeBuilder.Append("callextension("); } codeBuilder.AppendFormat("{0}, \"{1}\", ", ClassKey, mname); cs2dsl.OutputExpressionSyntax(exp); prestr = ", "; } else if (IsBasicValueMethod || expIsBasicType) { //这里不区分是否外部符号了,委托到动态语言的脚本库实现,可根据对象运行时信息判断 string ckey = CalcInvokeTarget(IsEnumClass, ClassKey, cs2dsl, expOper); codeBuilder.Append("invokeforbasicvalue("); cs2dsl.OutputExpressionSyntax(exp); codeBuilder.Append(", "); codeBuilder.AppendFormat("{0}, {1}, \"{2}\"", IsEnumClass ? "true" : "false", ckey, mname); prestr = ", "; } else if (IsArrayStaticMethod) { //这里不区分是否外部符号了,委托到动态语言的脚本库实现,可根据对象运行时信息判断 codeBuilder.Append("invokearraystaticmethod("); if (null == FirstRefArray) { codeBuilder.Append("null, "); } else { cs2dsl.OutputExpressionSyntax(FirstRefArray); codeBuilder.Append(", "); } if (null == SecondRefArray) { codeBuilder.Append("null, "); } else { cs2dsl.OutputExpressionSyntax(SecondRefArray); codeBuilder.Append(", "); } codeBuilder.AppendFormat("\"{0}\"", mname); prestr = ", "; } else { if (sym.IsStatic) { if (externReturnStruct) { codeBuilder.Append("callexternstaticreturnstruct("); } else if (IsExternMethod) { codeBuilder.Append("callexternstatic("); } else { codeBuilder.Append("callstatic("); } codeBuilder.Append(ClassKey); } else { if (externReturnStruct) { codeBuilder.Append("callexterninstancereturnstruct("); } else if (IsExternMethod) { codeBuilder.Append("callexterninstance("); } else { codeBuilder.Append("callinstance("); } cs2dsl.OutputExpressionSyntax(exp); codeBuilder.Append(", "); codeBuilder.Append(ClassKey); } codeBuilder.AppendFormat(", \"{0}\"", mname); prestr = ", "; } } else { if (sym.MethodKind == MethodKind.DelegateInvoke) { cs2dsl.OutputExpressionSyntax(exp); codeBuilder.Append("("); } else if (sym.IsStatic) { if (externReturnStruct) { codeBuilder.Append("callexternstaticreturnstruct("); } else if (IsExternMethod) { codeBuilder.Append("callexternstatic("); } else { codeBuilder.Append("callstatic("); } codeBuilder.Append(ClassKey); codeBuilder.AppendFormat(", \"{0}\"", mname); prestr = ", "; } else { if (externReturnStruct) { codeBuilder.Append("callexterninstancereturnstruct("); } else if (IsExternMethod) { codeBuilder.Append("callexterninstance("); } else { codeBuilder.Append("callinstance("); } codeBuilder.Append("this"); codeBuilder.AppendFormat(", {0}, \"{1}\"", ClassKey, mname); prestr = ", "; } } if (Args.Count + DefaultValueArgs.Count + GenericTypeArgs.Count > 0) { codeBuilder.Append(prestr); } bool useTypeNameString = false; if (IsComponentGetOrAdd && SymbolTable.DslComponentByString) { var tArgs = sym.TypeArguments; if (tArgs.Length > 0 && SymbolTable.Instance.IsCs2DslSymbol(tArgs[0])) { useTypeNameString = true; } } TypeChecker.CheckInvocation(model, sym, Args, DefaultValueArgs, ArgConversions, CallerSyntaxNode, CallerMethodSymbol); cs2dsl.OutputArgumentList(this, useTypeNameString, node); codeBuilder.Append(")"); }