Пример #1
0
        public static MSA.Expression <T> /*!*/ Transform <T>(SourceUnitTree /*!*/ ast, SourceUnit /*!*/ sourceUnit,
                                                             RubyCompilerOptions /*!*/ options, int sourceId)
        {
            var context   = (RubyContext)sourceUnit.LanguageContext;
            var siteNodes = new Dictionary <MSA.DynamicExpression, SourceSpan>();
            var generator = new TraceAstGenerator(siteNodes, context, options, sourceUnit, ast.Encoding);
            var lambda    = ast.Transform <T>(generator);

            return((MSA.Expression <T>) new CallSiteTraceInjector(siteNodes, sourceId).Visit(lambda));
        }
Пример #2
0
        public static MSA.Expression <T> /*!*/ Transform <T>(SourceUnitTree /*!*/ ast, SourceUnit /*!*/ sourceUnit,
                                                             RubyCompilerOptions /*!*/ options, int sourceId)
        {
            var siteNodes = new Dictionary <MSA.DynamicExpression, SourceSpan>();
            var context   = (RubyContext)sourceUnit.LanguageContext;

            context.CallSiteCreated = (expression, callSite) => siteNodes.Add(callSite, expression.Location);

            var generator = new AstGenerator(context, options, sourceUnit.Document, ast.Encoding, false);
            var lambda    = ast.Transform <T>(generator);

            return((MSA.Expression <T>) new CallSiteTraceInjector(siteNodes, sourceId).Visit(lambda));
        }
Пример #3
0
        FunctionDefinition ParseFunctionDefinition()
        {
            var name = Expect(TokenType.Identifier).Value.ToString();
            List <ParameterDefinition> parameters = new List <ParameterDefinition>();

            if (Accept(TokenType.SymbolOpenParenthesis))
            {
                while (true)
                {
                    if (Accept(TokenType.SymbolCloseParenthesis))
                    {
                        break;
                    }
                    else
                    {
                        Accept(TokenType.SymbolComma);
                    }
                    if (Accept(TokenType.SymbolAsterisk))
                    {
                        parameters.Add(new ParameterDefinition(null, true));
                    }
                    else
                    {
                        var paramName = Expect(TokenType.Identifier).Value.ToString();
                        if (Accept(TokenType.SymbolEquals))
                        {
                            var start = _tokenizer.NextToken.Span.Start;
                            var exp   = new SourceUnitTree(
                                Enumerable.Empty <ClassDefinition>(),
                                Enumerable.Empty <FunctionDefinition>(),
                                Enumerable.Empty <PropertyDefinition>(),
                                new[] { new ExpressionStatement(ParseAssignmentExpression()) },
                                _context
                                );
                            var end = _tokenizer.NextToken.Span.End;
                            try
                            {
                                parameters.Add(new ParameterDefinition(paramName, exp.Transform <Func <object, object> >().Compile()(null)));
                            }
                            catch (MissingMemberException)
                            {
                                _tokenizer.ErrorSink.Add(_context.SourceUnit, "関数の既定値には定数のみが使用できます。", new SourceSpan(start, end), -2, Severity.Error);
                                throw new InternalInvalidSyntaxException();
                            }
                        }
                        else if (Accept(TokenType.SymbolAsterisk))
                        {
                            parameters.Add(new ParameterDefinition(paramName, true));
                        }
                        else
                        {
                            parameters.Add(new ParameterDefinition(paramName, false));
                        }
                    }
                }
            }
            List <Statement> statements = new List <Statement>();

            Expect(TokenType.SymbolOpenBrace);
            while (!Accept(TokenType.SymbolCloseBrace))
            {
                statements.Add(ParseStatement());
            }
            return(new FunctionDefinition(name, parameters, statements));
        }