diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj b/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj
index 5de359581e78..9347cb140728 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj
@@ -30,7 +30,6 @@
-
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs
index 62ac55aa45ab..d23fef4e026d 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -41,10 +42,10 @@ public virtual bool Equals(
///
public virtual int GetHashCode(AllowedChildTagDescriptor descriptor)
{
- var hash = new HashCode();
- hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(descriptor.Name, StringComparer.Ordinal);
- return hash.ToHashCode();
+ return hash.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs
index 2ee4ccc9496b..bbf14ad2f344 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -55,12 +56,12 @@ public int GetHashCode(BoundAttributeDescriptor descriptor)
throw new ArgumentNullException(nameof(descriptor));
}
- var hash = new HashCode();
- hash.Add(descriptor.Kind ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(descriptor.Kind, StringComparer.Ordinal);
+ hash.Add(descriptor.Name, StringComparer.Ordinal);
hash.Add(descriptor.IsEditorRequired);
- hash.Add(descriptor.TypeName ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.Documentation ?? string.Empty, StringComparer.Ordinal);
+ hash.Add(descriptor.TypeName, StringComparer.Ordinal);
+ hash.Add(descriptor.Documentation, StringComparer.Ordinal);
if (descriptor.BoundAttributeParameters != null)
{
@@ -88,7 +89,7 @@ public int GetHashCode(BoundAttributeDescriptor descriptor)
}
}
- return hash.ToHashCode();
+ return hash.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs
index 5e9244291f07..ace60ba9b178 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -49,13 +50,13 @@ public virtual int GetHashCode(BoundAttributeParameterDescriptor descriptor)
throw new ArgumentNullException(nameof(descriptor));
}
- var hash = new HashCode();
- hash.Add(descriptor.Kind ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.TypeName ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(descriptor.Kind, StringComparer.Ordinal);
+ hash.Add(descriptor.Name, StringComparer.Ordinal);
+ hash.Add(descriptor.TypeName, StringComparer.Ordinal);
hash.Add(descriptor.Metadata?.Count);
- return hash.ToHashCode();
+ return hash.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs
index 2648768238fb..d85fb7fb29c0 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs
@@ -3,6 +3,7 @@
using System;
using System.Globalization;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
@@ -61,7 +62,11 @@ public bool Equals(LinePragma other)
public override int GetHashCode()
{
- return HashCode.Combine(StartLineIndex, LineCount, FilePath);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(StartLineIndex);
+ hash.Add(LineCount);
+ hash.Add(FilePath);
+ return hash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs
index b4093737ac22..6e20b1febfbf 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs
@@ -1,7 +1,8 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -68,7 +69,7 @@ public override bool Equals(RazorDiagnostic obj)
public override int GetHashCode()
{
- var hash = new HashCode();
+ var hash = HashCodeCombiner.Start();
hash.Add(Descriptor.GetHashCode());
hash.Add(Span.GetHashCode());
@@ -77,7 +78,7 @@ public override int GetHashCode()
hash.Add(Args[i]);
}
- return hash.ToHashCode();
+ return hash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs
index 67c954996af6..f248d476c28c 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -38,8 +39,8 @@ public int GetHashCode(DirectiveDescriptor descriptor)
throw new ArgumentNullException(nameof(descriptor));
}
- var hash = new HashCode();
- hash.Add(descriptor.Directive ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(descriptor.Directive, StringComparer.Ordinal);
hash.Add(descriptor.Kind);
if (descriptor.Tokens != null)
@@ -50,7 +51,7 @@ public int GetHashCode(DirectiveDescriptor descriptor)
}
}
- return hash.ToHashCode();
+ return hash.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs
index 6ea1f78b3234..21c46af440aa 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -33,7 +34,11 @@ public int GetHashCode(DirectiveTokenDescriptor descriptor)
throw new ArgumentNullException(nameof(descriptor));
}
- return HashCode.Combine(descriptor.Kind, descriptor.Optional ? 1 : 0);
+ var hashCodeCombiner = HashCodeCombiner.Start();
+ hashCodeCombiner.Add(descriptor.Kind);
+ hashCodeCombiner.Add(descriptor.Optional ? 1 : 0);
+
+ return hashCodeCombiner.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/HashCodeCombiner.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/HashCodeCombiner.cs
new file mode 100644
index 000000000000..40bd228b4a18
--- /dev/null
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/HashCodeCombiner.cs
@@ -0,0 +1,59 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#nullable enable
+
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace Microsoft.Extensions.Internal
+{
+ internal struct HashCodeCombiner
+ {
+ private long _combinedHash64;
+
+ public int CombinedHash
+ {
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ get { return _combinedHash64.GetHashCode(); }
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private HashCodeCombiner(long seed)
+ {
+ _combinedHash64 = seed;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static implicit operator int(HashCodeCombiner self)
+ {
+ return self.CombinedHash;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void Add(int i)
+ {
+ _combinedHash64 = ((_combinedHash64 << 5) + _combinedHash64) ^ i;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void Add(T? o)
+ {
+ Add(o?.GetHashCode() ?? 0);
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void Add(TValue value, IEqualityComparer comparer)
+ {
+ var hashCode = value != null ? comparer.GetHashCode(value) : 0;
+ Add(hashCode);
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static HashCodeCombiner Start()
+ {
+ return new HashCodeCombiner(0x1505L);
+ }
+ }
+}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs
index d2e6ad31c802..f5c21110589f 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -49,14 +50,14 @@ public override bool Equals(object obj)
///
public override int GetHashCode()
{
- var combiner = new HashCode();
+ var combiner = HashCodeCombiner.Start();
combiner.Add(base.GetHashCode());
- combiner.Add(LookupText ?? string.Empty, StringComparer.Ordinal);
- combiner.Add(DirectiveText ?? string.Empty, StringComparer.Ordinal);
- combiner.Add(TypePattern ?? string.Empty, StringComparer.Ordinal);
- combiner.Add(AssemblyName ?? string.Empty, StringComparer.Ordinal);
+ combiner.Add(LookupText, StringComparer.Ordinal);
+ combiner.Add(DirectiveText, StringComparer.Ordinal);
+ combiner.Add(TypePattern, StringComparer.Ordinal);
+ combiner.Add(AssemblyName, StringComparer.Ordinal);
- return combiner.ToHashCode();
+ return combiner.CombinedHash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs
index a97acb57a1c3..099d597c3c32 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.Language.Syntax;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -59,7 +60,11 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
// Hash code should include only immutable properties but Equals also checks the type.
- return HashCode.Combine(TypeHashCode, AutoCompleteAtEndOfSpan);
+ var hashCodeCombiner = HashCodeCombiner.Start();
+ hashCodeCombiner.Add(TypeHashCode);
+ hashCodeCombiner.Add(AutoCompleteAtEndOfSpan);
+
+ return hashCodeCombiner.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs
index 6a0e637ce3ff..cfad3f519741 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs
@@ -3,6 +3,7 @@
using System;
using System.Text;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -26,7 +27,11 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
- return HashCode.Combine(base.GetHashCode(), Type);
+ var combiner = HashCodeCombiner.Start();
+ combiner.Add(base.GetHashCode());
+ combiner.Add(Type);
+
+ return combiner.CombinedHash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs
index d06767471a8b..5da6839c3107 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs
@@ -8,6 +8,7 @@
using System.IO;
using System.Linq;
using Microsoft.AspNetCore.Razor.Language.Syntax;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -53,7 +54,10 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
// Hash code should include only immutable properties and base has none.
- return HashCode.Combine(AcceptTrailingDot);
+ var hashCodeCombiner = HashCodeCombiner.Start();
+ hashCodeCombiner.Add(AcceptTrailingDot);
+
+ return hashCodeCombiner;
}
protected override PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change)
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs
index a0f41a6b5ded..aafadca37850 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs
@@ -1,8 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Globalization;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -33,7 +33,12 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
- return HashCode.Combine(Prefix, Value);
+ var hashCodeCombiner = HashCodeCombiner.Start();
+
+ hashCodeCombiner.Add(Prefix);
+ hashCodeCombiner.Add(Value);
+
+ return hashCodeCombiner;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs
index 5e91dbcdca62..911e30a1f27a 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs
@@ -4,6 +4,7 @@
using System;
using System.Diagnostics;
using System.Globalization;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -44,7 +45,11 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
- return HashCode.Combine(Location, Value);
+ var hashCodeCombiner = HashCodeCombiner.Start();
+ hashCodeCombiner.Add(Location);
+ hashCodeCombiner.Add(Value);
+
+ return hashCodeCombiner.CombinedHash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs
index 45bedb76a553..d5bdab8956b2 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -49,14 +50,14 @@ public override bool Equals(object obj)
///
public override int GetHashCode()
{
- var combiner = new HashCode();
+ var combiner = HashCodeCombiner.Start();
combiner.Add(base.GetHashCode());
- combiner.Add(LookupText ?? string.Empty, StringComparer.Ordinal);
- combiner.Add(DirectiveText ?? string.Empty, StringComparer.Ordinal);
- combiner.Add(TypePattern ?? string.Empty, StringComparer.Ordinal);
- combiner.Add(AssemblyName ?? string.Empty, StringComparer.Ordinal);
+ combiner.Add(LookupText, StringComparer.Ordinal);
+ combiner.Add(DirectiveText, StringComparer.Ordinal);
+ combiner.Add(TypePattern, StringComparer.Ordinal);
+ combiner.Add(AssemblyName, StringComparer.Ordinal);
- return combiner.ToHashCode();
+ return combiner.CombinedHash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
index b9f764fc6580..c4c95eef6fec 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
@@ -36,12 +37,12 @@ public override bool Equals(object obj)
///
public override int GetHashCode()
{
- var combiner = new HashCode();
+ var combiner = HashCodeCombiner.Start();
combiner.Add(base.GetHashCode());
- combiner.Add(Prefix ?? string.Empty, StringComparer.Ordinal);
- combiner.Add(DirectiveText ?? string.Empty, StringComparer.Ordinal);
+ combiner.Add(Prefix, StringComparer.Ordinal);
+ combiner.Add(DirectiveText, StringComparer.Ordinal);
- return combiner.ToHashCode();
+ return combiner.CombinedHash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj
index 720bd57edee7..527d2cae4326 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj
@@ -8,8 +8,4 @@
false
-
-
-
-
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs
index 38daf1f0154a..ff83b7b6e7cf 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs
@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -93,7 +94,7 @@ public virtual bool Equals(RazorConfiguration other)
public override int GetHashCode()
{
- var hash = new HashCode();
+ var hash = HashCodeCombiner.Start();
hash.Add(LanguageVersion);
hash.Add(ConfigurationName);
@@ -102,7 +103,7 @@ public override int GetHashCode()
hash.Add(Extensions[i].ExtensionName);
}
- return hash.ToHashCode();
+ return hash;
}
private class DefaultRazorConfiguration : RazorConfiguration
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs
index 59cfb80fe048..27ea3c8ac125 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -54,11 +55,11 @@ public virtual int GetHashCode(RequiredAttributeDescriptor descriptor)
throw new ArgumentNullException(nameof(descriptor));
}
- var hash = new HashCode();
- hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.Value ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(descriptor.Name, StringComparer.Ordinal);
+ hash.Add(descriptor.Value, StringComparer.Ordinal);
- return hash.ToHashCode();
+ return hash.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs
index da6431b81dc3..ed62081ceb3a 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs
@@ -4,6 +4,7 @@
using System;
using Microsoft.AspNetCore.Razor.Language.Legacy;
using Microsoft.AspNetCore.Razor.Language.Syntax;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -124,10 +125,10 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
- var hash = new HashCode();
+ var hash = HashCodeCombiner.Start();
hash.Add(Span);
- hash.Add(NewText ?? string.Empty, StringComparer.Ordinal);
- return hash.ToHashCode();
+ hash.Add(NewText, StringComparer.Ordinal);
+ return hash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs
index 18ece35e437a..78500238e80e 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs
@@ -3,6 +3,7 @@
using System;
using System.Globalization;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -105,11 +106,11 @@ public override bool Equals(object obj)
///
public override int GetHashCode()
{
- var hashCode = new HashCode();
- hashCode.Add(FilePath ?? string.Empty, StringComparer.Ordinal);
- hashCode.Add(AbsoluteIndex);
+ var hashCodeCombiner = HashCodeCombiner.Start();
+ hashCodeCombiner.Add(FilePath, StringComparer.Ordinal);
+ hashCodeCombiner.Add(AbsoluteIndex);
- return hashCode.ToHashCode();
+ return hashCodeCombiner;
}
///
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs
index 3698f9d51117..a775f7bc7b63 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs
@@ -3,6 +3,7 @@
using System;
using System.Globalization;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -37,7 +38,11 @@ public bool Equals(SourceMapping other)
public override int GetHashCode()
{
- return HashCode.Combine(OriginalSpan, GeneratedSpan);
+ var hashCodeCombiner = HashCodeCombiner.Start();
+ hashCodeCombiner.Add(OriginalSpan);
+ hashCodeCombiner.Add(GeneratedSpan);
+
+ return hashCodeCombiner;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs
index 7580df94e8c2..68324c03d6db 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs
@@ -3,6 +3,7 @@
using System;
using System.Globalization;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -72,14 +73,14 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
- var hash = new HashCode();
- hash.Add(FilePath ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(FilePath, StringComparer.Ordinal);
hash.Add(AbsoluteIndex);
hash.Add(LineIndex);
hash.Add(CharacterIndex);
hash.Add(Length);
- return hash.ToHashCode();
+ return hash;
}
public override string ToString()
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs
index 88e9a678ca6b..b97c498f0953 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs
@@ -4,6 +4,7 @@
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor
{
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs
index ffaefb05b1da..fdff42f277e5 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs
@@ -6,6 +6,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Syntax
{
@@ -570,7 +571,10 @@ public override int GetHashCode()
return 0;
}
- return HashCode.Combine(_node.GetHashCode(), _count);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(_node.GetHashCode());
+ hash.Add(_count);
+ return hash.CombinedHash;
}
public override bool Equals(object obj)
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs
index bf032cc492e9..e38470fabec9 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs
@@ -7,6 +7,7 @@
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Syntax
{
@@ -448,7 +449,10 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
- return HashCode.Combine(Node, Index);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(Node);
+ hash.Add(Index);
+ return hash.CombinedHash;
}
///
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs
index e18a4f9f58b9..89da86a82ca1 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language.Syntax
{
@@ -228,7 +229,11 @@ public override bool Equals(object obj)
///
public override int GetHashCode()
{
- return HashCode.Combine(Start, Length);
+ var combiner = HashCodeCombiner.Start();
+ combiner.Add(Start);
+ combiner.Add(Length);
+
+ return combiner.CombinedHash;
}
///
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs
index 048c8c8896a2..caad339ef70e 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -115,11 +116,11 @@ public int GetHashCode(TagHelperDescriptor descriptor)
throw new ArgumentNullException(nameof(descriptor));
}
- var hash = new HashCode();
- hash.Add(descriptor.Kind ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.AssemblyName ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal);
- hash.Add(descriptor.DisplayName ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(descriptor.Kind, StringComparer.Ordinal);
+ hash.Add(descriptor.AssemblyName, StringComparer.Ordinal);
+ hash.Add(descriptor.Name, StringComparer.Ordinal);
+ hash.Add(descriptor.DisplayName, StringComparer.Ordinal);
hash.Add(descriptor.CaseSensitive ? 1 : 0);
if (descriptor.BoundAttributes != null)
@@ -161,21 +162,21 @@ public int GetHashCode(TagHelperDescriptor descriptor)
{
foreach (var kvp in metadata)
{
- hash.Add(kvp.Key ?? string.Empty, StringComparer.Ordinal);
- hash.Add(kvp.Value ?? string.Empty, StringComparer.Ordinal);
+ hash.Add(kvp.Key, StringComparer.Ordinal);
+ hash.Add(kvp.Value, StringComparer.Ordinal);
}
}
else
{
foreach (var kvp in descriptor.Metadata)
{
- hash.Add(kvp.Key ?? string.Empty, StringComparer.Ordinal);
- hash.Add(kvp.Value ?? string.Empty, StringComparer.Ordinal);
+ hash.Add(kvp.Key, StringComparer.Ordinal);
+ hash.Add(kvp.Value, StringComparer.Ordinal);
}
}
}
- return hash.ToHashCode();
+ return hash.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs
index 05b16bc141f4..b711b580db02 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Razor.Language
{
@@ -45,9 +46,9 @@ public virtual int GetHashCode(TagMatchingRuleDescriptor rule)
throw new ArgumentNullException(nameof(rule));
}
- var hash = new HashCode();
- hash.Add(rule.TagName ?? string.Empty, StringComparer.Ordinal);
- hash.Add(rule.ParentTag ?? string.Empty, StringComparer.Ordinal);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(rule.TagName, StringComparer.Ordinal);
+ hash.Add(rule.ParentTag, StringComparer.Ordinal);
if (rule.Attributes != null)
{
@@ -57,7 +58,7 @@ public virtual int GetHashCode(TagMatchingRuleDescriptor rule)
}
}
- return hash.ToHashCode();
+ return hash.CombinedHash;
}
}
}
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs
new file mode 100644
index 000000000000..9bb7c0820ebd
--- /dev/null
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Xunit;
+
+namespace Microsoft.Extensions.Internal
+{
+ public class HashCodeCombinerTest
+ {
+ [Fact]
+ public void GivenTheSameInputs_ItProducesTheSameOutput()
+ {
+ var hashCode1 = HashCodeCombiner.Start();
+ var hashCode2 = HashCodeCombiner.Start();
+
+ hashCode1.Add(42);
+ hashCode1.Add("foo");
+ hashCode2.Add(42);
+ hashCode2.Add("foo");
+
+ Assert.Equal(hashCode1.CombinedHash, hashCode2.CombinedHash);
+ }
+
+ [Fact]
+ public void HashCode_Is_OrderSensitive()
+ {
+ var hashCode1 = HashCodeCombiner.Start();
+ var hashCode2 = HashCodeCombiner.Start();
+
+ hashCode1.Add(42);
+ hashCode1.Add("foo");
+
+ hashCode2.Add("foo");
+ hashCode2.Add(42);
+
+ Assert.NotEqual(hashCode1.CombinedHash, hashCode2.CombinedHash);
+ }
+ }
+}
diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs
index 042dab55098f..de60d10371f2 100644
--- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs
+++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs
@@ -1,8 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Collections.Generic;
+using Microsoft.Extensions.Internal;
namespace Microsoft.CodeAnalysis.Razor
{
@@ -39,10 +40,10 @@ public override int GetHashCode(AssemblyIdentity obj)
return 0;
}
- var hash = new HashCode();
- hash.Add(obj.Name ?? string.Empty, StringComparer.OrdinalIgnoreCase);
+ var hash = HashCodeCombiner.Start();
+ hash.Add(obj.Name, StringComparer.OrdinalIgnoreCase);
hash.Add(obj.Version);
- return hash.ToHashCode();
+ return hash;
}
}
}
diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj b/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj
index ee62e1a7b545..b158473bde4f 100644
--- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj
+++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj
@@ -12,6 +12,5 @@
-