public static Expression Process(Expression lambda, ObjectMapperData mapperData)
        {
            var targetMemberDatas = GetAllTargetMemberDatas(mapperData);

            if (targetMemberDatas.None())
            {
                return(lambda);
            }

            var finder = new EnumMappingMismatchFinder(mapperData, targetMemberDatas);

            finder.Visit(lambda);

            var assignmentReplacements = finder._assignmentsByMismatchSet
                                         .SelectMany(kvp => kvp.Value.Project(assignment => new
            {
                Assignment            = assignment,
                AssignmentWithWarning = (Expression)Expression.Block(kvp.Key.Warnings, assignment)
            }))
                                         .ToDictionary(d => d.Assignment, d => d.AssignmentWithWarning);

            var updatedLambda = lambda.Replace(assignmentReplacements);

            return(updatedLambda);
        }
 private static bool ObjectCouldHaveBeenMappedBefore(ObjectMapperData mapperData)
 {
     return(mapperData.RuleSet.Settings.AllowObjectTracking &&
            mapperData.CacheMappedObjects &&
            mapperData.TargetTypeHasBeenMappedBefore &&
            !mapperData.SourceType.IsDictionary());
 }
        private static Expression GetAlreadyMappedObjectShortCircuitOrNull(ObjectMapperData mapperData)
        {
            if (!mapperData.RuleSet.Settings.AllowObjectTracking ||
                !mapperData.CacheMappedObjects ||
                mapperData.TargetTypeHasNotYetBeenMapped ||
                mapperData.SourceType.IsDictionary())
            {
                return(null);
            }

            var tryGetMethod = typeof(IObjectMappingDataUntyped)
                               .GetPublicInstanceMethod("TryGet")
                               .MakeGenericMethod(mapperData.SourceType, mapperData.TargetType);

            var tryGetCall = Expression.Call(
                mapperData.EntryPointMapperData.MappingDataObject,
                tryGetMethod,
                mapperData.SourceObject,
                mapperData.TargetInstance);

            var ifTryGetReturn = Expression.IfThen(
                tryGetCall,
                Expression.Return(mapperData.ReturnLabelTarget, mapperData.TargetInstance));

            return(ifTryGetReturn);
        }
        public bool IsFor(ObjectMapperData mapperData)
        {
            if (mapperData.Context.IsStandalone)
            {
                // A standalone context is either the root, in which case we don't
                // check the dictionary for a matching object entry, or in a mapper
                // completing a .Map() call, in which case we already have:
                return(false);
            }

            if (!mapperData.SourceMemberIsStringKeyedDictionary(out var dictionarySourceMember))
            {
                return(false);
            }

            if (dictionarySourceMember.IsEntireDictionaryMatch)
            {
                // The dictionary has been matched to a target complex type
                // member, so should only be used to get that member's member
                // values, not a value for the member itself
                return(false);
            }

            return(dictionarySourceMember.HasObjectEntries ||
                   !dictionarySourceMember.ValueType.IsSimple());
        }
Esempio n. 5
0
        private static bool TargetIsUnmappable(ObjectMapperData mapperData)
        {
            if (!mapperData.TargetMember.IsComplex)
            {
                return(false);
            }

            if (mapperData.TargetType.GetPublicInstanceConstructor(Constants.EmptyTypeArray) != null)
            {
                return(false);
            }

            if (mapperData.DataSourcesByTargetMember.Any(ds => ds.Key.IsConstructorParameter() && ds.Value.HasValue))
            {
                return(false);
            }

            var configuredFactories = mapperData
                                      .MapperContext
                                      .UserConfigurations
                                      .QueryObjectFactories(mapperData);

            if (configuredFactories.Any())
            {
                return(false);
            }

            if (mapperData.TargetCouldBePopulated())
            {
                return(mapperData.DataSourcesByTargetMember.Values.Any(ds => !ds.HasValue));
            }

            return(true);
        }
Esempio n. 6
0
        private static bool TargetIsUnconstructable(ObjectMapperData mapperData)
        {
            if (!mapperData.TargetMember.IsComplex ||
                mapperData.TargetIsDefinitelyPopulated())
            {
                return(false);
            }

            if (mapperData.TargetType.GetPublicInstanceConstructor(Constants.EmptyTypeArray) != null)
            {
                return(false);
            }

            if (mapperData.DataSourcesByTargetMember.Any(ds => ds.Key.IsConstructorParameter() && ds.Value.HasValue))
            {
                return(false);
            }

            var configuredFactories = mapperData
                                      .MapperContext
                                      .UserConfigurations
                                      .GetObjectFactories(mapperData);

            return(configuredFactories.None());
        }
Esempio n. 7
0
 public ChildMemberMapperData(QualifiedMember targetMember, ObjectMapperData parent)
     : base(parent.SourceMember, targetMember, parent)
 {
     _useParentForTypeCheck = true;
     Parent  = parent;
     Context = new MapperDataContext(this);
 }
