Skip to content

Reserved keywords are not escaped when used as parameter labels. #2128

Description

@alexaka1

Please do the checklist before filing an issue:

  • I have read the documentation, including the FAQ
  • I can reproduce the bug using the latest prerelease version
  • I have searched existing discussion and issue to avoid duplicates

Describe the bug
Reserved keywords, such as private are not escaped when they are used as parameter labels, such as constructor parameters

Repro
A link to a repro Gist or GitHub repository or a link to a Mapperly fork with a failing test.

Declaration code

using Riok.Mapperly.Abstractions;

namespace MapperlyReservedPropertynameBug;

[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Source)] 
public partial class Mapper
{
    public partial TargetObject Map(SourceObject source);
}

public class SourceObject
{
    public bool Private { get; set; }
}

public class TargetObject
{
    public TargetObject(string? remark = null, bool @private = false)
    {
        Remark = remark;
        Private = @private;
    }

    public bool Private { get; set; }
    
    public string? Remark { get; set; } 
}

Actual relevant generated code

// <auto-generated />
#nullable enable
namespace MapperlyReservedPropertynameBug
{
    public partial class Mapper
    {
        [global::System.CodeDom.Compiler.GeneratedCode("Riok.Mapperly", "4.3.1.0")]
        public partial global::MapperlyReservedPropertynameBug.TargetObject Map(global::MapperlyReservedPropertynameBug.SourceObject source)
        {
            var target = new global::MapperlyReservedPropertynameBug.TargetObject(private: source.Private);
            return target;
        }
    }
}

Expected relevant generated code

// <auto-generated />
#nullable enable
namespace MapperlyReservedPropertynameBug
{
    public partial class Mapper
    {
        [global::System.CodeDom.Compiler.GeneratedCode("Riok.Mapperly", "4.3.1.0")]
        public partial global::MapperlyReservedPropertynameBug.TargetObject Map(global::MapperlyReservedPropertynameBug.SourceObject source)
        {
            var target = new global::MapperlyReservedPropertynameBug.TargetObject(@private: source.Private);
            return target;
        }
    }
}

Reported relevant diagnostics

  • N/A as it's a compile error

Environment (please complete the following information):

  • Mapperly Version: 4.3.1
  • Nullable reference types: enabled
  • .NET Version: 10.0.102
  • Target Framework: net10.0
  • Compiler Version: 5.0.0-2.25612.105 (44525024)
  • C# Language Version: 14.0
  • OS: macOS 15.7.3 (24G419), Windows 11 25H2 (26200.7623)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions