public List<DeveloperModel> GetAllDeveloper(AssemblyModel assemblyModel)
 {
     List<DeveloperModel> result = new List<DeveloperModel>();
     lock (this)
     {
         result = DeveloperModelList;
     }
     return result;
 }
예제 #2
0
 public MethodModel(string methodName, AssemblyModel theAssembly, CreaterAttribute createPerson, int iLCodeNum, ReviewerAttribute[] reviews, bool? bug, string codeString)
 {
     this.Name = methodName;
     this.TheAssembly = theAssembly;
     this.CreaterAttr = createPerson;
     this.ILCodeNum = iLCodeNum;
     this.ReviewerAttr = reviews == null ? new ReviewerAttribute[] { } : reviews;
     this.Bug = bug;
     this.CodeString = codeString;
 }
 private void LoadAssemblyInfo(AssemblyModel assemblyModel)
 {
     this.lblFileName.Text = assemblyModel.FileName;
     this.lblFileLength.Text = string.Format("{0}", DataConverter.MyConverter.ConvertToFileLength(assemblyModel.AssemblyFileLength));
     this.lblAssemblyName.Text = assemblyModel.Name;
     this.lblGuid.Text = string.IsNullOrEmpty(assemblyModel.Guid) ? "该程序集没有标注 Guid" : assemblyModel.Guid;
     this.lblVersion.Text = assemblyModel.Version;
     this.lblMethodSum.Text = string.Format("{0} 个", assemblyModel.MethodNum);
     this.lblCodeNum.Text = string.Format("{0} 行", assemblyModel.ILCodeNum);
     this.lblDeveloperNum.Text = string.Format("{0} 名", assemblyModel.Developers.Count);
 }
예제 #4
0
 public FormReport(AssemblyModel assemblymodels)
 {
     InitializeComponent();
     assemblyModel = assemblymodels;
     this.FormClosing += delegate
     {
         DeveloperModelBindingSource.Dispose();
         AssemblyModelBindingSource.Dispose();
         ReportFormatDeveloperBindingSource.Dispose();
         reportViewer1.Dispose();
     };
 }
 public DeveloperModel GetDeveloper(string developerName, AssemblyModel theAssembly)
 {
     DeveloperModel developer = null;
     lock (this)
     {
         developer = DeveloperModelList.Find(((DeveloperModel d) =>
         {
           if (d.Name.Equals(developerName) && d.TheAssembly.Equals(theAssembly))
               return true;
           else
               return false;
         }));
         if (developer == null)//未发现就创建。
         {
             developer = new DeveloperModel(developerName, theAssembly);
             DeveloperModelList.Add(developer);
         }
     }
     return developer;
 }
        private void LoadDeveloperInfo(AssemblyModel assemblyModel)
        {
            this.dgvDeveloper.Rows.Clear();
            int newRowIndex = 0;
            assemblyModel.Developers.Sort(new Comparison<DeveloperModel>((d1, d2) =>
            {
                return d1.Name.CompareTo(d2.Name);
            }));
            foreach (DeveloperModel developerModel in assemblyModel.Developers)
            {
                double methodPercentage = MyConverter.ConvertToPercentage((double)developerModel.MethodNum, (double)assemblyModel.MethodNum);
                double ILCodePercentage = MyConverter.ConvertToPercentage((double)developerModel.ILCodeNum, (double)assemblyModel.ILCodeNum);
                double bugPercentage = MyConverter.ConvertToPercentage((double)developerModel.BugNum, (double)assemblyModel.Developers.Sum(d => d.BugNum));
                double noBugPercentage = MyConverter.ConvertToPercentage((double)(developerModel.MethodNum - developerModel.BugNum - developerModel.NotYetCheckBugNum), (double)assemblyModel.Developers.Sum(d => (d.MethodNum - d.BugNum - d.NotYetCheckBugNum)));
                double notYetCheckBugPercentage = MyConverter.ConvertToPercentage((double)developerModel.NotYetCheckBugNum, (double)assemblyModel.Developers.Sum(d => d.NotYetCheckBugNum));

                newRowIndex = this.dgvDeveloper.Rows.Add();
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColDeveloperName"].Value = developerModel.Name;
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColMethodNum"].Value = string.Format("{0}({1}%)", developerModel.MethodNum, methodPercentage);
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColCodeNum"].Value = string.Format("{0}({1}%)", developerModel.ILCodeNum, ILCodePercentage);
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColReviewNum"].Value = developerModel.ReviewNum;
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColBeReviewNum"].Value = developerModel.BeReviewNum;
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColBugNum"].Value = string.Format("{0}({1}%)", developerModel.BugNum, bugPercentage);
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColNoBugNum"].Value = string.Format("{0}({1}%)", developerModel.MethodNum - developerModel.BugNum - developerModel.NotYetCheckBugNum, noBugPercentage);
                this.dgvDeveloper.Rows[newRowIndex].Cells["ColNotCheckedBug"].Value = string.Format("{0}({1}%)", developerModel.NotYetCheckBugNum, notYetCheckBugPercentage);

                this.dgvDeveloper.Rows[newRowIndex].Tag = developerModel;
            }

            //合计
            newRowIndex = this.dgvDeveloper.Rows.Add();
            this.dgvDeveloper.Rows[newRowIndex].Cells["ColDeveloperName"].Value = "合计";
            this.dgvDeveloper.Rows[newRowIndex].Cells["ColMethodNum"].Value = assemblyModel.MethodNum;
            this.dgvDeveloper.Rows[newRowIndex].Cells["ColCodeNum"].Value = assemblyModel.ILCodeNum;
            this.dgvDeveloper.Rows[newRowIndex].Cells["ColBugNum"].Value = assemblyModel.Developers.Sum(d => d.BugNum);
            this.dgvDeveloper.Rows[newRowIndex].Cells["ColNoBugNum"].Value = assemblyModel.Developers.Sum(d => d.MethodNum - d.BugNum - d.NotYetCheckBugNum);
            this.dgvDeveloper.Rows[newRowIndex].Cells["ColNotCheckedBug"].Value = assemblyModel.Developers.Sum(d => d.NotYetCheckBugNum);
        }
