public override Expr Visit( AccessorMemberExpr e )
 {
     if( _unboundCollector != null )
     {
         if( e.IsUnbound ) _unboundCollector( e );
         else VisitExpr( e.Left );
     }
     return e;
 }
Exemplo n.º 2
0
        public void SimpleExpression()
        {
            Analyzer  a = new Analyzer();
            Tokenizer p = new Tokenizer();

            {
                p.Reset("value");
                p.IsErrorOrEndOfInput.Should().Be(false);
                Expr e = a.Analyse(p);
                e.Should().BeOfType <AccessorMemberExpr>();
                AccessorMemberExpr ac = e as AccessorMemberExpr;
                ac.IsUnbound.Should().Be(true);
            }
            {
                p.Reset("!");
                Expr e = a.Analyse(p);
                e.Should().BeOfType <UnaryExpr>();
                UnaryExpr u = e as UnaryExpr;
                u.TokenType.Should().Be(TokenizerToken.Not);
                u.Expression.Should().BeOfType <SyntaxErrorExpr>();
                SyntaxErrorCollector.Collect(e, null).Count.Should().Be(1);
            }
            {
                p.Reset("!value");
                Expr e = a.Analyse(p);
                e.Should().BeOfType <UnaryExpr>();
                UnaryExpr u = e as UnaryExpr;
                u.TokenType.Should().Be(TokenizerToken.Not);
                u.Expression.Should().BeOfType <AccessorMemberExpr>();
                SyntaxErrorCollector.Collect(e, null).Should().BeEmpty();
            }
            {
                p.Reset(" 0.12e43 && ~b ");
                Expr e = a.Analyse(p);
                e.Should().BeOfType <BinaryExpr>();
                BinaryExpr and = e as BinaryExpr;
                and.BinaryOperatorToken.Should().Be(TokenizerToken.And);
                IsConstant(and.Left, 0.12e43);
                and.Right.Should().BeOfType <UnaryExpr>();
                UnaryExpr u = and.Right as UnaryExpr;
                u.TokenType.Should().Be(TokenizerToken.BitwiseNot);
                u.Expression.Should().BeOfType <AccessorMemberExpr>();
                AccessorMemberExpr m = u.Expression as AccessorMemberExpr;
                m.Left.Should().BeNull();
                SyntaxErrorCollector.Collect(e, null).Should().BeEmpty();
            }
            {
                p.Reset(@"!a||~""x""");
                Expr e = a.Analyse(p);
                e.Should().BeOfType <BinaryExpr>();
                BinaryExpr or = e as BinaryExpr;
                or.BinaryOperatorToken.Should().Be(TokenizerToken.Or);
                or.Left.Should().BeOfType <UnaryExpr>();
                or.Right.Should().BeOfType <UnaryExpr>();
                UnaryExpr u = or.Right as UnaryExpr;
                u.TokenType.Should().Be(TokenizerToken.BitwiseNot);
                IsConstant(u.Expression, "x");

                SyntaxErrorCollector.Collect(e, null).Should().BeEmpty();
            }
            {
                p.Reset("(3)");
                Expr e = a.Analyse(p);
                IsConstant(e, 3.0);
            }
            {
                p.Reset("(3+typeof 'x')");
                Expr e = a.Analyse(p);
                e.Should().BeOfType <BinaryExpr>();
                BinaryExpr b = e as BinaryExpr;
                IsConstant(b.Left, 3.0);
                b.Right.Should().BeOfType <UnaryExpr>();
                UnaryExpr u = b.Right as UnaryExpr;
                u.TokenType.Should().Be(TokenizerToken.TypeOf);
                IsConstant(u.Expression, "x");

                SyntaxErrorCollector.Collect(e, null).Should().BeEmpty();
            }
            {
                p.Reset("1 ? 2 : 3");
                Expr e = a.Analyse(p);
                e.Should().BeOfType <IfExpr>();
                IfExpr i = e as IfExpr;
                i.IsTernaryOperator.Should().Be(true);
                IsConstant(i.Condition, 1.0);
                IsConstant(i.WhenTrue, 2.0);
                IsConstant(i.WhenFalse, 3.0);
            }
        }
