示例#1
0
        private async Task <ExpressionSyntax> ConvertToStringComparisonOperatorAsync(VBSyntax.BinaryExpressionSyntax node, SyntaxKind expressionKind)
        {
            var(lhs, rhs) = await AcceptSidesAsync(node);

            lhs = VisualBasicEqualityComparison.VbCoerceToString(lhs, _semanticModel.GetTypeInfo(node.Left));
            rhs = VisualBasicEqualityComparison.VbCoerceToString(rhs, _semanticModel.GetTypeInfo(node.Right));
            var member = new KnownMethod(_compilerServices, _operators, "CompareString");
            var optionaCompareTextBoolLiteralExpression = _visualBasicEqualityComparison.OptionCompareTextCaseInsensitiveBoolExpression;
            var comparedLhs = member.Invoke(_visualBasicEqualityComparison.ExtraUsingDirectives, lhs, rhs, optionaCompareTextBoolLiteralExpression);

            return(SyntaxFactory.BinaryExpression(expressionKind, comparedLhs, LiteralConversions.GetLiteralExpression(0)));
        }
示例#2
0
        public async Task <ExpressionSyntax> ConvertReferenceOrNothingComparisonOrNullAsync(VBSyntax.ExpressionSyntax exprNode, bool negateExpression = false)
        {
            if (!(exprNode is VBSyntax.BinaryExpressionSyntax node) ||
                !node.IsKind(VBasic.SyntaxKind.IsExpression, VBasic.SyntaxKind.EqualsExpression, VBasic.SyntaxKind.IsNotExpression, VBasic.SyntaxKind.NotEqualsExpression))
            {
                return(null);
            }

            var notted =
                node.IsKind(VBasic.SyntaxKind.IsNotExpression, VBasic.SyntaxKind.NotEqualsExpression) ||
                negateExpression;
            var isReferenceComparison = node.IsKind(VBasic.SyntaxKind.IsExpression, VBasic.SyntaxKind.IsNotExpression);

            if (ArgComparedToNull(node) is {} vbOtherArg)
            {
                var csOtherArg = await ConvertIsOrIsNotExpressionArgAsync(vbOtherArg);

                return(notted
                    ? CommonConversions.NotNothingComparison(csOtherArg, isReferenceComparison)
                    : CommonConversions.NothingComparison(csOtherArg, isReferenceComparison));
            }

            if (isReferenceComparison)
            {
                var lhs = await ConvertIsOrIsNotExpressionArgAsync(node.Left);

                var rhs = await ConvertIsOrIsNotExpressionArgAsync(node.Right);

                var equalityCheck = new KnownMethod(nameof(System), nameof(Object), nameof(object.ReferenceEquals))
                                    .Invoke(_visualBasicEqualityComparison.ExtraUsingDirectives,
                                            ConvertTo(node.Left, lhs, SpecialType.System_Object), rhs);
                return(notted
                    ? SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, equalityCheck)
                    : equalityCheck);
            }
            return(null);
        }
示例#3
0
        private async Task <ExpressionSyntax> ConvertToMethodAsync(VBSyntax.BinaryExpressionSyntax node, KnownMethod member)
        {
            var(lhs, rhs) = await AcceptSidesAsync(node);

            return(member.Invoke(_visualBasicEqualityComparison.ExtraUsingDirectives, lhs, rhs));
        }
示例#4
0
        private async Task <ExpressionSyntax> ConvertToObjectComparisonOperatorAsync(VBSyntax.BinaryExpressionSyntax node, KnownMethod member)
        {
            var(lhs, rhs) = await AcceptSidesAsync(node);

            member = (member.Import, member.TypeName, "Conditional" + member.MethodName); //The VB compiler would late bind, but this should provide identical results in most cases I think
            var optionaCompareTextBoolLiteralExpression = _visualBasicEqualityComparison.OptionCompareTextCaseInsensitiveBoolExpression;

            return(member.Invoke(_visualBasicEqualityComparison.ExtraUsingDirectives, lhs, rhs, optionaCompareTextBoolLiteralExpression));
        }
示例#5
0
 private async Task <ExpressionSyntax> ConvertToObjectBinaryOperatorAsync(VBSyntax.BinaryExpressionSyntax node, KnownMethod member) =>
 await ConvertToMethodAsync(node, member);
示例#6
0
 /// <remarks>No need to implement these since this is only called for things that are already decimal and hence will resolve operator in C#</remarks>
 private static async Task <ExpressionSyntax> ConvertToDecimalBinaryOperatorAsync(VBSyntax.BinaryExpressionSyntax node, KnownMethod member) =>
 default;
示例#7
0
        private async Task <ExpressionSyntax> ConvertToLikeOperatorAsync(VBSyntax.BinaryExpressionSyntax node, KnownMethod member)
        {
            var(lhs, rhs) = await AcceptSidesAsync(node);

            var compareText = ValidSyntaxFactory.MemberAccess("CompareMethod", _visualBasicEqualityComparison.OptionCompareTextCaseInsensitive ? "Text" : "Binary");

            _visualBasicEqualityComparison.ExtraUsingDirectives.Add("Microsoft.VisualBasic");
            return(member.Invoke(_visualBasicEqualityComparison.ExtraUsingDirectives, lhs, rhs, compareText));
        }