Esempio n. 1
0
 /// <summary>
 /// Checks that the path is empty, this is true for this. and base. calls.
 /// </summary>
 /// <param name="expression">The <see cref="ExpressionSyntax"/>.</param>
 /// <returns>True if the path is empty, this is true for this. and base. calls.</returns>
 public static bool IsEmpty(ExpressionSyntax expression)
 {
     using (var walker = PathWalker.Borrow(expression))
     {
         return(walker.Tokens.Count == 0);
     }
 }
Esempio n. 2
0
#pragma warning restore CA1707 // Identifiers should not contain underscores
#pragma warning restore SA1600 // Elements must be documented
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
#pragma warning restore SA1313 // Parameter names must begin with lower-case letter
        //// ReSharper restore UnusedParameter.Global

        /// <summary>
        /// Tries to find C in this.C.P1.P2.
        /// </summary>
        /// <param name="expression">The <see cref="ExpressionSyntax"/>.</param>
        /// <param name="token">The root member.</param>
        /// <returns>True if root was found.</returns>
        public static bool TryFindRoot(ExpressionSyntax expression, out SyntaxToken token)
        {
            using (var walker = PathWalker.Borrow(expression))
            {
                return(walker.TryFirst(out token));
            }
        }
Esempio n. 3
0
        internal static bool Uses(ExpressionSyntax assigned, ExpressionSyntax returned, SyntaxNodeAnalysisContext context, PooledHashSet <SyntaxNode> visited = null)
        {
            if (assigned is null ||
                returned is null)
            {
                return(false);
            }

            using (var assignedPath = PathWalker.Borrow(assigned))
            {
                var containingType = context.ContainingSymbol.ContainingType;
                if (UsedMemberWalker.Uses(returned, assignedPath, Search.TopLevel, containingType, context.SemanticModel, context.CancellationToken))
                {
                    return(true);
                }

                if (assignedPath.IdentifierNames.TrySingle(out var candidate) &&
                    containingType.TryFindPropertyRecursive(candidate.Identifier.ValueText, out var property) &&
                    property.TrySingleDeclaration(context.CancellationToken, out var declaration) &&
                    declaration.TryGetSetter(out var setter) &&
                    Property.TrySingleAssignmentInSetter(setter, out var assignment))
                {
                    using (visited = PooledHashSet <SyntaxNode> .BorrowOrIncrementUsage(visited))
                    {
                        if (visited.Add(candidate))
                        {
                            return(Uses(assignment.Left, returned, context, visited));
                        }
                    }
                }
            }

            return(false);
        }
Esempio n. 4
0
 /// <summary>
 /// Tries to find Baz in this.foo.Bar.Baz.
 /// </summary>
 /// <param name="expression">The <see cref="ExpressionSyntax"/>.</param>
 /// <param name="member">The leaf member.</param>
 /// <returns>True if leaf was found.</returns>
 public static bool TryFindLast(ExpressionSyntax expression, out IdentifierNameSyntax member)
 {
     using (var walker = PathWalker.Borrow(expression))
     {
         return(walker.IdentifierNames.TryLast(out member));
     }
 }
Esempio n. 5
0
        /// <summary> Compares equality by path. </summary>
        /// <param name="x">The first instance.</param>
        /// <param name="y">The other instance.</param>
        /// <returns>True if the instances are found equal.</returns>
        public static bool Equals(ExpressionSyntax?x, ExpressionSyntax?y)
        {
            if (ReferenceEquals(x, y))
            {
                return(true);
            }

            if (x is null ||
                y is null)
            {
                return(false);
            }

            using var xWalker = PathWalker.Borrow(x);
            using var yWalker = PathWalker.Borrow(y);
            return(Equals(xWalker, yWalker));
        }
Esempio n. 6
0
            public static bool Uses(SyntaxNode scope, PathWalker backing, Search search, ITypeSymbol containingType, SemanticModel semanticModel, CancellationToken cancellationToken)
            {
                using (var walker = Borrow(scope, search, containingType, semanticModel, cancellationToken))
                {
                    foreach (var used in walker.usedMembers)
                    {
                        using (var usedPath = PathWalker.Borrow(used))
                        {
                            if (MemberPath.Equals(usedPath, backing))
                            {
                                return(true);
                            }
                        }
                    }
                }

                return(false);
            }
Esempio n. 7
0
        internal static bool Equals(ExpressionSyntax x, ExpressionSyntax y)
        {
            if (ReferenceEquals(x, y))
            {
                return(true);
            }

            if (x is null ||
                y is null)
            {
                return(false);
            }

            using (var xWalker = PathWalker.Borrow(x))
                using (var yWalker = PathWalker.Borrow(y))
                {
                    return(Equals(xWalker, yWalker));
                }
        }
Esempio n. 8
0
 /// <summary>
 /// Tries to the single member in the path.
 /// </summary>
 /// <param name="expression">The <see cref="ExpressionSyntax"/>.</param>
 /// <param name="token">The single member.</param>
 /// <returns>True if the path was only one member this.C or C for example.</returns>
 public static bool TrySingle(ExpressionSyntax expression, out SyntaxToken token)
 {
     using var walker = PathWalker.Borrow(expression);
     return(walker.TrySingle(out token));
 }
Esempio n. 9
0
 /// <summary>
 /// Get a <see cref="PathWalker"/> for <paramref name="expression"/>.
 /// </summary>
 /// <param name="expression">The expression.</param>
 /// <returns>A <see cref="PathWalker"/> for <paramref name="expression"/>.</returns>
 public static PathWalker Get(ExpressionSyntax expression) => PathWalker.Borrow(expression);