Exemplo n.º 3
0
        public void SimpleExpression()
        {
            ExprAnalyser a = new ExprAnalyser();
            JSTokenizer  p = new JSTokenizer();

            {
                p.Reset("value");
                Assert.That(p.IsErrorOrEndOfInput, Is.False);
                Expr e = a.Analyse(p);
                Assert.That(e is AccessorMemberExpr);
                AccessorMemberExpr ac = e as AccessorMemberExpr;
                Assert.That(ac.IsUnbound == true);
            }
            {
                p.Reset("!");
                Expr e = a.Analyse(p);
                Assert.That(e is UnaryExpr);
                UnaryExpr u = e as UnaryExpr;
                Assert.That(u.TokenType == JSTokenizerToken.Not);
                Assert.That(u.Expression is SyntaxErrorExpr);
                Assert.That(SyntaxErrorCollector.Collect(e, null).Count == 1);
            }
            {
                p.Reset("!value");
                Expr e = a.Analyse(p);
                Assert.That(e is UnaryExpr);
                UnaryExpr u = e as UnaryExpr;
                Assert.That(u.TokenType == JSTokenizerToken.Not);
                Assert.That(u.Expression is AccessorExpr);
                Assert.That(SyntaxErrorCollector.Collect(e, Util.ActionVoid).Count == 0);
            }
            {
                p.Reset(" 0.12e43 && ~b ");
                Expr e = a.Analyse(p);
                Assert.That(e is BinaryExpr);
                BinaryExpr and = e as BinaryExpr;
                Assert.That(and.BinaryOperatorToken == JSTokenizerToken.And);
                IsConstant(and.Left, 0.12e43);
                Assert.That(and.Right is UnaryExpr);
                UnaryExpr u = and.Right as UnaryExpr;
                Assert.That(u.TokenType == JSTokenizerToken.BitwiseNot);
                Assert.That(u.Expression is AccessorExpr);

                Assert.That(SyntaxErrorCollector.Collect(e, Util.ActionVoid).Count == 0);
            }
            {
                p.Reset(@"!a||~""x""");
                Expr e = a.Analyse(p);
                Assert.That(e is BinaryExpr);
                BinaryExpr or = e as BinaryExpr;
                Assert.That(or.BinaryOperatorToken == JSTokenizerToken.Or);
                Assert.That(or.Left is UnaryExpr);
                Assert.That(or.Right is UnaryExpr);
                UnaryExpr u = or.Right as UnaryExpr;
                Assert.That(u.TokenType == JSTokenizerToken.BitwiseNot);
                IsConstant(u.Expression, "x");

                Assert.That(SyntaxErrorCollector.Collect(e, Util.ActionVoid).Count == 0);
            }
            {
                p.Reset("(3)");
                Expr e = a.Analyse(p);
                IsConstant(e, 3);
            }
            {
                p.Reset("(3+typeof 'x')");
                Expr e = a.Analyse(p);
                Assert.That(e is BinaryExpr);
                BinaryExpr b = e as BinaryExpr;
                IsConstant(b.Left, 3);
                Assert.That(b.Right is UnaryExpr);
                UnaryExpr u = b.Right as UnaryExpr;
                Assert.That(u.TokenType == JSTokenizerToken.TypeOf);
                IsConstant(u.Expression, "x");

                Assert.That(SyntaxErrorCollector.Collect(e, Util.ActionVoid).Count == 0);
            }
            {
                p.Reset("1 ? 2 : 3");
                Expr e = a.Analyse(p);
                Assert.That(e is IfExpr);
                IfExpr i = e as IfExpr;
                Assert.That(i.IsTernaryOperator == true);
                IsConstant(i.Condition, 1);
                IsConstant(i.WhenTrue, 2);
                IsConstant(i.WhenFalse, 3);
            }
        }