Пример #1
0
        public string SetTypeName(VBAParser.ExpressionContext expression, QualifiedModuleName containingModule)
        {
            if (expression == null)
            {
                return(null);
            }

            switch (expression)
            {
            case VBAParser.LExprContext lExpression:
                return(SetTypeName(lExpression.lExpression(), containingModule));

            case VBAParser.NewExprContext newExpression:
                return(SetTypeName(newExpression.expression(), containingModule));

            case VBAParser.TypeofexprContext typeOfExpression:
                return(SetTypeName(typeOfExpression.expression(), containingModule));

            case VBAParser.LiteralExprContext literalExpression:
                return(SetTypeName(literalExpression.literalExpression()));

            case VBAParser.BuiltInTypeExprContext builtInTypeExpression:
                return(SetTypeName(builtInTypeExpression.builtInType()));

            default:
                return(NotAnObject);    //All remaining expression types have no Set type.
            }
        }
Пример #2
0
 public static bool IsBinaryMathContext(this VBAParser.ExpressionContext context)
 {
     return(context is VBAParser.MultOpContext || //MultOpContext includes both * and /
            context is VBAParser.AddOpContext ||  //AddOpContet includes both + and -
            context is VBAParser.PowOpContext ||
            context is VBAParser.IntDivOpContext ||
            context is VBAParser.ModOpContext);
 }
Пример #3
0
 public static bool IsBinaryLogicalContext(this VBAParser.ExpressionContext context)
 {
     return(context is VBAParser.RelationalOpContext ||
            context is VBAParser.LogicalXorOpContext ||
            context is VBAParser.LogicalAndOpContext ||
            context is VBAParser.LogicalOrOpContext ||
            context is VBAParser.LogicalImpOpContext ||
            context is VBAParser.LogicalEqvOpContext);
 }
Пример #4
0
        private static bool HasProcedureCall(VBAParser.ExpressionContext context, out string argList)
        {
            // bug: what if complex expression has multiple arg lists?
            argList = GetArgListString(context.FindChildren <VBAParser.ArgListContext>().FirstOrDefault())
                      ?? GetArgListString(context.FindChildren <VBAParser.ArgumentListContext>().FirstOrDefault());

            return(!(context is VBAParser.LiteralExprContext ||
                     context is VBAParser.NewExprContext ||
                     context is VBAParser.BuiltInTypeExprContext));
        }
        private IExpressionBinding Visit(Declaration module, Declaration parent, VBAParser.ExpressionContext expression)
        {
            switch (expression)
            {
            case VBAParser.LExprContext lExprContext:
                return(Visit(module, parent, lExprContext.lExpression()));

            default:
                throw new NotSupportedException($"Unexpected expression type {expression.GetType()}");
            }
        }
Пример #6
0
        private IExpressionBinding VisitTypeOf(
            Declaration module,
            Declaration parent,
            VBAParser.RelationalOpContext typeOfIsExpression,
            VBAParser.TypeofexprContext typeOfLeftPartExpression,
            VBAParser.ExpressionContext typeExpression,
            IBoundExpression withBlockVariable)
        {
            var booleanExpression        = typeOfLeftPartExpression.expression();
            var booleanExpressionBinding = Visit(module, parent, booleanExpression, withBlockVariable, StatementResolutionContext.Undefined);
            var typeExpressionBinding    = VisitType(module, parent, typeExpression, withBlockVariable);

            return(new TypeOfIsDefaultBinding(typeOfIsExpression, booleanExpressionBinding, typeExpressionBinding));
        }
Пример #7
0
        public static bool TryGetRelationalOpContextSymbol(this VBAParser.ExpressionContext context, out string opSymbol)
        {
            switch (context)
            {
            case VBAParser.RelationalOpContext ctxt:
                var terminalNode = ctxt.EQ() ?? ctxt.GEQ() ?? ctxt.GT() ?? ctxt.LEQ()
                                   ?? ctxt.LIKE() ?? ctxt.LT() ?? ctxt.NEQ();
                opSymbol = terminalNode.GetText();
                return(true);

            default:
                opSymbol = string.Empty;
                return(false);
            }
        }
