public static bool Equals(ITypeSymbol x, ITypeSymbol y)
        {
            if (ReferenceEquals(x, y))
            {
                return(true);
            }

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

            if (x.TypeKind != y.TypeKind)
            {
                return(false);
            }

            if (x is INamedTypeSymbol xNamedType &&
                y is INamedTypeSymbol yNamedType)
            {
                return(NamedTypeSymbolComparer.Equals(xNamedType, yNamedType));
            }

            if (x.TypeKind == TypeKind.TypeParameter)
            {
                return(x.MetadataName == y.MetadataName &&
                       SymbolComparer.Equals(x.ContainingSymbol, y.ContainingSymbol));
            }

            return(x.MetadataName == y.MetadataName &&
                   Equals(x.ContainingType, y.ContainingType) &&
                   NamespaceSymbolComparer.Equals(x.ContainingNamespace, y.ContainingNamespace));
        }
Exemplo n.º 2
0
        private static bool IsArguments(InvocationExpressionSyntax invocation, SemanticModel semanticModel, CancellationToken cancellationToken, ISymbol first, ISymbol other)
        {
            if (invocation.ArgumentList == null ||
                invocation.ArgumentList.Arguments.Count < 2)
            {
                return(false);
            }

            var e0 = invocation.ArgumentList.Arguments[0].Expression;
            var e1 = invocation.ArgumentList.Arguments[1].Expression;

            if (TryGetName(e0, out var name0) &&
                TryGetName(e1, out var name1))
            {
                var firstName = GetSymbolName(first);
                var otherName = GetSymbolName(other);
                if (name0 == firstName &&
                    name1 == otherName)
                {
                    return(SymbolComparer.Equals(semanticModel.GetSymbolSafe(e0, cancellationToken), first) &&
                           SymbolComparer.Equals(semanticModel.GetSymbolSafe(e1, cancellationToken), other));
                }

                if (name0 == otherName &&
                    name1 == firstName)
                {
                    return(SymbolComparer.Equals(semanticModel.GetSymbolSafe(e0, cancellationToken), other) &&
                           SymbolComparer.Equals(semanticModel.GetSymbolSafe(e1, cancellationToken), first));
                }
            }

            return(false);
        }
Exemplo n.º 3
0
 internal static bool IsInstanceEquals(ExpressionSyntax condition, SemanticModel semanticModel, ISymbol instance, ISymbol arg, CancellationToken cancellationToken)
 {
     return(condition is InvocationExpressionSyntax {
         ArgumentList : { Arguments : { Count : 1 } arguments }
     } invocation&&
            arguments.TrySingle(out var argument) &&
            TryGetName(argument.Expression) == GetSymbolName(arg) &&
            invocation.TryGetMethodName(out var name) &&
            name == "Equals" &&
            invocation.Expression is MemberAccessExpressionSyntax memberAccess &&
            TryGetName(memberAccess.Expression) == GetSymbolName(instance) &&
            SymbolComparer.Equals(instance, semanticModel.GetSymbolSafe(memberAccess.Expression, cancellationToken)) &&
            SymbolComparer.Equals(semanticModel.GetSymbolSafe(argument.Expression, cancellationToken), arg));
 }
        public static bool Equals(ILocalSymbol x, ILocalSymbol y)
        {
            if (ReferenceEquals(x, y))
            {
                return(true);
            }

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

            return(x.MetadataName == y.MetadataName &&
                   SymbolComparer.Equals(x.ContainingSymbol, y.ContainingSymbol));
        }