Example #1
0
        private void BindFunctionDeclaration(FunctionDeclarationSyntax syntax)
        {
            string funcName   = syntax.Identifier == null ? syntax.ImplicitLabel : syntax.Identifier.ToString();
            var    parameters = ImmutableArray.CreateBuilder <ParameterSymbol>();
            var    returnType = TypeDescriptionBinder.BindTypeDescription(syntax.ReturnType.TypeDescription);

            foreach (var parameter in syntax.Parameters)
            {
                string parameterName = parameter.IdentifierName.ToString();
                var    typeBind      = TypeDescriptionBinder.BindTypeDescription(parameter.Definition.TypeDescription);

                int line   = parameter.Definition.TypeDescription.Location.Line;
                int column = parameter.Definition.TypeDescription.Location.Column;
                var span   = parameter.Definition.TypeDescription.Span;

                if (typeBind == null)
                {
                    diagnostics.AddDiagnostic(Diagnostic.ReportInvalidParameterDefinition(line, column, span));
                    return;
                }

                if (typeBind.Equals(ValueTypeSymbol.Void))
                {
                    diagnostics.AddDiagnostic(Diagnostic.ReportVoidType(parameter.Definition.TypeDescription.Location, span));
                    return;
                }

                parameters.Add(new ParameterSymbol(parameterName, typeBind));
            }

            if (returnType == null)
            {
                diagnostics.AddDiagnostic(Diagnostic.ReportInvalidReturnType(syntax.ReturnType.Location, syntax.ReturnType.Span));
                return;
            }

            var functionSymbol = new FunctionSymbol(funcName, parameters.ToImmutable(), returnType, syntax);

            if (!scope.TryDefineFunction(functionSymbol))
            {
                diagnostics.AddDiagnostic(Diagnostic.ReportCannotRedefineFunction(syntax.Identifier.Location, syntax.Identifier.Span));
            }
            else
            {
                functions.Add(functionSymbol);
            }
        }