예제 #7
0
        private void ShowAssemblyInfo(AssemblyModel assemblyModel)
        {
            if (assemblyModel != null)
            {
                StringBuilder sbShowText = new StringBuilder();
                sbShowText.AppendLine(string.Format("文件名称:[{0}]", assemblyModel.FileName));
                sbShowText.AppendLine(string.Format("文件大小:[{0}]", DataConverter.MyConverter.ConvertToFileLength(assemblyModel.AssemblyFileLength)));
                sbShowText.AppendLine(string.Format("程序集名称:[{0}]", assemblyModel.Name));
                sbShowText.AppendLine(string.Format("程序集Guid:[{0}]", string.IsNullOrEmpty(assemblyModel.Guid) ? "该程序集没有标注 Guid" : assemblyModel.Guid));
                sbShowText.AppendLine(string.Format("程序集版本:[{0}]", assemblyModel.Version));
                sbShowText.AppendLine(string.Format("程序集方法数目:[{0} 个]", assemblyModel.MethodNum));
                sbShowText.AppendLine(string.Format("程序集MSIL代码行数:[{0} 行]", assemblyModel.ILCodeNum));
                sbShowText.AppendLine(string.Format("程序集开发人数:[{0} 名]", assemblyModel.Developers.Count));

                StringBuilder sbDevelopers = new StringBuilder();
                string maxLengthName = assemblyModel.Developers.Max(d => d.Name);
                int maxNameLength = Encoding.Default.GetByteCount(maxLengthName);
                for (int i = 0; i < assemblyModel.Developers.Count; i++)
                {
                    double methodPercentage = MyConverter.ConvertToPercentage((double)assemblyModel.Developers[i].MethodNum, (double)assemblyModel.MethodNum);
                    double ILCodePercentage = MyConverter.ConvertToPercentage((double)assemblyModel.Developers[i].ILCodeNum, (double)assemblyModel.ILCodeNum);

                    int nameLength = Encoding.Default.GetByteCount(assemblyModel.Developers[i].Name);
                    string formatEmpty = new string(' ', (maxNameLength - nameLength));
                    string developerName = string.Format("{0}{1}", assemblyModel.Developers[i].Name, formatEmpty);
                    sbDevelopers.AppendLine(string.Format("{0}.{1}=>方法数目:{2} 个({3}%),MSIL代码行数:{4} 行({5}%)", i + 1, developerName, assemblyModel.Developers[i].MethodNum, methodPercentage, assemblyModel.Developers[i].ILCodeNum, ILCodePercentage));
                }

                sbShowText.AppendLine(string.Format("程序集开发者清单:{0}{1}", Environment.NewLine, sbDevelopers.ToString()));
                this.txtAssembly.Text = sbShowText.ToString().Trim(new char[] { '\r', '\n' });

            }
            else
                this.txtAssembly.Text = string.Empty;
        }
 private void PrintSelected(AssemblyModel assemblyModel)
 {
     FormReport formReport = new FormReport(assemblyModel);
     formReport.Show();
 }
