Esempio n. 1
0
 public static string GetPropertyNameFromMethodName(string methodName)
 {
     return(SpecificationMethods.GetPropertyNameFromMethodName(methodName));
 }
Esempio n. 2
0
        public override void VisitInvocationExpression(InvocationExpressionSyntax node)
        {
            var methodSymbol = (MethodSymbol)_semanticModel.GetSymbolInfo(node).Symbol;

            if (methodSymbol == null || !(methodSymbol.IsStatic || _specificationsElements.GetSpecificationEquivalentMethod(ref methodSymbol) || methodSymbol.ContainingNamespace.ToString() == "System.Linq"))
            {
                return;
            }
            var argumentExpressions    = node.ArgumentList.Arguments.Select(a => a.Expression).ToList();
            var memberAccessExpression = node.Expression as MemberAccessExpressionSyntax;

            if (memberAccessExpression != null && (_semanticModel.GetSymbolInfo(memberAccessExpression.Expression).Symbol as ITypeSymbol) == null)
            {
                argumentExpressions.Insert(0, memberAccessExpression.Expression);
            }
            string methodSymbolString = methodSymbol.ToString();
            MethodDeclarationSyntax method;

            if (_methodPerMethodSymbols.TryGetValue(methodSymbolString, out method))
            {
                if (_alreadyCalledMethods.Contains(methodSymbol))
                {
                    if (++_failed > MaxFailed)
                    {
                        return;
                    }
                }
                else
                {
                    _alreadyCalledMethods.Add(methodSymbol);
                }
                if (_getMethods.Values.SelectMany(m => m).Contains(method))
                {
                    var membersVisitor = new GetMembersVisitor(this);
                    membersVisitor.Visit(argumentExpressions[0]);
                    AddProperties(membersVisitor._properties);
                    AddProperty(new List <PropertySymbolInfo>(LastOrDefault(membersVisitor._properties.Dependences))
                    {
                        new PropertySymbolInfo(TypeSymbolInfo.Get(methodSymbol.ReturnType),
                                               SpecificationMethods.GetPropertyNameFromMethod(method), TypeSymbolInfo.Get(methodSymbol.Parameters[0].Type),
                                               method)
                    });
                }
                else
                {
                    var variables = new Dictionary <string, PropertyDependence>();
                    int index     = 0;
                    foreach (var argumentExpression in argumentExpressions)
                    {
                        var membersVisitor = new GetMembersVisitor(this);
                        membersVisitor.Visit(argumentExpression);
                        AddProperties(membersVisitor._properties);
                        if (membersVisitor._properties.Dependences.GroupBy(p => p.Count).All(g => g.Count() == 1))
                        {
                            variables.Add(methodSymbol.Parameters[index].Name, membersVisitor._properties);
                        }
                        index++;
                    }
                    {
                        var semanticModel  = _semanticModelPerMethods[method];
                        var membersVisitor = new GetMembersVisitor(semanticModel, _specificationsElements,
                                                                   _serverFxDALInterfacesNamespace, _semanticModelPerMethods, _methodPerMethodSymbols,
                                                                   _getMethods, _extensionMethods, variables, _fromVariables, _linqIndex, _alreadyCalledMethods,
                                                                   _definePropertyDependences, _failed);
                        membersVisitor._returnProperties = new PropertyDependence();
                        membersVisitor.Visit(method.Body);
                        AddProperties(membersVisitor._properties);
                        if (!(membersVisitor._returnProperties.Dependences.Count == 0 && membersVisitor._returnProperties.PropertiesDependences.Count == 0))
                        {
                            _properties.Last = membersVisitor._returnProperties;
                        }
                        _proceed = true;
                    }
                }
            }
            else
            {
                if (methodSymbol.ContainingNamespace.ToString() == "System.Linq")
                {
                    var membersVisitor = new GetMembersVisitor(this);
                    membersVisitor.Visit(argumentExpressions[0]);
                    if (membersVisitor._properties.Last != null)
                    {
                        _properties.Last = membersVisitor._properties.Last;
                    }
                    AddProperties(membersVisitor._properties);
                    Action <int, Action <PropertyDependence> > visitLambda = (argumentIndex, addProperties) =>
                    {
                        var lambdaExpression = argumentExpressions[argumentIndex] as SimpleLambdaExpressionSyntax;
                        if (lambdaExpression != null)
                        {
                            var variables = new Dictionary <string, PropertyDependence>(_variables);
                            if (!variables.ContainsKey(lambdaExpression.Parameter.Identifier.ValueText))
                            {
                                variables.Add(lambdaExpression.Parameter.Identifier.ValueText, _properties);
                            }
                            else
                            {
                                variables[lambdaExpression.Parameter.Identifier.ValueText] = _properties;
                            }
                            membersVisitor = new GetMembersVisitor(this, variables);
                            membersVisitor._returnProperties = null;
                            membersVisitor.Visit(lambdaExpression.Body);
                            addProperties(membersVisitor._properties);
                            _proceed = true;
                        }
                    };
                    switch (argumentExpressions.Count)
                    {
                    case 1:
                        _properties.Last = membersVisitor._properties.Last;
                        _proceed         = true;
                        break;

                    case 2:
                        bool applyLast = false;
                        switch (methodSymbol.Name)
                        {
                        case "Where":
                        case "OrderBy":
                        case "OrderByDescending":
                        case "ThenBy":
                        case "ThenByDescending":
                        case "Take":
                        case "Skip":
                        case "First":
                        case "FirstOrDefault":
                        case "Last":
                        case "LastOrDefault":
                        case "Single":
                        case "SingleOrDefault":
                            _properties.Last = membersVisitor._properties.Last;
                            break;

                        case "GroupBy":
                            _properties.Last = membersVisitor._properties.Last;
                            visitLambda(1, pd =>
                            {
                                if (_properties.PropertiesDependences.ContainsKey("Key"))
                                {
                                    _properties.PropertiesDependences["Key"] = pd;
                                }
                                else
                                {
                                    _properties.PropertiesDependences.Add("Key", pd);
                                }
                            });
                            _properties.ResetLast();
                            return;

                        case "Union":
                        case "Intersect":
                            membersVisitor = new GetMembersVisitor(this);
                            membersVisitor.Visit(argumentExpressions[1]);
                            AddProperties(membersVisitor._properties);
                            AddProperties(membersVisitor._properties.Last, _properties.Last);
                            _proceed = true;
                            return;

                        default:
                            applyLast = true;
                            break;
                        }
                        visitLambda(1, pd =>
                        {
                            AddProperties(pd);
                            if (applyLast)
                            {
                                _properties.Last = pd.Last;
                            }
                        });
                        break;

                    case 3:
                        switch (methodSymbol.Name)
                        {
                        case "SelectMany":
                            var last = membersVisitor._properties.Last;
                            _properties.Last = last;
                            var collectionDependence = new PropertyDependence();
                            visitLambda(1, pd =>
                            {
                                AddProperties(pd);
                                AddProperties(pd, collectionDependence);
                            });
                            _properties.ResetLast();
                            var lambdaExpression = (ParenthesizedLambdaExpressionSyntax)argumentExpressions[2];
                            var variables        = new Dictionary <string, PropertyDependence>(_variables);
                            var parameter        = lambdaExpression.ParameterList.Parameters[0];
                            if (!variables.ContainsKey(parameter.Identifier.ValueText))
                            {
                                variables.Add(parameter.Identifier.ValueText, last);
                            }
                            else
                            {
                                variables[parameter.Identifier.ValueText] = last;
                            }
                            parameter = lambdaExpression.ParameterList.Parameters[1];
                            if (!variables.ContainsKey(parameter.Identifier.ValueText))
                            {
                                variables.Add(parameter.Identifier.ValueText, collectionDependence.Last);
                            }
                            else
                            {
                                variables[parameter.Identifier.ValueText] = collectionDependence.Last;
                            }
                            membersVisitor = new GetMembersVisitor(this, variables);
                            membersVisitor.Visit(lambdaExpression.Body);
                            AddProperties(membersVisitor._properties);
                            _properties.Last = membersVisitor._properties;
                            _proceed         = true;
                            return;
                        }
                        break;

                    case 5:
                        switch (methodSymbol.Name)
                        {
                        case "Join":
                        case "GroupJoin":
                            var last = membersVisitor._properties.Last;
                            membersVisitor = new GetMembersVisitor(this);
                            membersVisitor.Visit(argumentExpressions[1]);
                            AddProperties(membersVisitor._properties);
                            var joinLast = membersVisitor._properties.Last;
                            _properties.Last = last;
                            visitLambda(2, pd => AddProperties(pd));
                            _proceed         = false;
                            _properties.Last = joinLast;
                            visitLambda(3, pd => AddProperties(pd));
                            _proceed = false;
                            _properties.ResetLast();
                            var lambdaExpression = (ParenthesizedLambdaExpressionSyntax)argumentExpressions[4];
                            var variables        = new Dictionary <string, PropertyDependence>(_variables);
                            var parameter        = lambdaExpression.ParameterList.Parameters[0];
                            if (!variables.ContainsKey(parameter.Identifier.ValueText))
                            {
                                variables.Add(parameter.Identifier.ValueText, last);
                            }
                            else
                            {
                                variables[parameter.Identifier.ValueText] = last;
                            }
                            parameter = lambdaExpression.ParameterList.Parameters[1];
                            if (!variables.ContainsKey(parameter.Identifier.ValueText))
                            {
                                variables.Add(parameter.Identifier.ValueText, joinLast);
                            }
                            else
                            {
                                variables[parameter.Identifier.ValueText] = joinLast;
                            }
                            membersVisitor = new GetMembersVisitor(this, variables);
                            membersVisitor.Visit(lambdaExpression.Body);
                            AddProperties(membersVisitor._properties);
                            _properties.Last = membersVisitor._properties;
                            _proceed         = true;
                            return;
                        }
                        break;
                    }
                }
            }
        }