private BoundExpression BindCallExpression(CallExpressionSyntax syntax) { if (syntax.Arguments.Count == 1 && LookupType(syntax.Identifier.Text) is TypeSymbol type) { return(BindConversion(syntax.Arguments[0], type, allowExplicit: true)); } var boundArguments = ImmutableArray.CreateBuilder <BoundExpression>(); foreach (var argument in syntax.Arguments) { var boundArgument = BindExpression(argument); boundArguments.Add(boundArgument); } if (!_scope.TryLookupFunction(syntax.Identifier.Text, out var function)) { _diagnostics.ReportUndefinedFunction(syntax.Identifier.Span, syntax.Identifier.Text); return(new BoundErrorExpression()); } if (syntax.Arguments.Count != function.Parameters.Length) { _diagnostics.ReportWrongArgumentCount(syntax.Span, function.Name, function.Parameters.Length, syntax.Arguments.Count); return(new BoundErrorExpression()); } for (var i = 0; i < syntax.Arguments.Count; i++) { var argument = boundArguments[i]; var parameter = function.Parameters[i]; if (argument.Type != parameter.Type) { _diagnostics.ReportWrongArgumentType(syntax.Arguments[i].Span, parameter.Name, parameter.Type, argument.Type); return(new BoundErrorExpression()); } } return(new BoundCallExpression(function, boundArguments.ToImmutable())); }