예제 #9
0
 public DeveloperModel(string developerName, AssemblyModel theAssembly)
 {
     this.Name = developerName;
     this.TheAssembly = theAssembly;
     this.MethodModels = new List<MethodModel>();
 }
예제 #10
0
        public void AsyncAnalyze(ProgressObject progressObject)
        {
            Thread searchThread = new Thread(() =>
            {
                IAssemblyService assemblyService = new AssemblyService();
                IDeveloperService developerService = new DeveloperService();
                IMethodService methodService = new MethodService(developerService);
                Exception runException = null;
                AssemblyModel assemblyModel = null;
                try
                {
                    Globals.LoadOpCodes();
                    string filePath = progressObject.CurrAssemblyFilePath;
                    Assembly assembly = Assembly.LoadFile(filePath);
                    string assemblyFileNama = Path.GetFileName(filePath);
                    string assemblyName = assembly.ManifestModule.ScopeName;
                    string assemblyVersion = assembly.GetName().Version.ToString();
                    object[] guids = assembly.GetCustomAttributes(typeof(GuidAttribute), false);
                    string guidString = string.Empty;
                    if (guids.Length > 0)
                        guidString = ((GuidAttribute)(guids[0])).Value;
                    FileInfo fileInfo = new FileInfo(filePath);
                    long filelength = fileInfo.Length;
                    assemblyModel = new AssemblyModel(assemblyName, progressObject.CurrAssemblyFileName, assemblyVersion, guidString, filelength);

                    Type[] foundTypes = assembly.GetTypes();
                    decimal totalLength = foundTypes.Length;
                    decimal currProgress = 0;
                    int currProgressPercentage = 0;
                    foreach (Type t in foundTypes)
                    {
                        if (isCancel)
                            break;
                        if (ProgressChanged != null)
                        {
                            int percentage = (int)(Math.Round((++currProgress / totalLength), 2) * 100);
                            progressObject.CurrTypeName = t.Name;
                            if (currProgressPercentage != percentage)
                            {
                                currProgressPercentage = percentage;
                                ReportProgress(percentage, progressObject);
                            }
                        }
                        object[] typeAttrs = t.GetCustomAttributes(false);
                        CreaterAttribute classCreaterAttribute = null;
                        ReviewerAttribute[] classReviewerAttributes = null;
                        if (typeAttrs.Where(c => c is CreaterAttribute).Count() > 0)
                            classCreaterAttribute = typeAttrs.Where(c => c is CreaterAttribute).Cast<CreaterAttribute>().First();
                        if (typeAttrs.Where(r => r is ReviewerAttribute).Count() > 0)
                            classReviewerAttributes = typeAttrs.Where(r => r is ReviewerAttribute).Cast<ReviewerAttribute>().ToArray();

                        //只处理该模块下的方法,摒弃系统方法
                        MethodInfo[] methodInfos = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);

                        Attribute createrAttr = null;
                        object[] objectAttrs = null;
                        ReviewerAttribute[] reviewerAttrs = null;
                        Attribute bugAttr = null;
                        MethodModel methodModel = null;
                        MethodBodyReader methodBody = null;
                        string methodName = string.Empty;

                        foreach (MethodInfo method in methodInfos)
                        {
                            methodName = string.Format("{0}.{1}", t.Name, method.Name);
                            createrAttr = Attribute.GetCustomAttribute(method, typeof(CreaterAttribute));
                            objectAttrs = method.GetCustomAttributes(typeof(ReviewerAttribute), false);
                            bugAttr = Attribute.GetCustomAttribute(method, typeof(BugAttribute));

                            bool? isBug = null;//null表示该方法没有测试过
                            CreaterAttribute createPerson = null;
                            int methodCodeNum = 0;
                            string methodCodeString = string.Empty;
                            ReviewerAttribute[] reviews = null;
                            
                            if (createrAttr is CreaterAttribute)
                                createPerson = (CreaterAttribute)createrAttr;
                            else if (classCreaterAttribute is CreaterAttribute)
                                createPerson = (CreaterAttribute)classCreaterAttribute;
                            else
                                createPerson = new CreaterAttribute("未标注的开发者", "未标注时间");

                            if (objectAttrs.Where(r => r is ReviewerAttribute).Count() > 0)
                                reviewerAttrs = objectAttrs.Where(r => r is ReviewerAttribute).Cast<ReviewerAttribute>().ToArray();

                            if (classReviewerAttributes != null && reviewerAttrs != null)
                                reviews = classReviewerAttributes.Concat(reviewerAttrs).ToArray();
                            else if (classReviewerAttributes != null && reviewerAttrs == null)
                                reviews = classReviewerAttributes;
                            else if (classReviewerAttributes == null && reviewerAttrs != null)
                                reviews = reviewerAttrs;

                            if (bugAttr is BugAttribute)
                            {
                                BugAttribute Attr = (BugAttribute)bugAttr;
                                isBug = Attr.IsBug;
                            }

                            methodBody = new MethodBodyReader(method);
                            methodCodeNum = methodBody.GetCodeNum();
                            methodCodeString = methodBody.GetBodyCode();
                            methodModel = new MethodModel(methodName, assemblyModel, createPerson, methodCodeNum, reviews, isBug, methodCodeString);
                            methodService.FindNewMethod(methodModel);
                        }
                    }

                    //该程序集解析完毕,开始汇总
                    if (!isCancel)
                    {
                        List<DeveloperModel> developerModels = developerService.GetAllDeveloper(assemblyModel);
                        assemblyService.SetMethodNum(assemblyModel, developerModels.Sum(d => d.MethodNum));
                        assemblyService.SetILCodeNum(assemblyModel, developerModels.Sum(d => d.ILCodeNum));
                        assemblyService.SetDevelopers(assemblyModel, developerModels);
                    }
                }
                catch (Exception err)
                {
                    runException = err;
                }
                finally
                {
                    assemblyService = null;
                    methodService = null;
                    developerService = null;
                }

                AsyncAnalyzeCompleted(assemblyModel, runException);
            });
            searchThread.IsBackground = true;
            searchThread.Start();
        }
예제 #11
0
 private void AsyncAnalyzeCompleted(AssemblyModel assemblyModel, Exception runException)
 {
     if (AnalyzeCompleted != null)
     {
         AsyncAnalyzeCompletedEventArgs completedEventArgs = new AsyncAnalyzeCompletedEventArgs(assemblyModel, runException, isCancel);
         AnalyzeCompleted(this, completedEventArgs);
     }
 }
예제 #12
0
 public void SetDevelopers(AssemblyModel assemblyModel, List<DeveloperModel> developers)
 {
     assemblyModel.Developers = developers;
 }
예제 #13
0
 public void SetMethodNum(AssemblyModel assemblyModel, int totalMethodNum)
 {
     assemblyModel.MethodNum = totalMethodNum;
 }
예제 #14
0
 public void SetILCodeNum(AssemblyModel assemblyModel, int totalILCodeNum)
 {
     assemblyModel.ILCodeNum = totalILCodeNum;
 }