private void BindFunctionDeclaration(FunctionDeclarationSyntax syntax) { var parameters = ImmutableArray.CreateBuilder <ParameterSymbol>(); var seenParameterNames = new HashSet <string>(); foreach (var parameterSyntax in syntax.Parameters) { var parameterName = parameterSyntax.Identifier.Text; var parameterType = BindTypeClause(parameterSyntax.Type); if (!seenParameterNames.Add(parameterName)) { _diagnostics.ReportParameterAlreadyDeclared(parameterSyntax.Span, parameterName); } else { var parameter = new ParameterSymbol(parameterName, parameterType); parameters.Add(parameter); } } var type = BindTypeClause(syntax.Type) ?? TypeSymbol.Void; if (type != TypeSymbol.Void) { _diagnostics.XXX_ReportFunctionsAreUnsupported(syntax.Type.Span); } var function = new FunctionSymbol(syntax.Identifier.Text, parameters.ToImmutable(), type, syntax); if (!_scope.TryDeclareFunction(function)) { _diagnostics.ReportSymbolAlreadyDeclared(syntax.Identifier.Span, function.Name); } }
private static BoundScope CreateParentScope(BoundGlobalScope previous) { var stack = new Stack <BoundGlobalScope>(); while (previous != null) { stack.Push(previous); previous = previous.Previous; } var parent = CreateRootScope(); while (stack.Count > 0) { previous = stack.Pop(); var scope = new BoundScope(parent); foreach (var f in previous.Functions) { scope.TryDeclareFunction(f); } foreach (var v in previous.Variables) { scope.TryDeclareVariable(v); } parent = scope; } return(parent); }
private static BoundScope CreateRootScope() { var result = new BoundScope(null); foreach (var f in BuiltinFunctions.GetAll()) { result.TryDeclareFunction(f); } return(result); }