Example #1
0
        public static async Task <Document> FixInvocationWithParameters(Document document,
                                                                        IInvocation invocation,
                                                                        bool generateNamedParameters,
                                                                        SemanticModel semanticModel,
                                                                        IMappingSourceFinder mappingSourceFinder,
                                                                        CancellationToken cancellationToken)
        {
            var syntaxGenerator       = SyntaxGenerator.GetGenerator(document);
            var overloadParameterSets = invocation.GetOverloadParameterSets(semanticModel);

            if (overloadParameterSets != null)
            {
                var mappingContext  = new MappingContext(invocation.SourceNode, semanticModel);
                var mappingEngine   = new MappingEngine(semanticModel, syntaxGenerator);
                var parametersMatch = await MethodHelper.FindBestParametersMatch(mappingSourceFinder, overloadParameterSets, mappingContext).ConfigureAwait(false);

                if (parametersMatch != null)
                {
                    var argumentList = await parametersMatch.ToArgumentListSyntaxAsync(mappingEngine, mappingContext, generateNamedParameters).ConfigureAwait(false);

                    return(await document.ReplaceNodes(invocation.SourceNode, invocation.WithArgumentList(argumentList), cancellationToken).ConfigureAwait(false));
                }
            }

            return(document);
        }
Example #2
0
 public static MatchedParameterList FindBestParametersMatch(IMappingSourceFinder mappingSourceFinder, IEnumerable <ImmutableArray <IParameterSymbol> > overloadParameterSets)
 {
     return(overloadParameterSets.Select(x => FindArgumentsMatch(x, mappingSourceFinder))
            .Where(x => x.HasAnyMatch())
            .OrderByDescending(x => x.IsCompletlyMatched())
            .ThenByDescending(x => x.MatchedCount)
            .FirstOrDefault());
 }
        public ObjectCreationExpressionSyntax AddInitializerWithMapping(
            ObjectCreationExpressionSyntax objectCreationExpression, IMappingSourceFinder mappingSourceFinder,
            ITypeSymbol createdObjectTyp,
            MappingPath mappingPath = null)
        {
            var propertiesToSet = ObjectHelper.GetFieldsThaCanBeSetPublicly(createdObjectTyp, contextAssembly);
            var assignments     = MapUsingSimpleAssignment(syntaxGenerator, propertiesToSet, mappingSourceFinder, mappingPath);

            var initializerExpressionSyntax = SyntaxFactory.InitializerExpression(SyntaxKind.ObjectInitializerExpression, new SeparatedSyntaxList <ExpressionSyntax>().AddRange(assignments)).FixInitializerExpressionFormatting(objectCreationExpression);

            return(objectCreationExpression.WithInitializer(initializerExpressionSyntax));
        }
        private static MatchedParameterList FindArgumentsMatch(ImmutableArray <IParameterSymbol> parameters,
                                                               IMappingSourceFinder mappingSourceFinder, MappingContext mappingContext)
        {
            var matchedArgumentList = new MatchedParameterList();

            foreach (var parameter in parameters)
            {
                var mappingSource = mappingSourceFinder.FindMappingSource(parameter.Name, new AnnotatedType(parameter.Type), mappingContext);
                matchedArgumentList.AddMatch(parameter, mappingSource);
            }
            return(matchedArgumentList);
        }
        private static async Task <Document> ReplaceEmptyInitializationBlock(Document document,
                                                                             InitializerExpressionSyntax objectInitializer, SemanticModel semanticModel,
                                                                             IMappingSourceFinder mappingSourceFinder, CancellationToken cancellationToken)
        {
            var oldObjCreation    = objectInitializer.FindContainer <ObjectCreationExpressionSyntax>();
            var createdObjectType = ModelExtensions.GetTypeInfo(semanticModel, oldObjCreation).Type;
            var mappingEngine     = await MappingEngine.Create(document, cancellationToken, semanticModel.FindContextAssembly(objectInitializer));

            var newObjectCreation = mappingEngine.AddInitializerWithMapping(oldObjCreation, mappingSourceFinder, createdObjectType);

            return(await document.ReplaceNodes(oldObjCreation, newObjectCreation, cancellationToken));
        }
Example #6
0
        public static async Task <MatchedParameterList> FindBestParametersMatch(IMappingSourceFinder mappingSourceFinder, IEnumerable <ImmutableArray <IParameterSymbol> > overloadParameterSets, MappingContext mappingContext)
        {
            var matches = new List <MatchedParameterList>();

            foreach (var overloadParameterSet in overloadParameterSets)
            {
                var argumentMatch = await FindArgumentsMatch(overloadParameterSet, mappingSourceFinder, mappingContext).ConfigureAwait(false);

                if (argumentMatch.HasAnyMatch())
                {
                    matches.Add(argumentMatch);
                }
            }

            return(matches
                   .OrderByDescending(x => x.IsCompletlyMatched())
                   .ThenByDescending(x => x.MatchedCount)
                   .FirstOrDefault());
        }
 public IgnorableMappingSourceFinder(IMappingSourceFinder wrappedFinder, Func <MappingElement, bool> ignore)
 {
     this.wrappedFinder = wrappedFinder;
     this.ignore        = ignore;
 }
        public IEnumerable <ExpressionSyntax> MapUsingSimpleAssignment(SyntaxGenerator generator,
                                                                       IEnumerable <IPropertySymbol> targets, IMappingSourceFinder sourceFinder,
                                                                       MappingPath mappingPath = null, SyntaxNode globalTargetAccessor = null)
        {
            if (mappingPath == null)
            {
                mappingPath = new MappingPath();
            }

            return(targets.Select(property => new
            {
                source = sourceFinder.FindMappingSource(property.Name, property.Type),
                target = new MappingElement()
                {
                    Expression = (ExpressionSyntax)CreateAccessPropertyExpression(globalTargetAccessor, property, generator),
                    ExpressionType = property.Type
                }
            })
                   .Where(x => x.source != null)
                   .Select(pair =>
            {
                var sourceExpression = this.MapExpression(pair.source, pair.target.ExpressionType, mappingPath.Clone()).Expression;
                return (ExpressionSyntax)generator.AssignmentStatement(pair.target.Expression, sourceExpression);
            }).ToList());
        }
 public SingleSourceMatcher(IMappingSourceFinder sourceFinder)
 {
     this.sourceFinder = sourceFinder;
 }
Example #10
0
        private static MatchedParameterList FindArgumentsMatch(ImmutableArray <IParameterSymbol> parameters, IMappingSourceFinder mappingSourceFinder)
        {
            var matchedArgumentList = new MatchedParameterList();

            foreach (var parameter in parameters)
            {
                var mappingSource = mappingSourceFinder.FindMappingSource(parameter.Name, parameter.Type);
                matchedArgumentList.AddMatch(parameter, mappingSource?.Expression);
            }
            return(matchedArgumentList);
        }