Пример #8
0
        public Declaration SetTypeDeclaration(VBAParser.ExpressionContext expression, QualifiedModuleName containingModule)
        {
            if (expression == null)
            {
                return(null);
            }

            switch (expression)
            {
            case VBAParser.LExprContext lExpression:
                return(SetTypeDeclaration(lExpression.lExpression(), containingModule));

            case VBAParser.NewExprContext newExpression:
                return(SetTypeDeclaration(newExpression.expression(), containingModule));

            case VBAParser.TypeofexprContext typeOfExpression:
                return(SetTypeDeclaration(typeOfExpression.expression(), containingModule));

            default:
                return(null);    //All remaining expression types either have no Set type or there is no declaration for it.
            }
        }
Пример #9
0
        public static bool TryGetLogicalContextSymbol(this VBAParser.ExpressionContext context, out string symbol)
        {
            if (context.TryGetRelationalOpContextSymbol(out symbol))
            {
                return(true);
            }

            switch (context)
            {
            case VBAParser.LogicalXorOpContext _:
                symbol = context.GetToken(VBAParser.XOR, 0).GetText();
                return(true);

            case VBAParser.LogicalAndOpContext _:
                symbol = context.GetToken(VBAParser.AND, 0).GetText();
                return(true);

            case VBAParser.LogicalOrOpContext _:
                symbol = context.GetToken(VBAParser.OR, 0).GetText();
                return(true);

            case VBAParser.LogicalEqvOpContext _:
                symbol = context.GetToken(VBAParser.EQV, 0).GetText();
                return(true);

            case VBAParser.LogicalImpOpContext _:
                symbol = context.GetToken(VBAParser.IMP, 0).GetText();
                return(true);

            case VBAParser.LogicalNotOpContext _:
                symbol = context.GetToken(VBAParser.NOT, 0).GetText();
                return(true);

            default:
                symbol = string.Empty;
                return(false);
            }
        }
Пример #10
0
 private IExpressionBinding VisitType(Declaration module, Declaration parent, VBAParser.ExpressionContext expression, IBoundExpression withBlockVariable)
 {
     return(_typeBindingContext.BuildTree(module, parent, expression, withBlockVariable, StatementResolutionContext.Undefined));
 }
Пример #11
0
        private IExpressionBinding Visit(Declaration module, Declaration parent, VBAParser.ExpressionContext expression, IBoundExpression withBlockVariable, StatementResolutionContext statementContext)
        {
            switch (expression)
            {
            case VBAParser.LExprContext lExprContext:
                return(Visit(module, parent, lExprContext.lExpression(), withBlockVariable, statementContext));

            case VBAParser.ParenthesizedExprContext parenthesizedExprContext:
                return(Visit(module, parent, parenthesizedExprContext, withBlockVariable));

            case VBAParser.RelationalOpContext relationalOpContext:
                return(Visit(module, parent, relationalOpContext, withBlockVariable));

            case VBAParser.LiteralExprContext literalExprContext:
                return(Visit(literalExprContext.literalExpression()));

            case VBAParser.NewExprContext newExprContext:
                return(Visit(module, parent, newExprContext, withBlockVariable));

            case VBAParser.LogicalNotOpContext logicalNotOpContext:
                return(VisitUnaryOp(module, parent, logicalNotOpContext, logicalNotOpContext.expression(), withBlockVariable));

            case VBAParser.UnaryMinusOpContext unaryMinusOpContext:
                return(VisitUnaryOp(module, parent, unaryMinusOpContext, unaryMinusOpContext.expression(), withBlockVariable));

            case VBAParser.LogicalAndOpContext logicalAndOpContext:
                return(VisitBinaryOp(module, parent, logicalAndOpContext, logicalAndOpContext.expression()[0], logicalAndOpContext.expression()[1], withBlockVariable));

            case VBAParser.LogicalOrOpContext logicalOrOpContext:
                return(VisitBinaryOp(module, parent, logicalOrOpContext, logicalOrOpContext.expression()[0], logicalOrOpContext.expression()[1], withBlockVariable));

            case VBAParser.LogicalXorOpContext logicalXorOpContext:
                return(VisitBinaryOp(module, parent, logicalXorOpContext, logicalXorOpContext.expression()[0], logicalXorOpContext.expression()[1], withBlockVariable));

            case VBAParser.LogicalEqvOpContext logicalEqvOpContext:
                return(VisitBinaryOp(module, parent, logicalEqvOpContext, logicalEqvOpContext.expression()[0], logicalEqvOpContext.expression()[1], withBlockVariable));

            case VBAParser.LogicalImpOpContext logicalImpOpContext:
                return(VisitBinaryOp(module, parent, logicalImpOpContext, logicalImpOpContext.expression()[0], logicalImpOpContext.expression()[1], withBlockVariable));

            case VBAParser.AddOpContext addOpContext:
                return(VisitBinaryOp(module, parent, addOpContext, addOpContext.expression()[0], addOpContext.expression()[1], withBlockVariable));

            case VBAParser.ConcatOpContext concatOpContext:
                return(VisitBinaryOp(module, parent, concatOpContext, concatOpContext.expression()[0], concatOpContext.expression()[1], withBlockVariable));

            case VBAParser.MultOpContext multOpContext:
                return(VisitBinaryOp(module, parent, multOpContext, multOpContext.expression()[0], multOpContext.expression()[1], withBlockVariable));

            case VBAParser.ModOpContext modOpContext:
                return(VisitBinaryOp(module, parent, modOpContext, modOpContext.expression()[0], modOpContext.expression()[1], withBlockVariable));

            case VBAParser.PowOpContext powOpContext:
                return(VisitBinaryOp(module, parent, powOpContext, powOpContext.expression()[0], powOpContext.expression()[1], withBlockVariable));

            case VBAParser.IntDivOpContext intDivOpContext:
                return(VisitBinaryOp(module, parent, intDivOpContext, intDivOpContext.expression()[0], intDivOpContext.expression()[1], withBlockVariable));

            case VBAParser.MarkedFileNumberExprContext markedFileNumberExprContext:
                return(Visit(module, parent, markedFileNumberExprContext, withBlockVariable));

            case VBAParser.BuiltInTypeExprContext builtInTypeExprContext:
                return(Visit(builtInTypeExprContext));

            //We do not handle the VBAParser.TypeofexprContext because that should only ever appear as a child of an IS relational operator expression and is specifically handled there.
            default:
                throw new NotSupportedException($"Unexpected expression type {expression.GetType()}");
            }
        }
