/// <summary>
        /// Synchronously runs validation on all of the configured areas.
        /// </summary>
        public void Run()
        {
            if (_projectAssetValidatorManager != null)
            {
                _projectAssetValidatorManager.Search();
                _projectAssetValidatorManager.ValidateAll();
            }

            while (HasScenesToSearch())
            {
                _currentScenePath = _scenePaths[_sceneProgress];

                // Only load the next scene if we are not already in it
                if (SceneManager.GetActiveScene().path != _currentScenePath)
                {
                    EditorSceneManager.OpenScene(_currentScenePath);
                }

                var activeSceneManager = new ActiveSceneValidatorManager(_cache, _logCache);
                activeSceneManager.Search();
                activeSceneManager.ValidateAll();

                _crossSceneValidatorManager?.Search();

                ++_sceneProgress;
            }

            _crossSceneValidatorManager?.ValidateAll();

            _isRunning = true;
        }
        /// <summary>
        /// Runs a synchronous step of scene validation (cross and/or active if enabled).
        /// </summary>
        private void ContinueSceneValidation()
        {
            if (!HasScenesToSearch())
            {
                if (_crossSceneValidatorManager == null)
                {
                    return;
                }

                _mode = Mode.CrossScene;

                if (_crossSceneValidatorManager.ContinueValidation())
                {
                    if (ProjectTools.IsDebugging)
                    {
                        Debug.LogFormat(
                            CrossSceneValidationProgressFormat,
                            _crossSceneValidatorManager.GetProgress());
                    }
                }
                else
                {
                    if (ProjectTools.IsDebugging)
                    {
                        Debug.LogFormat(CrossSceneValidationCompleted);
                    }
                }

                return;
            }

            if (_activeSceneValidatorManager == null)
            {
                _currentScenePath = _scenePaths[_sceneProgress];

                // Only load the next scene if we are not already in it
                if (SceneManager.GetActiveScene().path != _currentScenePath)
                {
                    EditorSceneManager.OpenScene(_currentScenePath);
                }

                _activeSceneValidatorManager = new ActiveSceneValidatorManager(_cache, _logCache);
                _activeSceneValidatorManager.Search();

                _crossSceneValidatorManager?.Search();
            }

            _mode = Mode.ActiveScene;

            if (_activeSceneValidatorManager.ContinueValidation())
            {
                if (ProjectTools.IsDebugging)
                {
                    Debug.LogFormat(
                        SceneValidationProgressFormat,
                        _activeSceneValidatorManager.GetProgress(),
                        _sceneProgress,
                        _scenePaths.Count,
                        _currentScenePath);
                }
            }
            else
            {
                if (ProjectTools.IsDebugging)
                {
                    Debug.LogFormat(
                        ScenesValidationProgressFormat,
                        _sceneProgress,
                        _scenePaths.Count,
                        _currentScenePath);
                }

                _sceneProgress++;

                _activeSceneValidatorManager = null;
            }
        }