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)); }
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)); }
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)); }