/
TypeMappingKey.cs
52 lines (38 loc) · 2.11 KB
/
TypeMappingKey.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System.Diagnostics;
using Microsoft.CodeAnalysis;
using Riok.Mapperly.Descriptors.Mappings;
using Riok.Mapperly.Helpers;
namespace Riok.Mapperly.Descriptors;
[DebuggerDisplay("{Source} => {Target}")]
public readonly struct TypeMappingKey(
ITypeSymbol source,
ITypeSymbol target,
TypeMappingConfiguration? config = null,
bool includeNullability = true
)
{
private static readonly IEqualityComparer<ISymbol?> _comparer = SymbolEqualityComparer.IncludeNullability;
public TypeMappingKey(ITypeMapping mapping, TypeMappingConfiguration? config = null, bool includeNullability = true)
: this(mapping.SourceType, mapping.TargetType, config, includeNullability) { }
public ITypeSymbol Source { get; } = includeNullability ? source : source.NonNullable();
public ITypeSymbol Target { get; } = includeNullability ? target : target.NonNullable();
public TypeMappingConfiguration Configuration { get; } = config ?? TypeMappingConfiguration.Default;
public TypeMappingKey NonNullableSource() => new(Source.NonNullable(), Target, Configuration);
public TypeMappingKey NonNullableTarget() => new(Source, Target.NonNullable(), Configuration);
public TypeMappingKey NonNullable() => new(Source.NonNullable(), Target.NonNullable(), Configuration);
private bool Equals(TypeMappingKey other) =>
_comparer.Equals(Source, other.Source) && _comparer.Equals(Target, other.Target) && Configuration.Equals(other.Configuration);
public override bool Equals(object? obj) => obj is TypeMappingKey other && Equals(other);
public override int GetHashCode()
{
unchecked
{
var hashCode = _comparer.GetHashCode(Source);
hashCode = (hashCode * 397) ^ _comparer.GetHashCode(Target);
hashCode = (hashCode * 397) ^ EqualityComparer<TypeMappingConfiguration?>.Default.GetHashCode(Configuration);
return hashCode;
}
}
public static bool operator ==(TypeMappingKey left, TypeMappingKey right) => left.Equals(right);
public static bool operator !=(TypeMappingKey left, TypeMappingKey right) => !left.Equals(right);
}