private FileDispositionStates EvaluatePath(string path)
        {
            FileDispositionStates continuationReason = FileDispositionStates.None;

            foreach (FileSourceEvaluablePathMatcher evaluator in _evaluators)
            {
                FileDispositionStates state = evaluator.Evaluate(path);

                if (state.Has(FileDispositionStates.Exclude))
                {
                    return(FileDispositionStates.Exclude);
                }
                else if (state.Has(FileDispositionStates.CopyOnly))
                {
                    if (state.Has(FileDispositionStates.Include))
                    {
                        return(FileDispositionStates.CopyOnly | FileDispositionStates.Include);
                    }

                    continuationReason = FileDispositionStates.CopyOnly;
                }
                else if (state.Has(FileDispositionStates.Include))
                {
                    if (continuationReason == FileDispositionStates.CopyOnly)
                    {
                        return(FileDispositionStates.CopyOnly | FileDispositionStates.Include);
                    }

                    return(FileDispositionStates.Include);
                }
            }

            return(FileDispositionStates.None);
        }
        public FileDispositionStates Evaluate(string path)
        {
            if (!string.Equals(path, _cachedEvaluatedPath, StringComparison.Ordinal))
            {
                _cachedStatesForFile = EvaluatePath(path);
                _cachedEvaluatedPath = path;
            }

            return(_cachedStatesForFile);
        }
        internal FileSourceHierarchicalPathMatcher(FileSourceMatchInfo matchInfo)
        {
            List <FileSourceEvaluablePathMatcher> evaluators = new List <FileSourceEvaluablePathMatcher>();

            for (int i = matchInfo.Modifiers.Count - 1; i >= 0; i--)
            {
                evaluators.Add(new FileSourceEvaluablePathMatcher(matchInfo.Modifiers[i]));
            }

            evaluators.Add(new FileSourceEvaluablePathMatcher(matchInfo.TopLevelEvaluable));
            _evaluators = evaluators;

            _cachedEvaluatedPath = string.Empty;
            _cachedStatesForFile = FileDispositionStates.None;
        }
 public FileSourceStateMatcher(FileDispositionStates checkState, FileSourceHierarchicalPathMatcher stateMatcher)
 {
     _checkState   = checkState;
     _stateMatcher = stateMatcher;
 }
 public static bool Has(this FileDispositionStates value, FileDispositionStates check)
 {
     return((value & check) == check);
 }