private void InitRecursively(INamespaceSymbol nssym) { if (null != nssym) { string ns = ClassInfo.GetNamespaces(nssym); m_NamespaceSymbols.Add(ns, nssym); foreach (var typeSym in nssym.GetTypeMembers()) { InitRecursively(typeSym); } foreach (var newSym in nssym.GetNamespaceMembers()) { InitRecursively(newSym); } } }
private static bool IsImplementationOfSys(ITypeSymbol symInfo, string name) { if (null != symInfo) { foreach (var intf in symInfo.AllInterfaces) { if (intf.Name == name) { string ns = ClassInfo.GetNamespaces(intf); if (ns.StartsWith("System.") || ns == "System") { return(true); } } } } return(false); }
private void ProcessAddOrStringConcat(ExpressionSyntax left, ExpressionSyntax right) { var leftOper = m_Model.GetOperation(left); var rightOper = m_Model.GetOperation(right); string leftAssemblyName = leftOper.Type.ContainingAssembly.Name; string rightAssemblyName = rightOper.Type.ContainingAssembly.Name; string leftNamespace = ClassInfo.GetNamespaces(leftOper.Type); string rightNamespace = ClassInfo.GetNamespaces(rightOper.Type); string leftTypeFullName = ClassInfo.GetFullName(leftOper.Type); string rightTypeFullName = ClassInfo.GetFullName(rightOper.Type); if (leftTypeFullName == "System.String" && rightTypeFullName == "System.String") { CodeBuilder.Append("System.String.Concat("); VisitExpressionSyntax(left); CodeBuilder.Append(", "); VisitExpressionSyntax(right); CodeBuilder.Append(")"); } else if (leftTypeFullName == "System.String") { CodeBuilder.Append("System.String.Concat("); VisitExpressionSyntax(left); CodeBuilder.Append(", tostring("); VisitExpressionSyntax(right); CodeBuilder.Append("))"); } else if (rightTypeFullName == "System.String") { CodeBuilder.Append("System.String.Concat(tostring("); VisitExpressionSyntax(left); CodeBuilder.Append("), "); VisitExpressionSyntax(right); CodeBuilder.Append(")"); } else { CodeBuilder.Append("("); VisitExpressionSyntax(left); CodeBuilder.Append(" + "); VisitExpressionSyntax(right); CodeBuilder.Append(")"); } }
private void ProcessAddOrStringConcat(ExpressionSyntax left, ExpressionSyntax right, IConversionExpression lopd, IConversionExpression ropd) { var leftOper = m_Model.GetOperation(left); var rightOper = m_Model.GetOperation(right); string leftAssemblyName = leftOper.Type.ContainingAssembly.Name; string rightAssemblyName = rightOper.Type.ContainingAssembly.Name; string leftNamespace = ClassInfo.GetNamespaces(leftOper.Type); string rightNamespace = ClassInfo.GetNamespaces(rightOper.Type); string leftTypeFullName = ClassInfo.GetFullName(leftOper.Type); string rightTypeFullName = ClassInfo.GetFullName(rightOper.Type); if (leftTypeFullName == SymbolTable.PrefixExternClassName("System.String") && rightTypeFullName == SymbolTable.PrefixExternClassName("System.String")) { CodeBuilder.Append(SymbolTable.PrefixExternClassName("System.String.Concat(")); OutputExpressionSyntax(left, lopd); CodeBuilder.Append(", "); OutputExpressionSyntax(right, ropd); CodeBuilder.Append(")"); } else if (leftTypeFullName == SymbolTable.PrefixExternClassName("System.String")) { CodeBuilder.Append(SymbolTable.PrefixExternClassName("System.String.Concat(")); OutputExpressionSyntax(left, lopd); CodeBuilder.Append(", tostring("); OutputExpressionSyntax(right, ropd); CodeBuilder.Append("))"); } else if (rightTypeFullName == SymbolTable.PrefixExternClassName("System.String")) { CodeBuilder.Append(SymbolTable.PrefixExternClassName("System.String.Concat(tostring(")); OutputExpressionSyntax(left, lopd); CodeBuilder.Append("), "); OutputExpressionSyntax(right, ropd); CodeBuilder.Append(")"); } else { CodeBuilder.Append("("); OutputExpressionSyntax(left, lopd); CodeBuilder.Append(" + "); OutputExpressionSyntax(right, ropd); CodeBuilder.Append(")"); } }
internal void Init(IMethodSymbol sym, SyntaxNode node) { IAssemblySymbol assemblySym = SymbolTable.Instance.AssemblySymbol; ParamNames.Clear(); ReturnParamNames.Clear(); RefParamNames.Clear(); OutParamNames.Clear(); OriginalParamsName = string.Empty; ExistYield = false; ExistTopLevelReturn = false; SemanticInfo = sym; if (sym.IsGenericMethod) { foreach (var param in sym.TypeParameters) { ParamNames.Add(param.Name); GenericMethodTypeParamNames.Add(param.Name); } } foreach (var param in sym.Parameters) { if (param.IsParams) { var arrTypeSym = param.Type as IArrayTypeSymbol; if (null != arrTypeSym && arrTypeSym.ElementType.TypeKind == TypeKind.Struct) { string ns = ClassInfo.GetNamespaces(arrTypeSym.ElementType); if (arrTypeSym.ElementType.ContainingAssembly == assemblySym) { ParamsIsValueType = true; } else if (ns != "System") { ParamsIsExternValueType = true; } } ParamNames.Add("..."); OriginalParamsName = param.Name; //遇到变参直接结束(变参set_Item会出现后面带一个value参数的情形,在函数实现里处理) break; } else if (param.RefKind == RefKind.Ref || param.RefKind == RefKind.Out) { //ref参数与out参数在形参处理时机制相同,实参时out参数传入__cs2lua_out(适应slua与dotnet反射的调用规则) ParamNames.Add(param.Name); RefParamNames.Add(param.Name); ReturnParamNames.Add(param.Name); } else { if (param.Type.TypeKind == TypeKind.Struct) { string ns = ClassInfo.GetNamespaces(param.Type); if (param.Type.ContainingAssembly == assemblySym) { ValueParams.Add(ParamNames.Count); } else if (ns != "System") { ExternValueParams.Add(ParamNames.Count); } } ParamNames.Add(param.Name); } } if (!sym.ReturnsVoid) { var returnType = ClassInfo.GetFullName(sym.ReturnType); if (returnType.StartsWith(SymbolTable.PrefixExternClassName("System.Collections")) && (sym.ReturnType.Name == "IEnumerable" || sym.ReturnType.Name == "IEnumerator")) { var analysis = new YieldAnalysis(); analysis.Visit(node); ExistYield = analysis.YieldCount > 0; } } }