コード例 #1
0
        private static XML preDoOneGenerate(string xmlPath)
        {
            XML xml = FileUtils.readFileForXML(xmlPath);

            //处理屏蔽
            foreach (XML xl in xml.getChildrenByName("ignoreMethod"))
            {
                string[] methods = xl.getProperty("methods").Split(',');

                SSet <string> dd = new SSet <string>();
                dd.addAll(methods);
                _clsIgnoreMethods.put(xl.getProperty("cls"), dd);
            }

            foreach (XML xl in xml.getChildrenByName("allowMethod"))
            {
                string[] methods = xl.getProperty("methods").Split(',');

                SSet <string> dd = new SSet <string>();
                dd.addAll(methods);
                _clsAllowMethods.put(xl.getProperty("cls"), dd);
            }

            foreach (XML xl in xml.getChildrenByName("namespace"))
            {
                _allowNameSpace.add(xl.getProperty("name"));
            }

            return(xml);
        }
コード例 #2
0
        private static void doOneGenerate(string xmlPath, string controlClsPath, string adapterOutPath, int projectType)
        {
            clearGenerate();

            _isShine = projectType == 0;

            //TODO:根据类型取父factory

            XML xml = FileUtils.readFileForXML(xmlPath);

            int aLen = "Assets/".Length;

            //处理屏蔽
            foreach (XML xl in xml.getChildrenByName("ignoreMethod"))
            {
                string[] methods = xl.getProperty("methods").Split(',');

                SSet <string> dd = new SSet <string>();
                dd.addAll(methods);
                _clsIgnoreMethods.put(xl.getProperty("cls"), dd);
            }

            foreach (XML xl in xml.getChildrenByName("allowMethod"))
            {
                string[] methods = xl.getProperty("methods").Split(',');

                SSet <string> dd = new SSet <string>();
                dd.addAll(methods);
                _clsAllowMethods.put(xl.getProperty("cls"), dd);
            }

            //先处理包路径
            foreach (XML xl in xml.getChildrenByName("root"))
            {
                SList <string> ignoreList = new SList <string>();

                foreach (XML pXml in xl.getChildrenByName("ignorePath"))
                {
                    ignoreList.add(pXml.getProperty("path"));
                }

                StringIntMap hotfixPathDic = new StringIntMap();

                foreach (XML pXml in xl.getChildrenByName("hotfixPath"))
                {
                    hotfixPathDic.put(pXml.getProperty("path"), pXml.getProperty("needFactory").Equals("true") ? 1 : 0);
                }

                string rootPath = "Assets/" + xl.getProperty("path");

                string[] deepFileList = FileUtils.getDeepFileList(rootPath, "cs");

                foreach (string s in deepFileList)
                {
                    //编辑器类的跳过
                    if (s.Contains("/Editor/"))
                    {
                        continue;
                    }

                    string tailPath = s.Substring(rootPath.Length + 1);

                    bool failed = false;

                    //排除组
                    foreach (string ig in ignoreList)
                    {
                        if (tailPath.StartsWith(ig))
                        {
                            failed = true;
                            break;
                        }
                    }

                    if (failed)
                    {
                        continue;
                    }

                    string fQName = FileUtils.getFileFrontName(s.Substring(aLen));

                    String fName = FileUtils.getFileName(fQName);

                    _clsNameToPathDic.put(fName, fQName);

                    string[] keys   = hotfixPathDic.getKeys();
                    int[]    values = hotfixPathDic.getValues();
                    string   k;
                    int      v;

                    for (int i = keys.Length - 1; i >= 0; --i)
                    {
                        if ((k = keys[i]) != null)
                        {
                            v = values[i];

                            //需要
                            if (tailPath.StartsWith(k))
                            {
                                _adapterClsDic.add(fName);

                                if (v == 1)
                                {
                                    _factoryClsDic.add(fName);
                                }

                                break;
                            }
                        }
                    }
                }
            }

            //再处理命名空间
            foreach (XML xl in xml.getChildrenByName("namespace"))
            {
                _allowNameSpace.add(xl.getProperty("name"));
            }

            //项目程序集
            Assembly assembly = typeof(ShineSetup).Assembly;

            Type[] types = assembly.GetTypes();

            foreach (Type vType in types)
            {
                string fullName = vType.FullName;

                //内部类不统计
                if (!fullName.Contains("+"))
                {
                    //命名空间允许
                    if (string.IsNullOrEmpty(vType.Namespace) || _allowNameSpace.contains(vType.Namespace))
                    {
                        string vName = vType.Name;

                        int index = vName.IndexOf('`');

                        //去掉泛型标记
                        if (index > 0)
                        {
                            vName = vName.Substring(0, index);
                        }

                        TypeInfo typeInfo = new TypeInfo();
                        typeInfo.clsName = vName;
                        typeInfo.clsType = vType;

                        if (_typeDic.contains(vName))
                        {
                            // Ctrl.print("类名重复",vName);
                            continue;
                        }

                        _typeDic.put(vName, typeInfo);
                        //类路径
                        typeInfo.clsPath = _clsNameToPathDic.get(vName);
                    }
                }
            }

            string clsStr = FileUtils.readFileForUTF(controlClsPath);

            string factoryClsPath = getFactoryClsPath(projectType);

            ClsAnalysis.FactoryClassInfo factoryClass = ClsAnalysis.readFactory(factoryClsPath);
            string projectMark = getProjectMark(projectType);

            string factoryClsName = FileUtils.getFileFrontName(FileUtils.getFileName(factoryClsPath));

            //遍历父
            for (int i = projectType - 1; i >= Project_Common; i--)
            {
                ClsAnalysis.FactoryClassInfo parentFactoryCls = ClsAnalysis.readFactory(getFactoryClsPath(i));

                factoryClass.addParent(parentFactoryCls);
            }


            StringBuilder sb = new StringBuilder();

            endClsLine(sb);

            if (!_isShine)
            {
                sb.Append("base.initOtherAdapters(appdomain);");
                endClsLine(sb);
            }


            XML reXMl = new XML();

            reXMl.name = "info";

            //工厂最后执行
            TypeInfo factoryTypeInfo = getTypeInfo(factoryClsName);

            _clsNameToPathDic.remove(factoryClsName);

            foreach (string k in _clsNameToPathDic.getSortedMapKeys())
            {
                TypeInfo typeInfo = getTypeInfo(k);

                if (typeInfo == null)
                {
                    Ctrl.throwError("不该找不到类型", k);
                }

                if (typeInfo.hasHotfixMark || !typeInfo.isEmpty())
                {
                    //需要工厂,并且不是虚类
                    if (!typeInfo.iCls.isAbstract && (typeInfo.needFactory || _factoryClsDic.contains(k)))
                    {
                        ClsAnalysis.FMethod method = factoryClass.addMethod(k, projectMark);

                        //补方法
                        factoryTypeInfo.iCls.addMethod("create" + method.name, method.returnType, VisitType.Public, true);
                    }

                    //需要适配器
                    if (typeInfo.hasHotfixMark || _adapterClsDic.contains(k))
                    {
                        doOneClass(typeInfo.iCls, adapterOutPath, _isShine, sb);
                    }

                    // reXMl.appendChild(typeInfo.writeXML());
                }
            }

            doOneClass(factoryTypeInfo.iCls, adapterOutPath, _isShine, sb);

            //去掉最后一个tab
            sb.Remove(sb.Length - 1, 1);

            clsStr = replaceMethod(clsStr, "protected " + (_isShine ? "virtual" : "override") + " void initOtherAdapters(AppDomain appdomain)", sb.ToString());

            factoryClass.writeToPath(factoryClsPath);
            FileUtils.writeFileForUTF(controlClsPath, clsStr);

            // FileUtils.writeFileForXML("/Users/sunming/E/temp3/aa.xml",reXMl);
        }