private IsKindExpressionInfo(
     ExpressionSyntax isKindExpression,
     ExpressionSyntax expression,
     ExpressionSyntax kindExpression,
     IsKindExpressionStyle style)
 {
     IsKindExpression = isKindExpression;
     Expression = expression;
     KindExpression = kindExpression;
     Style = style;
 }
        private static IsKindExpressionInfo Create(
            BinaryExpressionSyntax binaryExpression,
            SyntaxKind binaryExpressionKind,
            ExpressionSyntax expression1,
            ExpressionSyntax expression2,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            switch (expression1)
            {
                case InvocationExpressionSyntax invocationExpression:
                    {
                        SimpleMemberInvocationExpressionInfo invocationInfo = SyntaxInfo.SimpleMemberInvocationExpressionInfo(invocationExpression);

                        if (!invocationInfo.Success)
                            break;

                        if (!IsKindMethod(invocationInfo.Name, semanticModel, cancellationToken))
                            break;

                        return new IsKindExpressionInfo(binaryExpression, invocationInfo.Expression, expression2, (binaryExpressionKind == SyntaxKind.EqualsExpression) ? IsKindExpressionStyle.Kind : IsKindExpressionStyle.NotKind);
                    }
                case ConditionalAccessExpressionSyntax conditionalAccess:
                    {
                        if (conditionalAccess.WhenNotNull is not InvocationExpressionSyntax invocationExpression)
                            break;

                        if (invocationExpression.Expression is not MemberBindingExpressionSyntax memberBindingExpression)
                            break;

                        if (expression2.IsKind(SyntaxKind.TrueLiteralExpression))
                        {
                            if (!IsIsKindMethod(memberBindingExpression.Name, semanticModel, cancellationToken))
                                break;

                            IsKindExpressionStyle style = (binaryExpressionKind == SyntaxKind.EqualsExpression) ? IsKindExpressionStyle.IsKindConditional : IsKindExpressionStyle.NotIsKindConditional;

                            return new IsKindExpressionInfo(binaryExpression, conditionalAccess.Expression, invocationExpression.ArgumentList.Arguments[0].Expression, style);
                        }
                        else
                        {
                            if (!IsKindMethod(memberBindingExpression.Name, semanticModel, cancellationToken))
                                break;

                            IsKindExpressionStyle style = (binaryExpressionKind == SyntaxKind.EqualsExpression) ? IsKindExpressionStyle.KindConditional : IsKindExpressionStyle.NotKindConditional;

                            return new IsKindExpressionInfo(binaryExpression, conditionalAccess.Expression, expression2, style);
                        }
                    }
            }

            return default;
        }
        private static IsKindExpressionInfo Create(
            InvocationExpressionSyntax invocationExpression,
            SemanticModel semanticModel,
            IsKindExpressionStyle style,
            CancellationToken cancellationToken)
        {
            SimpleMemberInvocationExpressionInfo invocationInfo = SyntaxInfo.SimpleMemberInvocationExpressionInfo(invocationExpression);

            if (!invocationInfo.Success)
                return default;

            if (!IsIsKindMethod(invocationInfo.Name, semanticModel, cancellationToken))
                return default;

            return new IsKindExpressionInfo(invocationExpression, invocationInfo.Expression, invocationInfo.Arguments[0].Expression, style);
        }