private bool InitInterfaceGenContext(InterfaceGenContext context, GenInterface item)
        {
            context.TargetName = item.TargetName;
            context.TargetDir  = item.TargetDir;
            context.TypeSymbol = mCompilation.GetTypeByMetadataName(item.FullyQualifiedMetadataName);

            if (context.TypeSymbol == null)
            {
                Console.WriteLine("Cannot get type from FullyQualifiedMetadataName " + item.FullyQualifiedMetadataName);
                return(false);
            }

            context.SyntaxGenerator = SyntaxGenerator.GetGenerator(mProject);

            context.MethodSymbols.AddRange(GetPublicMethodForGeneration(context.TypeSymbol));

            context.NormalMethodSymbols.AddRange(context.MethodSymbols.Where((sym) =>
            {
                return(sym.MethodKind == MethodKind.Ordinary && !IsMethodImplementedForInterfaceMember(sym));
            }));

            context.PropertySymbols.AddRange(context.MethodSymbols.Where((sym) => !IsMethodImplementedForInterfaceMember(sym) && (sym.MethodKind == MethodKind.PropertyGet || sym.MethodKind == MethodKind.PropertySet))
                                             .Select((sym) => sym.AssociatedSymbol)
                                             .Distinct()
                                             .OfType <IPropertySymbol>()
                                             .ToArray());

            return(true);
        }
        public void GenCode()
        {
            bool reGenXLuaCode = false;

            foreach (var item in mCodeGenConfig.ProxyClassItems)
            {
                Console.WriteLine("生成{0}代理类中", item.TargetName);

                ProxyClassGenContext context = new ProxyClassGenContext();

                if (InitProxyClassGenContext(context, item))
                {
                    PerformProxyClassGeneration(context);

                    if (context.DelegateCallMethodSymbols.Count != 0)
                    {
                        reGenXLuaCode = true;
                    }
                }
            }

            foreach (var item in mCodeGenConfig.InterfaceItems)
            {
                Console.WriteLine("生成{0} Interface中", item.TargetName);

                InterfaceGenContext context = new InterfaceGenContext();

                if (InitInterfaceGenContext(context, item))
                {
                    PerformInterfaceGeneration(context);
                }
            }

            Console.Write("代码生成完毕");

            if (reGenXLuaCode)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(",注意,请在UnityEditor中执行XLua/Generate Code");
                Console.ResetColor();
            }
            else
            {
                Console.WriteLine();
            }
        }
        public void PerformInterfaceGeneration(InterfaceGenContext context)
        {
            var syntaxGen  = context.SyntaxGenerator;
            var typeSymbol = context.TypeSymbol;

            var normalMethodNodes = new List <SyntaxNode>(context.NormalMethodSymbols.Count);

            foreach (var method in context.NormalMethodSymbols)
            {
                var methodDeclaration = syntaxGen.MethodDeclaration(method);
                normalMethodNodes.Add(methodDeclaration);
            }

            var propertyMethodNodes = new List <SyntaxNode>(context.PropertySymbols.Count);

            foreach (var p in context.PropertySymbols)
            {
                var propertyDeclaration = syntaxGen.PropertyDeclaration(p) as PropertyDeclarationSyntax;
                propertyMethodNodes.Add(propertyDeclaration);
            }

            var members = propertyMethodNodes.Union(normalMethodNodes);

            var interfaceDefinition = syntaxGen.InterfaceDeclaration(context.TargetName,
                                                                     accessibility: typeSymbol.DeclaredAccessibility,
                                                                     members: members);

            var namespaceDeclaration = syntaxGen.NamespaceDeclaration(typeSymbol.ContainingNamespace.Name, interfaceDefinition);
            var usingDirective       = syntaxGen.NamespaceImportDeclaration("System");

            usingDirective = AddComment(usingDirective);

            var finalNode = syntaxGen.CompilationUnit(usingDirective, namespaceDeclaration).NormalizeWhitespace();

            var path = Path.Combine(context.TargetDir, context.TargetName);

            path = Path.ChangeExtension(path, ".cs");

            var str = SimplifyGeneratedCode(context.TargetName, finalNode);

            using (var sw = File.CreateText(path))
            {
                sw.Write(str);
            }
        }