Esempio n. 8
0
        private static IEnumerable <TargetMemberData> EnumerateTargetMemberDatas(ObjectMapperData mapperData)
        {
            foreach (var targetMemberAndDataSource in mapperData.DataSourcesByTargetMember)
            {
                var targetMember = targetMemberAndDataSource.Key;

                if (!TargetMemberIsAnEnum(targetMember))
                {
                    continue;
                }

                var dataSources = targetMemberAndDataSource.Value
                                  .Where(dataSource => dataSource.IsValid && IsEnum(dataSource.SourceMember.Type))
                                  .ToArray();

                if (dataSources.Any())
                {
                    yield return(new TargetMemberData(targetMember, dataSources));
                }
            }

            var childTargetMembersAndDataSources = mapperData
                                                   .ChildMapperDatas
                                                   .SelectMany(EnumerateTargetMemberDatas);

            foreach (var childTargetMemberAndDataSources in childTargetMembersAndDataSources)
            {
                yield return(childTargetMemberAndDataSources);
            }
        }
 public ChildMemberMapperData(QualifiedMember targetMember, ObjectMapperData parent)
     : this(
         parent.SourceMember,
         targetMember,
         parent)
 {
 }
Esempio n. 10
0
 public override IMembersSource GetMembersSource(ObjectMapperData parentMapperData)
 {
     return(_childMemberSource ?? (_childMemberSource =
                                       new MemberLookupsChildMembersSource(
                                           parentMapperData,
                                           _targetMemberRegistrationName,
                                           _dataSourceIndex)));
 }
Esempio n. 11
0
 private EnumMappingMismatchFinder(
     ObjectMapperData mapperData,
     TargetMemberData[] targetMemberDatas)
 {
     _mapperData             = mapperData;
     _targetMemberDatas      = targetMemberDatas;
     _assignmentReplacements = new Dictionary <Expression, Expression>();
 }
Esempio n. 12
0
        public static IEnumerable <ObjectMapperData> EnumerateAllMapperDatas(this ObjectMapperData mapperData)
        {
            yield return(mapperData);

            foreach (var childMapperData in mapperData.ChildMapperDatas.SelectMany(md => md.EnumerateAllMapperDatas()))
            {
                yield return(childMapperData);
            }
        }
Esempio n. 13
0
 public MemberLookupsChildMembersSource(
     ObjectMapperData parentMapperData,
     string targetMemberRegistrationName,
     int dataSourceIndex)
 {
     _parentMapperData            = parentMapperData;
     TargetMemberRegistrationName = targetMemberRegistrationName;
     DataSourceIndex = dataSourceIndex;
 }
 public DictionaryToDictionaryPopulationLoopData(
     DictionarySourceMember sourceMember,
     ObjectMapperData mapperData)
     : base(
         mapperData.EnumerablePopulationBuilder,
         typeof(KeyValuePair <,>).MakeGenericType(sourceMember.KeyType, sourceMember.ValueType),
         mapperData.SourceObject)
 {
 }
        private EnumMappingMismatchFinder(
            ObjectMapperData mapperData,
            TargetMemberData[] targetMemberDatas)
        {
            _mapperData        = mapperData;
            _targetMemberDatas = targetMemberDatas;

            _assignmentsByMismatchSet =
                new Dictionary <EnumMappingMismatchSet, List <Expression> >(EnumMappingMismatchSet.Comparer);
        }
        public static Expression GetFinalisedReturnValue(
            this ObjectMapperData mapperData,
            Expression value,
            out bool returnsDefault)
        {
            returnsDefault = value.NodeType != ExpressionType.Goto;

            return(returnsDefault
                ? mapperData.GetReturnLabel(mapperData.GetTargetFallbackValue())
                : ((GotoExpression)value).Value);
        }
Esempio n. 17
0
        public EnumerablePopulationBuilder(ObjectMapperData mapperData)
        {
            MapperData              = mapperData;
            Context                 = new EnumerablePopulationContext(mapperData);
            _sourceItemsSelector    = new SourceItemsSelector(this);
            _sourceElementParameter = Context.SourceElementType.GetOrCreateParameter();
            TargetTypeHelper        = new EnumerableTypeHelper(mapperData.TargetMember);

            _sourceAdapter         = SourceEnumerableAdapterFactory.GetAdapterFor(this);
            _populationExpressions = new List <Expression>();
        }
