public BreakingChangeDefinitionsProvider(
     IBreakingChangeDefinitions <TypeChange, TypeChangeContext> breakingTypeChanges,
     IBreakingChangeDefinitions <MethodGroupChange, MethodGroupChangeContext> breakingMethodGroupChanges,
     IBreakingChangeDefinitions <MethodChange, MethodChangeContext> breakingMethodChanges,
     IBreakingChangeDefinitions <ParameterChange, ParameterChangeContext> breakingParameterChanges)
 {
     _breakingTypeChanges        = breakingTypeChanges;
     _breakingMethodGroupChanges = breakingMethodGroupChanges;
     _breakingMethodChanges      = breakingMethodChanges;
     _breakingParameterChanges   = breakingParameterChanges;
 }
        private NextAction Visit <TChange, TChangeContext>(
            IBreakingChangeDefinitions <TChange, TChangeContext> breakingChangeDefinitions,
            TChange typeChange,
            ChangeType changeType,
            TChangeContext typeChangeContext)
        {
            ChangesResult result = EvaluateAndStoreBreakingChanges(breakingChangeDefinitions, typeChange, typeChangeContext);

            if (result == ChangesResult.NoBreakingChanges && changeType == ChangeType.Matched)
            {
                return(NextAction.VisitChildTypes);
            }

            return((StopOnFirstBreakingChange && result == ChangesResult.SomeBreakingChanges)
                                ? NextAction.Stop
                                : NextAction.VisitNextSibling);
        }
        private ChangesResult EvaluateAndStoreBreakingChanges <TChange, TChangeContext>(
            IBreakingChangeDefinitions <TChange, TChangeContext> breakingChangeDefinitions,
            TChange change,
            TChangeContext changeContext)
        {
            var breakingChanges = breakingChangeDefinitions.GetBreakingChanges(change, changeContext);

            if (StopOnFirstBreakingChange)
            {
                var breakingChange = breakingChanges.FirstOrDefault();
                if (breakingChange != null)
                {
                    _breakingChanges.Add(breakingChange);
                    return(ChangesResult.SomeBreakingChanges);
                }

                return(ChangesResult.NoBreakingChanges);
            }

            _breakingChanges.AddRange(breakingChanges);
            return(breakingChanges.Any() ? ChangesResult.SomeBreakingChanges : ChangesResult.NoBreakingChanges);
        }