コード例 #1
0
ファイル: SymbolTable.cs プロジェクト: wang88yan/Cs2Lua
 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);
         }
     }
 }
コード例 #2
0
ファイル: CsToLua.cs プロジェクト: 70yx/Cs2Lua
 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);
 }
コード例 #3
0
        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(")");
            }
        }
コード例 #4
0
ファイル: CsToLua.cs プロジェクト: hongAgain/Cs2Lua
        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(")");
            }
        }
コード例 #5
0
        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;
                }
            }
        }