Esempio n. 18
0
 public ChildMemberMapperData(IQualifiedMember sourceMember, QualifiedMember targetMember, ObjectMapperData parent)
     : base(
         parent.RuleSet,
         sourceMember.Type,
         targetMember.Type,
         sourceMember,
         targetMember,
         parent)
 {
     Parent  = parent;
     Context = new MapperDataContext(this);
 }
        public RepeatedMapperFunc(IObjectMappingData mappingData, bool lazyLoadFuncs)
        {
            if (lazyLoadFuncs)
            {
                _mappingFuncLock         = new object();
                _mapperData              = mappingData.MapperData;
                _mapperData.IsEntryPoint = true;
                return;
            }

            CreateMapperFunc(mappingData);
        }
        private static Expression GetObjectRegistrationCall(ObjectMapperData mapperData)
        {
            var registerMethod = typeof(IObjectMappingDataUntyped)
                                 .GetPublicInstanceMethod(nameof(IObjectMappingDataUntyped.Register))
                                 .MakeGenericMethod(mapperData.SourceType, mapperData.TargetType);

            return(Expression.Call(
                       mapperData.EntryPointMapperData.MappingDataObject,
                       registerMethod,
                       mapperData.SourceObject,
                       mapperData.TargetInstance));
        }
        public static void MergeTargetMemberDataSources(
            this ObjectMapperData mapperData,
            QualifiedMember targetMember,
            IDataSourceSet dataSources)
        {
            var dataSourcesByTargetMember = mapperData.DataSourcesByTargetMember;

            if (dataSourcesByTargetMember.TryGetValue(targetMember, out var registeredDataSources) &&
                registeredDataSources.HasValue)
            {
                return;
            }

            dataSourcesByTargetMember[targetMember] = dataSources;
        }
        public static ICollection <EnumMappingMismatchSet> FindMismatches(ObjectMapperData mapperData)
        {
            var targetMemberDatas = GetAllTargetMemberDatas(mapperData);

            if (targetMemberDatas.None())
            {
                return(Enumerable <EnumMappingMismatchSet> .EmptyArray);
            }

            var mismatchSets = targetMemberDatas
                               .Project(d => EnumMappingMismatchSet.For(d.TargetMember, d.DataSources, mapperData))
                               .Filter(m => m.Any)
                               .ToArray();

            return(mismatchSets);
        }
        public Expression GetMapRepeatedCallFor(
            IObjectMappingData childMappingData,
            MappingValues mappingValues,
            ObjectMapperData declaredTypeMapperData)
        {
            if (ShortCircuitRecursion(childMappingData.MapperData))
            {
                return(GetMappingShortCircuit(childMappingData));
            }

            var inlineMappingBlock = MappingFactory.GetInlineMappingBlock(
                childMappingData,
                mappingValues,
                MappingDataCreationFactory.ForChild);

            return(inlineMappingBlock);
        }
        private static Expression GetObjectRegistrationCallOrNull(ObjectMapperData mapperData)
        {
            if (mapperData.TargetTypeWillNotBeMappedAgain ||
                !mapperData.CacheMappedObjects ||
                !mapperData.RuleSet.Settings.AllowObjectTracking)
            {
                return(null);
            }

            var registerMethod = typeof(IObjectMappingDataUntyped)
                                 .GetPublicInstanceMethod(nameof(IObjectMappingDataUntyped.Register))
                                 .MakeGenericMethod(mapperData.SourceType, mapperData.TargetType);

            return(Expression.Call(
                       mapperData.EntryPointMapperData.MappingDataObject,
                       registerMethod,
                       mapperData.SourceObject,
                       mapperData.TargetInstance));
        }
Esempio n. 25
0
        public Expression GetMapRepeatedCallFor(
            IObjectMappingData mappingData,
            MappingValues mappingValues,
            ObjectMapperData declaredTypeMapperData)
        {
            var childMapperData = mappingData.MapperData;

            if (WillNotMap(childMapperData))
            {
                return(Constants.EmptyExpression);
            }

            childMapperData.CacheMappedObjects = true;

            childMapperData.RegisterRepeatedMapperFunc(mappingData);

            var mapRepeatedCall = declaredTypeMapperData.GetMapRepeatedCall(
                childMapperData.TargetMember,
                mappingValues,
                mappingValues.DataSourceIndex);

            return(mapRepeatedCall);
        }
 public RootMapperMappingPlanFunction(IObjectMapper mapper)
 {
     _mapperData = mapper.MapperData;
     _mapping    = mapper.GetMappingLambda();
 }
Esempio n. 27
0
 private static Expression GetReturnMappingResultExpression(ObjectMapperData mapperData, Expression mapping)
 => Return(mapperData.ReturnLabelTarget, mapping, mapperData.TargetType);
 private bool TryGetShortCircuitFactory(ObjectMapperData mapperData, out ISourceShortCircuitFactory applicableFactory)
 => _shortCircuitFactories.TryFindMatch(f => f.IsFor(mapperData), out applicableFactory);
Esempio n. 29
0
 public static void Validate(ObjectMapperData mapperData)
 {
     VerifyMappingPlanIsComplete(GetAllMapperDatas(new[] { mapperData }));
 }
 public ElementMembersSource(ObjectMapperData enumerableMapperData)
 {
     _enumerableMapperData = enumerableMapperData;
 }