Esempio n. 1
0
        private LambdaExpression ParseLambdaBody(int startPosition, params Parameter[] parameters)
        {
            Expression exp;
            LambdaExpression ret;
            Statement st;
            if (PeekToken(TokenKind.LeftBrace))
            {
                var inFinally = _inFinally;
                var inLoop = _inLoop;
                var return_ = _return;
                var isGenerator = _isGenerator;
                var isAsync = _isAsync;
                _inLoop = false;
                _inFinally = false;
                _return = false;
                _isGenerator = false;
                _isAsync = false;
                FunctionDefinition fnDef = new FunctionDefinition(null, parameters);
                PushFunction(fnDef);

                st = ParseBlock();

                FunctionDefinition fnDef2 = PopFunction();
                Debug.Assert(fnDef == fnDef2);

                fnDef.Body = st;

                ret = new LambdaExpression(fnDef);

                _inLoop = inLoop;
                _inFinally = inFinally;
                _return = return_;
                _isGenerator = isGenerator;
                _isAsync = isAsync;
            }
            else
            {
                exp = ParseExpression();
                st = new ReturnStatement(exp);
                st.SetLoc(_globalParent, exp.IndexSpan);

                ret = new LambdaExpression(parameters, st);
            }

            ret.SetLoc(_globalParent, startPosition, GetEnd());
            return ret;
        }
Esempio n. 2
0
 private void PushFunction(FunctionDefinition function)
 {
     if (_functions == null)
     {
         _functions = new Stack<FunctionDefinition>();
     }
     _functions.Push(function);
 }
Esempio n. 3
0
        private Statement ParseFunctionStatement()
        {
            Eat(TokenKind.KeywordFunction);
            var start = GetStart();
            var globalStart = start;

            var name = (NameToken)NextToken(TokenKind.Name);

            List<Parameter> parameters = new List<Parameter>();
            Eat(TokenKind.LeftParenthesis);
            int lStart = GetStart(), lEnd = GetEnd();
            int grouping = _tokenizer.GroupingLevel;

            if (!MaybeEat(TokenKind.RightParenthesis))
            {
                do
                {
                    NameToken nt = (NameToken)NextToken(TokenKind.Name);
                    start = GetStart();
                    Expression defaultVal = MaybeEat(TokenKind.Assign) ? ParseExpression() : null;
                    var param = new Parameter(nt.Name, defaultVal);
                    param.SetLoc(_globalParent, start, GetEnd());
                    parameters.Add(param);
                } while (MaybeEat(TokenKind.Comma));
                Eat(TokenKind.RightParenthesis);
            }
            int rStart = GetStart(), rEnd = GetEnd();

            var inFinally = _inFinally;
            var inLoop = _inLoop;
            var return_ = _return;
            var isGenerator = _isGenerator;
            var isAsync = _isAsync;
            _inLoop = false;
            _inFinally = false;
            _return = false;
            _isGenerator = false;
            var ret = new FunctionDefinition(name.Name, parameters.ToArray());

            PushFunction(ret);

            var body = ParseBlock();

            FunctionDefinition ret2 = PopFunction();
            Debug.Assert(ret == ret2);

            _inLoop = inLoop;
            _inFinally = inFinally;
            _return = return_;
            _isGenerator = isGenerator;
            _isAsync = isAsync;

            ret.Body = body;

            if(_sink != null)
                _sink.MatchPair(
                    new SourceSpan(_tokenizer.IndexToLocation(lStart), _tokenizer.IndexToLocation(lEnd)),
                    new SourceSpan(_tokenizer.IndexToLocation(rStart), _tokenizer.IndexToLocation(rEnd)),
                    grouping
                );

            ret.SetLoc(_globalParent, globalStart, GetEnd());
            return ret;
        }
Esempio n. 4
0
        public override bool Walk(FunctionDefinition node)
        {
            if (!node.IsLambda)
                node.TotemVariable = DefineName(node.Name);
            //node.ArgumentsVariable = DefineName("arguments");

            // process the default arg values in the outer context
            foreach (Parameter p in node.Parameters)
                if (p.DefaultValue != null)
                    p.DefaultValue.Walk(this);

            PushScope(node);

            foreach (Parameter p in node.Parameters)
                p.Walk(_parameter);

            node.Body.Walk(this);
            return false;
        }
Esempio n. 5
0
 public override void PostWalk(FunctionDefinition node)
 {
     Debug.Assert(_currentScope == node);
     PopScope();
 }
Esempio n. 6
0
 internal LambdaExpression(FunctionDefinition function)
 {
     _function = function;
 }
Esempio n. 7
0
 public LambdaExpression(Parameter[] parameters, Statement body)
 {
     _function = new FunctionDefinition(null, parameters, body);
 }