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;
 }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }