Beispiel #1
0
 public PropertySymbolInfo(PropertySymbol propertySymbol)
 {
     _propertySymbol = propertySymbol;
     Type            = new TypeSymbolInfo(propertySymbol.Type);
     Name            = propertySymbol.Name;
     ContainingType  = new TypeSymbolInfo(propertySymbol.ContainingType);
 }
Beispiel #2
0
 public PropertySymbolInfo(PropertySymbol propertySymbol)
 {
     _propertySymbol = propertySymbol;
     Type = new TypeSymbolInfo(propertySymbol.Type);
     Name = propertySymbol.Name;
     ContainingType = new TypeSymbolInfo(propertySymbol.ContainingType);
 }
Beispiel #3
0
 public PropertySymbolInfo(TypeSymbolInfo type, string name, TypeSymbolInfo containingType,
     MethodDeclarationSyntax method = null)
 {
     Type = type;
     Name = name;
     ContainingType = containingType;
     GetMethod = method;
 }
Beispiel #4
0
 public PropertySymbolInfo(TypeSymbolInfo type, string name, TypeSymbolInfo containingType,
                           MethodDeclarationSyntax method = null)
 {
     Type           = type;
     Name           = name;
     ContainingType = containingType;
     GetMethod      = method;
 }
Beispiel #5
0
        public bool IsAssignableFrom(TypeSymbolInfo typeSymbolInfo)
        {
            var typeSymbolString = _typeSymbol.ToString();

            for (var typeSymbolLoop = typeSymbolInfo._typeSymbol; typeSymbolLoop != null; typeSymbolLoop = typeSymbolLoop.BaseType)
            {
                if (typeSymbolLoop.ToString() == typeSymbolString)
                {
                    return(true);
                }

                var typeSymbolLoopString = typeSymbolLoop.ToString();

                if (typeSymbolLoop.GetMembers().OfType <IMethodSymbol>().Where(m => m.Name == "op_Implicit" || m.Name == "op_Explicit").Any(op => op.ReturnType.ToString() == typeSymbolString) || _typeSymbol.GetMembers().OfType <IMethodSymbol>().Where(m => m.Name == "op_Implicit" || m.Name == "op_Explicit").Any(op => op.ReturnType.ToString() == typeSymbolLoopString))
                {
                    return(true);
                }
            }
            if (typeSymbolInfo._typeSymbol.AllInterfaces.Any(i => i.ToString() == typeSymbolString))
            {
                return(true);
            }
            return(false);
        }
Beispiel #6
0
        public bool IsAssignableFrom(TypeSymbolInfo typeSymbolInfo)
        {
            var typeSymbolString = _typeSymbol.ToString();
            for (var typeSymbolLoop = typeSymbolInfo._typeSymbol; typeSymbolLoop != null; typeSymbolLoop = typeSymbolLoop.BaseType)
            {
                if (typeSymbolLoop.ToString() == typeSymbolString)
                    return true;

                var typeSymbolLoopString = typeSymbolLoop.ToString();

                if (typeSymbolLoop.GetMembers().OfType<IMethodSymbol>().Where(m => m.Name == "op_Implicit" || m.Name == "op_Explicit").Any(op => op.ReturnType.ToString() == typeSymbolString) || _typeSymbol.GetMembers().OfType<IMethodSymbol>().Where(m => m.Name == "op_Implicit" || m.Name == "op_Explicit").Any(op => op.ReturnType.ToString() == typeSymbolLoopString))
                    return true;
            }
            if (typeSymbolInfo._typeSymbol.AllInterfaces.Any(i => i.ToString() == typeSymbolString))
                return true;
            return false;
        }
Beispiel #7
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;
                    }
                }
            }
        }