internal static void Go(ICompareContext compareContext) { Debug.Assert(compareContext != null); var olderCodeBase = compareContext.OlderCodeBase; var newerCodeBase = compareContext.NewerCodeBase; // // Types not publicly visible anymore // var publicTypesRemoved = from t in olderCodeBase.Application.Types let tNewer = compareContext.NewerVersion(t) // notice we don't use the syntax t.NewerVersion specific to CQLinq where t.IsPubliclyVisible && (tNewer == null || !tNewer.IsPubliclyVisible) select t; // // Methods not publicly visible anymore // var publicMethodsRemoved = from m in olderCodeBase.Application.Methods let mNewer = compareContext.NewerVersion(m) where m.IsPubliclyVisible && !m.ParentType.IsDelegate && // Don't show new delegate generated methods! (mNewer == null || !mNewer.IsPubliclyVisible) && !compareContext.WasRemoved(m.ParentType) && // (not including methods in public types removed) // There is no base methods that is present in both builds m.OverriddensBase.Where(compareContext.IsPresentInBothBuilds).Count() == 0 select m; // // Fields not publicly visible anymore // var publicFieldsRemoved = from f in olderCodeBase.Application.Fields let tNewer = compareContext.NewerVersion(f) where f.IsPubliclyVisible && (tNewer == null || !tNewer.IsPubliclyVisible) && !compareContext.WasRemoved(f.ParentType) // (not including fields in public types removed) select f; // // Public Base classes or interfaces with new abstract methods // var newAbstractMethodsOnExistingTypes = from m in newerCodeBase.Application.Methods let mOlder = compareContext.OlderVersion(m) where m.IsAbstract && m.IsPubliclyVisible && !m.IsThirdParty && compareContext.IsPresentInBothBuilds(m.ParentType) && (mOlder == null || !mOlder.IsPubliclyVisible) select m;; // // New public types // var newPublicTypes = from t in newerCodeBase.Application.Types let tOlder = compareContext.OlderVersion(t) where t.IsPubliclyVisible && (tOlder == null || !tOlder.IsPubliclyVisible) select t; // // New public methods // var newPublicMethods = from m in newerCodeBase.Application.Methods let mOlder = compareContext.OlderVersion(m) where m.IsPubliclyVisible && !m.IsThirdParty && !m.ParentType.IsDelegate && // Don't show new delegate generated methods! (mOlder == null || !mOlder.IsPubliclyVisible) && !compareContext.WasAdded(m.ParentType) // (not including methods in new public types) select m; // // New public fields // var newPublicFields = from f in newerCodeBase.Application.Fields let fOlder = compareContext.OlderVersion(f) where f.IsPubliclyVisible && (fOlder == null || !fOlder.IsPubliclyVisible) && !compareContext.WasAdded(f.ParentType) // (not including fields in new public types) select f; var changes = new List <ChangeRecord> { // API breaking changes new ChangeRecord(" public types removed", publicTypesRemoved.Cast <IMember>(), COLOR_WARNING), new ChangeRecord(" public methods removed (not including methods in public types removed)", publicMethodsRemoved.Cast <IMember>(), COLOR_WARNING), new ChangeRecord(" public fields removed (not including fields in public types removed)", publicFieldsRemoved.Cast <IMember>(), COLOR_WARNING), new ChangeRecord(" public asbtract methods added on existing type", newAbstractMethodsOnExistingTypes.Cast <IMember>(), COLOR_WARNING), // API changes new ChangeRecord(" new public types", newPublicTypes.Cast <IMember>(), COLOR_DEFAULT), new ChangeRecord(" new public methods (not including methods in new public types)", newPublicMethods.Cast <IMember>(), COLOR_DEFAULT), new ChangeRecord(" new public fields (not including fields in new public types)", newPublicFields.Cast <IMember>(), COLOR_DEFAULT) }; changes.RemoveAll(changeRecord => changeRecord.m_Members.Count() == 0); ShowChanges(changes); }
internal MethodsChangedDisplayer(IList <IMember> members, ICompareContext compareContext) : base(members) { Debug.Assert(members != null); Debug.Assert(compareContext != null); m_CompareContext = compareContext; }
internal static bool TryGetAssembliesToCompareAndAnalyzeThem(out ICompareContext compareContext) { var analysisManager = new NDependServicesProvider().AnalysisManager; var top = Console.CursorTop; Console.CursorLeft = 0; IProject projectOlder, projectNewer; IAnalysisResultRef analysisResultRefOlder, analysisResultRefNewer; Console.WriteLine("Please choose older and newer versions of the code base..."); bool dialogOk = analysisManager.ShowDialogBuildComparison( ConsoleUtils.MainWindowHandle, out projectOlder, out analysisResultRefOlder, out projectNewer, out analysisResultRefNewer); if (!dialogOk) { compareContext = null; return(false); } var nbLinesToErase = Console.CursorTop - top; Console.CursorTop = top; Console.CursorLeft = 0; ConsoleUtils.ShowNLinesOnConsole(nbLinesToErase, ConsoleColor.Black); Console.CursorTop = top; Console.CursorLeft = 0; // // Load or analyze // IAnalysisResult analysisResultOlder, analysisResultNewer; if (analysisResultRefOlder == null) { Debug.Assert(projectOlder != null); Console.WriteLine("Analyze older version of assemblies"); analysisResultOlder = RunAnalysisShowProgressOnConsole(projectOlder); } else { Console.WriteLine("Load older analysis result"); analysisResultOlder = LoadAnalysisShowProgressOnConsole(analysisResultRefOlder); } if (analysisResultRefNewer == null) { Debug.Assert(projectNewer != null); Console.WriteLine("Analyze newer version of assemblies"); analysisResultNewer = RunAnalysisShowProgressOnConsole(projectNewer); } else { Console.WriteLine("Load newer analysis result"); analysisResultNewer = LoadAnalysisShowProgressOnConsole(analysisResultRefNewer); } // // Re-erase // var nbLinesToErase2 = Console.CursorTop - top; Console.CursorTop = top; Console.CursorLeft = 0; ConsoleUtils.ShowNLinesOnConsole(nbLinesToErase2, ConsoleColor.Black); Console.CursorTop = top; Console.CursorLeft = 0; // // Show compare description // Console.ForegroundColor = ConsoleColor.DarkGray; Console.Write("Comparing: "); Console.ForegroundColor = ConsoleColor.White; ShowAnalysisResultRefDescription(analysisResultOlder.AnalysisResultRef); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.DarkGray; Console.Write(" with: "); Console.ForegroundColor = ConsoleColor.White; ShowAnalysisResultRefDescription(analysisResultNewer.AnalysisResultRef); compareContext = analysisResultNewer.CodeBase.CreateCompareContextWithOlder(analysisResultOlder.CodeBase); return(true); }
internal static bool TryGetCompareContextDefinedByBaseline(IAnalysisResult analysisResult, out ICompareContext compareContext) { Debug.Assert(analysisResult != null); var project = analysisResult.AnalysisResultRef.Project; IAnalysisResultRef analysisResultUsedInUIRef; if (project.BaselineInUI.TryGetAnalysisResultRefToCompareWith(out analysisResultUsedInUIRef) == TryGetAnalysisResultRefToCompareWithResult.DoCompareWith) { Debug.Assert(analysisResultUsedInUIRef != null); compareContext = LoadCompareContext(analysisResultUsedInUIRef, analysisResult); return(true); } IAnalysisResultRef analysisResultUsedDuringAnalysisRef; if (project.BaselineDuringAnalysis.TryGetAnalysisResultRefToCompareWith(out analysisResultUsedDuringAnalysisRef) == TryGetAnalysisResultRefToCompareWithResult.DoCompareWith) { Debug.Assert(analysisResultUsedDuringAnalysisRef != null); compareContext = LoadCompareContext(analysisResultUsedDuringAnalysisRef, analysisResult); return(true); } compareContext = null; return(false); }
internal static bool TryGetCompareContextDefinedByBaseline(IAnalysisResult analysisResult, out ICompareContext compareContext, out string baselineDesc) { Debug.Assert(analysisResult != null); var project = analysisResult.AnalysisResultRef.Project; foreach (var projectBaseline in new[] { project.BaselineInUI, project.BaselineDuringAnalysis }) { IAnalysisResultRef analysisResultRefBaseline; if (projectBaseline.TryGetAnalysisResultRefToCompareWith(out analysisResultRefBaseline) == TryGetAnalysisResultRefToCompareWithResult.DoCompareWith) { Debug.Assert(analysisResultRefBaseline != null); baselineDesc = "Baseline computed " + ((int)(DateTime.Now - analysisResultRefBaseline.Date).TotalDays).ToString() + "d ago"; compareContext = LoadCompareContext(analysisResultRefBaseline, analysisResult); return(true); } } compareContext = null; baselineDesc = null; return(false); }