benchmarksBenchmarks to analyze the performance of the generated code and the source generator itself
docsDocumentation of Mapperly
samplesSample implementations of Mappers using Mapperly
srcSource code of Mapperly
Riok.MapperlyThe source generator implementation
Riok.Mapperly.AbstractionsAbstractions and attributes to be used by the application code to configure Mapperly. This is referenced by the source generator but is not needed at runtime.
Riok.Mapperly.TemplatesTemplates of code files which are embedded as resources into
Riok.Mapperlyand may be emitted during source generation depending on enabled features.
testUnit- and integration tests of Mapperly
This describes the process implemented by Mapperly on a higher level.
For each discovered
MapperAttribute a new
DescriptorBuilder is created.
DescriptorBuilder is responsible to build a
MapperDescriptor which holds all the mappings.
DescriptorBuilder does this by following this process:
- Extracting the configuration from the attributes
- Extracting user implemented object factories
- Extracting user implemented and user defined mapping methods.
It instantiates a
UserDefinedNewInstanceMethodMapping) for each discovered mapping method and adds it to the queue of mappings to work on.
- Extracting external mappings
- For each mapping in the queue the
DescriptorBuildertries to build its implementation bodies. This is done by a so called
*MappingBodyBuilder. A mapping body builder tries to map each property from the source to the target. To do this, it asks the
DescriptorBuilderto create mappings for the according types. To create a mapping from one type to another, the
DescriptorBuilderloops through a set of
*MappingBuilders. Each of the mapping builders try to create a mapping (an
ITypeMappingimplementation) for the asked type mapping by using one approach on how to map types (eg. an explicit cast is implemented by the
ExplicitCastMappingBuilder). These mappings are queued in the queue of mappings which need the body to be built (currently body builders are only used for object to object (property-based) mappings).
SourceEmitteremits the code described by the
MapperDescriptorand all its mappings. The syntax objects are created by using
SyntaxFactoryHelpertries to simplify creating formatted syntax trees. If indentation is needed, the
SyntaxFactoryHelperinstance of the
TypeMappingBuildContextcan be used.
Roslyn multi targeting
Mapperly targets multiple Roslyn versions by building multiple NuGet packages and merging them together into a single one. Multi-targeting is needed to support new language features, such as required members introduced in C# 11, while still supporting older compiler versions.
build/package.sh for details.
To introduce support for a new roslyn version see common tasks.