public SymbolImplementation BuildMethod(SourceMethodDefinitionSymbol methodSymbol) { var methodBody = methodSymbol.Syntax.Body; var symbolTable = (ISymbolTable) methodSymbol.Parent; _rootScope = new SymbolScope(symbolTable); _currentScope = _rootScope; var symbolContext = methodSymbol; var implementationNode = methodBody; var statements = new List<BoundStatement>(); var statementBuilder = new StatementBinder(this, symbolContext, _diagnostics); if (symbolContext.Parameters != null) { int parameterCount = symbolContext.Parameters.Length; for (int paramIndex = 0; paramIndex < parameterCount; paramIndex++) _currentScope.AddSymbol(symbolContext.Parameters[paramIndex]); } foreach (var statementNode in implementationNode.Statements) { var statement = statementBuilder.BuildStatement(statementNode); if (statement != null) statements.Add(statement); } return new SymbolImplementation(statements.ToImmutableArray(), _rootScope); }
private MethodDefinitionSymbol BindMethodDefinition(FunctionDefinitionSyntax declaration, TypeSymbol parentType) { var returnType = _symbolSet.ResolveType(declaration.ReturnType, parentType, null); Func<MethodSymbol, IEnumerable<ParameterSymbol>> lazyParameterSymbols = fd => { var parameterSymbols = new List<ParameterSymbol>(); foreach (var parameterSyntax in declaration.ParameterList.Parameters) { var parameterValueType = _symbolSet.ResolveType(parameterSyntax.Type, null, null); var parameterDirection = SyntaxFacts.GetParameterDirection(parameterSyntax.Modifiers); parameterSymbols.Add(new SourceParameterSymbol( parameterSyntax, fd, parameterValueType, parameterDirection)); } return parameterSymbols; }; var symbol = new SourceMethodDefinitionSymbol(declaration, parentType, returnType, lazyParameterSymbols); _bindingResult.AddSymbol(declaration, symbol); return symbol; }