Пример #12
0
 public static bool IsMathContext(this VBAParser.ExpressionContext context)
 {
     return(context.IsBinaryMathContext() || context.IsUnaryMathContext());
 }
Пример #13
0
        private IExpressionBinding VisitUnaryOp(Declaration module, Declaration parent, ParserRuleContext context, VBAParser.ExpressionContext expr, IBoundExpression withBlockVariable)
        {
            var exprBinding        = Visit(module, parent, expr, withBlockVariable, StatementResolutionContext.Undefined);
            var letCoercionBinding = new LetCoercionDefaultBinding(expr, exprBinding);

            return(new UnaryOpDefaultBinding(context, letCoercionBinding));
        }
Пример #14
0
 public static bool IsUnaryLogicalContext(this VBAParser.ExpressionContext context)
 {
     return(context is VBAParser.LogicalNotOpContext);
 }
Пример #15
0
 public static bool IsUnaryMathContext(this VBAParser.ExpressionContext context)
 {
     return(context is VBAParser.UnaryMinusOpContext);
 }
Пример #16
0
        private IExpressionBinding VisitBinaryOp(Declaration module, Declaration parent, ParserRuleContext context, VBAParser.ExpressionContext left, VBAParser.ExpressionContext right, IBoundExpression withBlockVariable, bool isIsRelation = false)
        {
            var leftBinding  = Visit(module, parent, left, withBlockVariable, StatementResolutionContext.Undefined);
            var rightBinding = Visit(module, parent, right, withBlockVariable, StatementResolutionContext.Undefined);

            if (!isIsRelation)
            {
                //All but the Is relation require value type arguments.
                leftBinding  = new LetCoercionDefaultBinding(left, leftBinding);
                rightBinding = new LetCoercionDefaultBinding(right, rightBinding);
            }

            return(new BinaryOpDefaultBinding(context, leftBinding, rightBinding));
        }
 private IExpressionBinding Visit(Declaration module, Declaration parent, VBAParser.ExpressionContext expression)
 {
     return(Visit(module, parent, (dynamic)expression));
 }
Пример #18
0
 private string SetTypeNameOfExpression(VBAParser.ExpressionContext expression, QualifiedModuleName containingModule, DeclarationFinder finder)
 {
     return(_setTypeResolver.SetTypeName(expression, containingModule));
 }
Пример #19
0
 public static bool IsLogicalContext(this VBAParser.ExpressionContext context)
 {
     return(TryGetLogicalContextSymbol(context, out _));
 }