Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 5 additions & 27 deletions sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation and Contributors. All Rights Reserved. Licensed under the MIT License (MIT). See License.md in the repository root for more information.

using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Expand Down Expand Up @@ -37,6 +38,7 @@ public sealed partial class PInvokeGenerator : IDisposable
private static readonly Encoding s_defaultStreamWriterEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
private static readonly string[] s_doubleColonSeparator = ["::"];
private static readonly char[] s_doubleQuoteSeparator = ['"'];
private static readonly SearchValues<char> s_qualifiedNameSeparatorChars = SearchValues.Create(".:");

private static string ExpectedClangVersion => $"version {clang.MajorVersion}.{clang.MinorVersion}";
private static string ExpectedClangSharpVersion => ExpectedClangVersion; // change if necessary
Expand Down Expand Up @@ -1773,15 +1775,7 @@ public void GenerateBindings(TranslationUnit translationUnit, string filePath, s
var addDiag = true;

var smlName = name;
var lastSeparatorIndex = smlName.LastIndexOf("::", StringComparison.Ordinal);

if (lastSeparatorIndex != -1)
{
smlName = smlName[(lastSeparatorIndex + 2)..];
addDiag = false;
}

lastSeparatorIndex = smlName.LastIndexOf('.');
var lastSeparatorIndex = smlName.LastIndexOfAny(s_qualifiedNameSeparatorChars);

if (lastSeparatorIndex != -1)
{
Expand Down Expand Up @@ -1818,15 +1812,7 @@ public void GenerateBindings(TranslationUnit translationUnit, string filePath, s
var addDiag = true;

var smlName = name;
var lastSeparatorIndex = smlName.LastIndexOf("::", StringComparison.Ordinal);

if (lastSeparatorIndex != -1)
{
smlName = smlName[(lastSeparatorIndex + 2)..];
addDiag = false;
}

lastSeparatorIndex = smlName.LastIndexOf('.');
var lastSeparatorIndex = smlName.AsSpan().LastIndexOfAny(s_qualifiedNameSeparatorChars);

if (lastSeparatorIndex != -1)
{
Expand Down Expand Up @@ -1857,15 +1843,7 @@ public void GenerateBindings(TranslationUnit translationUnit, string filePath, s
var addDiag = true;

var smlName = name;
var lastSeparatorIndex = smlName.LastIndexOf("::", StringComparison.Ordinal);

if (lastSeparatorIndex != -1)
{
smlName = smlName[(lastSeparatorIndex + 2)..];
addDiag = false;
}

lastSeparatorIndex = smlName.LastIndexOf('.');
var lastSeparatorIndex = smlName.AsSpan().LastIndexOfAny(s_qualifiedNameSeparatorChars);

if (lastSeparatorIndex != -1)
{
Expand Down
22 changes: 10 additions & 12 deletions sources/ClangSharp.PInvokeGenerator/QualifiedNameComparer.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation and Contributors. All Rights Reserved. Licensed under the MIT License (MIT). See License.md in the repository root for more information.

using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;

Expand All @@ -10,6 +11,11 @@ internal class QualifiedNameComparer : IEqualityComparer<string>, IAlternateEqua
{
public static readonly QualifiedNameComparer Default = new QualifiedNameComparer();

// A qualified name is separated by either `::` or `.`. A `:` only ever appears as part of a
// `::` pair, so scanning for the single characters `:` and `.` is equivalent to scanning for
// the `::` and `.` separators while allowing a single `IndexOfAny`/`LastIndexOfAny` pass.
private static readonly SearchValues<char> s_separatorChars = SearchValues.Create(".:");

public string Create(ReadOnlySpan<char> alternate) => alternate.ToString();

public bool Equals(ReadOnlySpan<char> alternate, string other) => Equals(alternate, other.AsSpan());
Expand Down Expand Up @@ -68,20 +74,12 @@ public int GetHashCode(ReadOnlySpan<char> alternate)
var part = alternate;
var separatorLength = 0;

var colonSeparatorIndex = part.IndexOf("::", StringComparison.Ordinal);

if (colonSeparatorIndex != -1)
{
part = part[..colonSeparatorIndex];
separatorLength = 2;
}

var dotSeparatorIndex = part.IndexOf('.');
var separatorIndex = alternate.IndexOfAny(s_separatorChars);

if (dotSeparatorIndex != -1)
if (separatorIndex != -1)
{
part = part[..dotSeparatorIndex];
separatorLength = 1;
part = alternate[..separatorIndex];
separatorLength = (alternate[separatorIndex] == ':') ? 2 : 1;
}

hashCode.Add(string.GetHashCode(part, StringComparison.Ordinal));
Expand Down
Loading