public static string GetPropertyNameFromMethodName(string methodName) { return(SpecificationMethods.GetPropertyNameFromMethodName(methodName)); }
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; } } } }