Пример #1
0
        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));
        }
Пример #2
0
        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);
        }