Skip to content
Open
Prev Previous commit
Next Next commit
Update SpanExtensions
  • Loading branch information
Alex-Sob committed Sep 2, 2025
commit c59f00429f2e6634c223dd0feebb51a9c4274439
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ private static void CheckFlags(INamedTypeSymbol namedType, IFieldSymbol? zeroVal
EditorConfigOptionNames.AdditionalEnumNoneNames, RuleRename,
namedType.Locations[0].SourceTree!, context.Compilation).AsSpan();

foreach (var range in additionalEnumNoneNames.Split('|'))
foreach (var part in additionalEnumNoneNames.Split('|', StringSplitOptions.RemoveEmptyEntries))
{
if (additionalEnumNoneNames[range].Equals(zeroValuedField.Name, StringComparison.OrdinalIgnoreCase))
if (additionalEnumNoneNames[part].Equals(zeroValuedField.Name, StringComparison.OrdinalIgnoreCase))
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ImmutableHashSetExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\PooledHashSetExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SpanExtensions.cs" />
</ItemGroup>
<ItemGroup Condition="'$(IsTestProject)' != 'true' and '$(IsTestUtilityProject)' != 'true'">
<Compile Include="$(MSBuildThisFileDirectory)CodeMetrics\CodeAnalysisMetricData.AssemblyMetricData.cs" />
Expand Down Expand Up @@ -55,6 +54,7 @@
<Compile Include="$(MSBuildThisFileDirectory)DisposeMethodKind.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\OperationBlockAnalysisContextExtension.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SourceTextExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SpanExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\StringCompatExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\CharExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\VersionExtensions.cs" />
Expand Down
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like there's no test project for Analyzer.Utilities projects, so I'm not sure where to add unit tests.

Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,69 @@ namespace Analyzer.Utilities.Extensions;

internal static class SpanExtensions
{
public static SpanSplitEnumerator Split(this ReadOnlySpan<char> source, char separator)
public static SpanSplitEnumerator Split(this ReadOnlySpan<char> source, char separator, StringSplitOptions options = StringSplitOptions.None)
{
return new SpanSplitEnumerator(source, separator);
}

public static SpanSplitEnumerator Split(this ReadOnlySpan<char> source, ReadOnlySpan<char> separator, StringSplitOptions options = StringSplitOptions.None)
{
return new SpanSplitEnumerator(source, separator);
}

public static int Split(this ReadOnlySpan<char> source, Span<Range> destination, char separator, StringSplitOptions options = StringSplitOptions.None)
{
ReadOnlySpan<char> separatorSpan = stackalloc[] { separator };
return Split(source, destination, separatorSpan, options);
}

public static int Split(this ReadOnlySpan<char> source, Span<Range> destination, ReadOnlySpan<char> separator, StringSplitOptions options = StringSplitOptions.None)
{
if (destination.IsEmpty)
{
return 0;
}
else if (separator.IsEmpty)
{
destination[0] = 0..(source.Length - 1);
return 1;
}

var i = 0;
foreach (Range range in source.Split(separator, options))
{
destination[i++] = range;

if (i == destination.Length - 1)
{
break;
}
}

return i;
}

public ref struct SpanSplitEnumerator
{
private readonly ReadOnlySpan<char> _source;
private readonly ReadOnlySpan<char> _separatorSpan;
private readonly char _separator;
private readonly int _separatorLength;

private int _currentIndex;

internal SpanSplitEnumerator(ReadOnlySpan<char> source, char separator)
{
_source = source;
_separator = separator;
_separatorLength = 1;
}

internal SpanSplitEnumerator(ReadOnlySpan<char> source, ReadOnlySpan<char> separator)
{
_source = source;
_separatorSpan = separator;
_separatorLength = separator.Length;
}

public Range Current { get; private set; }
Expand All @@ -39,11 +86,13 @@ public bool MoveNext()
return true;
}

var index = _source[_currentIndex..].IndexOf(_separator);
var length = index >= 0 ? index : _source.Length - _currentIndex;
var slice = _source[_currentIndex..];
var index = _separatorSpan.IsEmpty ? slice.IndexOf(_separator) : slice.IndexOf(_separatorSpan);

var partLength = index >= 0 ? index : _source.Length - _currentIndex;

this.Current = new Range(_currentIndex, _currentIndex + length);
_currentIndex += length + 1;
this.Current = new Range(_currentIndex, _currentIndex + partLength);
_currentIndex += partLength + _separatorLength;

return true;
}
Expand Down
Loading