private MappingElement CreateMappingElementFromExtensionMethod(ITypeSymbol targetType, string methodName) { var sourceMethodAccessor = SyntaxFactoryExtensions.CreateMethodAccessExpression((ExpressionSyntax)sourceGlobalAccessor, sourceType.CanBeNull, methodName); return(new MappingElement() { Expression = sourceMethodAccessor, ExpressionType = new AnnotatedType(targetType) }); }
private MappingElement TryFindSource(string targetName, MappingContext mappingContext, AnnotatedType accessedVia) { //Direct 1-1 mapping var matchedSourceProperty = sourceProperties.Value .Where(x => x.Name.Equals(targetName, StringComparison.OrdinalIgnoreCase) || $"{potentialPrefix}{x.Name}".Equals(targetName, StringComparison.OrdinalIgnoreCase)) .FirstOrDefault(p => p.CanBeGet(accessedVia.Type, mappingContext)); if (matchedSourceProperty != null) { return(new MappingElement() { Expression = SyntaxFactoryExtensions.CreateMemberAccessExpression((ExpressionSyntax)sourceGlobalAccessor, accessedVia.CanBeNull, matchedSourceProperty.Name), ExpressionType = new AnnotatedType(matchedSourceProperty.Type.Type, accessedVia.CanBeNull || matchedSourceProperty.Type.CanBeNull) }); } //Non-direct (mapping like y.UserName = x.User.Name) var source = FindSubPropertySource(targetName, sourceType.Type, sourceProperties.Value, sourceGlobalAccessor, mappingContext, accessedVia.CanBeNull); if (source != null) { return(source); } //Flattening with function eg. t.Total = s.GetTotal() var matchedSourceMethod = sourceMethods.Value.Where((x => x.Name.EndsWith(targetName, StringComparison.OrdinalIgnoreCase))).FirstOrDefault(m => mappingContext.AccessibilityHelper.IsSymbolAccessible(m, accessedVia.Type)); if (matchedSourceMethod != null) { var sourceMethodAccessor = SyntaxFactoryExtensions.CreateMethodAccessExpression((ExpressionSyntax)sourceGlobalAccessor, sourceType.CanBeNull, matchedSourceMethod.Name); return(new MappingElement() { Expression = sourceMethodAccessor, ExpressionType = new AnnotatedType(matchedSourceMethod.ReturnType, sourceType.CanBeNull || matchedSourceMethod.CanBeNull()) }); } // HIGHLY SPECULATIVE: Expanding acronyms: UserName = u.Name if (string.IsNullOrWhiteSpace(potentialPrefix) == false && potentialPrefix == potentialPrefix.ToLowerInvariant() && targetName != potentialPrefix) { var acronym = GetAcronym(targetName).ToLowerInvariant(); if (acronym.StartsWith(potentialPrefix)) { var rest = acronymPattern.Split(targetName).Skip(potentialPrefix.Length); var newTarget = $"{potentialPrefix}{string.Join("", rest)}"; return(TryFindSource(newTarget, mappingContext, accessedVia)); } } return(null); }