File: PatternMatching\CamelCaseResult.cs
Web Access
Project: src\src\Workspaces\Core\Portable\Microsoft.CodeAnalysis.Workspaces.csproj (Microsoft.CodeAnalysis.Workspaces)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System.Diagnostics;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Collections;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.CodeAnalysis.PatternMatching;
 
internal abstract partial class PatternMatcher
{
    private readonly struct CamelCaseResult
    {
        public readonly bool FromStart;
        public readonly bool Contiguous;
        public readonly int MatchCount;
        public readonly ArrayBuilder<TextSpan> MatchedSpansInReverse;
 
        public CamelCaseResult(bool fromStart, bool contiguous, int matchCount, ArrayBuilder<TextSpan> matchedSpansInReverse)
        {
            FromStart = fromStart;
            Contiguous = contiguous;
            MatchCount = matchCount;
            MatchedSpansInReverse = matchedSpansInReverse;
 
            Debug.Assert(matchedSpansInReverse == null || matchedSpansInReverse.Count == matchCount);
        }
 
        public void Free()
            => MatchedSpansInReverse?.Free();
 
        public CamelCaseResult WithFromStart(bool fromStart)
            => new(fromStart, Contiguous, MatchCount, MatchedSpansInReverse);
 
        public CamelCaseResult WithAddedMatchedSpan(TextSpan value)
        {
            MatchedSpansInReverse?.Add(value);
            return new CamelCaseResult(FromStart, Contiguous, MatchCount + 1, MatchedSpansInReverse);
        }
    }
 
    private static PatternMatchKind GetCamelCaseKind(CamelCaseResult result, in TemporaryArray<TextSpan> candidateHumps)
    {
        var toEnd = result.MatchCount == candidateHumps.Count;
        if (result.FromStart)
        {
            if (result.Contiguous)
            {
                // We contiguously matched humps from the start of this candidate.  If we 
                // matched all the humps, then this was an exact match, otherwise it was a 
                // contiguous prefix match
                return toEnd
                    ? PatternMatchKind.CamelCaseExact
                    : PatternMatchKind.CamelCasePrefix;
            }
            else
            {
                return PatternMatchKind.CamelCaseNonContiguousPrefix;
            }
        }
        else
        {
            // We didn't match from the start.  Distinguish between a match whose humps are all
            // contiguous, and one that isn't.
            return result.Contiguous
                ? PatternMatchKind.CamelCaseSubstring
                : PatternMatchKind.CamelCaseNonContiguousSubstring;
        }
    }
}