コード例 #1
0
        /// <summary>
        /// Either external function or member name.
        /// </summary>
        /// <returns></returns>
        public object VisitMemberAccess(MemberAccessExpr expr)
        {
            var memberAccess = MemberHelper.GetMemberAccess(expr, this.Ctx, expr.VarExp, expr.MemberName, this);

            if (expr.IsAssignment)
            {
                return(memberAccess);
            }

            if (memberAccess.MemberMissing)
            {
                throw expr.BuildRunTimeException("Member : " + expr.MemberName + " does not exist");
            }

            // NOTES:
            // 1. If property on a built in type && not assignment then just return the value of the property
            // 2. It's done here instead because there is no function/method call on a property.
            if (memberAccess.IsPropertyAccessOnBuiltInType())
            {
                var result = FunctionHelper.CallMemberOnBasicType(this.Ctx, expr, memberAccess, null, null, this);
                return(result);
            }
            if (memberAccess.IsPropertyAccessOnClass() || memberAccess.IsFieldAccessOnClass())
            {
                var result = FunctionHelper.CallMemberOnClass(this.Ctx, expr, memberAccess, null, null, this);
                return(result);
            }
            if (memberAccess.IsModuleAccess())
            {
                var result = MemberHelper.ResolveSymbol(memberAccess.Scope, expr.MemberName);
                return(result);
            }
            return(memberAccess);
        }
コード例 #2
0
        public void TestMemberAccessExpr()
        {
            // not (1 > 2)
            var programSource = new TokenList()
            {
                { TokenType.Identifier, "x" },
                { TokenType.OpAssignment },
                { TokenType.Identifier, "arr" },
                { TokenType.OpDot },
                { TokenType.Identifier, "size" }
            };
            Parser      parser  = new Parser(CreateMockScanner(programSource), new ErrorHandler());
            ProgramNode program = parser.Parse();

            var expr = new MemberAccessExpr(0, 0);

            expr.AccessedExpr = new VariableExpr(0, 0, "arr");
            expr.MemberId     = "size";
            var assignment = new AssignmentStmt(0, 0);

            assignment.AssignmentExpr = expr;
            assignment.Variable       = new VariableExpr(0, 0, "x");
            expected.Block.Statements.Add(assignment);
            program.ShouldBeEquivalentTo(expected);
        }
コード例 #3
0
        private Tuple <bool, Expr> IsMatch(FluentPluginHelper helper, Type type, Token klass, Token instance, Token prop, Token method)
        {
            string memberName = null;
            string rootVar    = null;
            bool   match      = false;

            // 1. Class property
            if (klass != null && prop != null)
            {
                rootVar = klass.Text;
                if (helper.IsClassProp(type, prop.Text))
                {
                    memberName = prop.Text;
                    match      = true;
                }
            }
            // 2. Class method
            else if (klass != null && method != null)
            {
                rootVar = type.Name;
                if (helper.IsClassMethod(type, method.Text))
                {
                    memberName = method.Text;
                    match      = true;
                }
            }
            // 3. Instance property
            else if (instance != null && prop != null)
            {
                rootVar = instance.Text;
                if (helper.IsInstanceProp(type, prop.Text))
                {
                    memberName = prop.Text;
                    match      = true;
                }
            }
            // 4. Instance method
            else if (instance != null && method != null)
            {
                rootVar = instance.Text;
                if (helper.IsInstanceMethod(type, method.Text))
                {
                    memberName = method.Text;
                    match      = true;
                }
            }
            if (!match)
            {
                return(new Tuple <bool, Expr>(false, null));
            }

            var varExp = new VariableExpr(rootVar);

            varExp.Ctx = _parser.Context;
            var memExp = new MemberAccessExpr(varExp, memberName, false);

            memExp.Ctx = _parser.Context;
            return(new Tuple <bool, Expr>(memberName != null, memExp));
        }
コード例 #4
0
        /// <summary>
        /// Creates a function call expression.
        /// </summary>
        /// <param name="nameExpr"></param>
        /// <param name="parameters"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public static Expr MemberAccess(Expr nameExpr, string memberName, bool isAssignment, TokenData token)
        {
            var exp = new MemberAccessExpr();

            exp.IsAssignment = isAssignment;
            exp.VarExp       = nameExpr;
            exp.MemberName   = memberName;
            SetupContext(exp, token);
            return(exp);
        }
コード例 #5
0
        public FunctionCallExpr BuildFuncCallExpr(Context ctx, string varName, string memName, List <object> args)
        {
            var exp    = new FunctionCallExpr();
            var memExp = new MemberAccessExpr(new VariableExpr(varName), memName, false);

            memExp.Ctx = ctx;
            ((VariableExpr)memExp.VariableExp).Ctx = ctx;
            exp.NameExp   = memExp;
            exp.ParamList = args;
            exp.Ctx       = ctx;
            return(exp);
        }
コード例 #6
0
        public void TestAccessSizeOfNotArray()
        {
            var program = new ProgramNode(0, 0);

            program.Block = new BlockStmt(0, 0);
            var declaration = CreateVarDeclaration("var1", new ArrayType(0, 0, ExprType.Int));
            var assign      = new AssignmentStmt(0, 0);

            assign.Variable = new VariableExpr(0, 0, "var1");
            var access = new MemberAccessExpr(0, 0);

            access.AccessedExpr   = new IntLiteralExpr(0, 0, 1);
            access.MemberId       = "size";
            assign.AssignmentExpr = access;
            program.Block.Statements.Add(declaration);
            program.Block.Statements.Add(assign);
            AssertErrorContains(program, "Int has no member 'size'");
        }
コード例 #7
0
        public void TestAccessArraySize()
        {
            var program = new ProgramNode(0, 0);

            program.Block = new BlockStmt(0, 0);
            var declaration  = CreateVarDeclaration("var1", new ArrayType(0, 0, ExprType.Int));
            var declaration2 = CreateVarDeclaration("var2");
            var assign       = new AssignmentStmt(0, 0);
            var member       = new MemberAccessExpr(0, 0);

            member.AccessedExpr   = new VariableExpr(0, 0, "var1");
            member.MemberId       = "size";
            assign.Variable       = new VariableExpr(0, 0, "var2");
            assign.AssignmentExpr = member;
            program.Block.Statements.Add(declaration);
            program.Block.Statements.Add(declaration2);
            program.Block.Statements.Add(assign);
            AssertNoErrors(program);
        }
コード例 #8
0
 /// <summary>
 /// Visits the function call expression tree
 /// </summary>
 /// <param name="exp"></param>
 public object VisitMemberAccess(MemberAccessExpr exp)
 {
     return(null);
 }