diff --git a/src/MemoryPack.Generator/Extensions.cs b/src/MemoryPack.Generator/Extensions.cs index c4a2de1..b9a1dad 100644 --- a/src/MemoryPack.Generator/Extensions.cs +++ b/src/MemoryPack.Generator/Extensions.cs @@ -291,4 +291,22 @@ public static bool ContainsConstructorParameter(this IEnumerable mem members.Any(x => x.IsConstructorParameter && string.Equals(constructorParameter.Name, x.ConstructorParameterName, StringComparison.OrdinalIgnoreCase)); + + public static bool TryGetConstructorMember(this IEnumerable members, IParameterSymbol constructorParameter, out MemberMeta? member) + { + member = members.FirstOrDefault(m => + { + if (EqualsConstructorParameter(constructorParameter, m.Name)) return true; + if (m.Name.StartsWith(UnderScorePrefix)) + { + return EqualsConstructorParameter(constructorParameter, m.Name.Substring(UnderScorePrefix.Length)); + } + + return false; + }); + + return member != null; + + static bool EqualsConstructorParameter(IParameterSymbol constructorParameter, string name) => constructorParameter.Name.Equals(name, StringComparison.OrdinalIgnoreCase); + } } diff --git a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs index 0806cd1..5093fcb 100644 --- a/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs +++ b/src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs @@ -104,9 +104,21 @@ public TypeMeta(INamedTypeSymbol symbol, ReferenceSymbols reference) } return true; }) - .Select((x, i) => new MemberMeta(x, Constructor, reference, i)) + .Select((x, i) => new MemberMeta(x, reference, i)) .OrderBy(x => x.Order) - .ToArray(); + .ToArray(); + + if (this.Constructor != null) + { + foreach (var parameter in this.Constructor.Parameters) + { + if (this.Members.TryGetConstructorMember(parameter, out var member)) + { + member!.IsConstructorParameter = true; + member!.ConstructorParameterName = parameter.Name; + } + } + } this.IsValueType = symbol.IsValueType; this.IsUnmanagedType = symbol.IsUnmanagedType; @@ -621,8 +633,8 @@ partial class MemberMeta public bool IsProperty { get; } public bool IsSettable { get; } public bool IsAssignable { get; } - public bool IsConstructorParameter { get; } - public string? ConstructorParameterName { get; } + public bool IsConstructorParameter { get; set; } + public string? ConstructorParameterName { get; set; } public int Order { get; } public bool HasExplicitOrder { get; } public MemberKind Kind { get; } @@ -637,7 +649,7 @@ partial class MemberMeta this.Kind = MemberKind.Blank; } - public MemberMeta(ISymbol symbol, IMethodSymbol? constructor, ReferenceSymbols references, int sequentialOrder) + public MemberMeta(ISymbol symbol, ReferenceSymbols references, int sequentialOrder) { this.Symbol = symbol; this.Name = symbol.Name; @@ -655,16 +667,6 @@ public MemberMeta(ISymbol symbol, IMethodSymbol? constructor, ReferenceSymbols r this.HasExplicitOrder = false; } - if (constructor != null) - { - this.IsConstructorParameter = constructor.TryGetConstructorParameter(symbol, out var constructorParameter); - this.ConstructorParameterName = constructorParameter?.Name; - } - else - { - this.IsConstructorParameter = false; - } - if (symbol is IFieldSymbol f) { IsProperty = false;