Example #1
0
        private BoundExpression BindNameExpression(NameExpressionSyntax syntax)
        {
            var name = syntax.IdentifierToken.Text;

            if (!_scope.TryLookup(name, out var variable))
            {
                _diagnostics.ReportUndefinedName(syntax.IdentifierToken.Span, name);
                return(new BoundLiteralExpression(0));
            }

            return(new BoundVariableExpression(variable));
        }
Example #2
0
        private BoundExpression BindNameExpression(NameExpressionSyntax syntax)
        {
            var name = syntax.IdentifierToken.Text;

            if (string.IsNullOrEmpty(name))
            {
                // This means the token was inserted by the parser. We already
                // reported error so we can just return an error expression.
                return(new BoundLiteralExpression(0));
            }

            if (!_scope.TryLookup(name, out var variable))
            {
                _diagnostics.ReportUndefinedName(syntax.IdentifierToken.Span, name);
                return(new BoundLiteralExpression(0));
            }

            return(new BoundVariableExpression(variable));
        }
Example #3
0
        private BoundExpression BindAssignmentExpression(AssignmentExpressionSyntax syntax)
        {
            var name            = syntax.IdentifierToken.Text;
            var boundExpression = BindExpression(syntax.Expression);
            var boundType       = boundExpression.Type;

            if (!_scope.TryLookup(name, out var variable))
            {
                _diagnostics.ReportUndefinedName(syntax.IdentifierToken.Span, name);
                return(boundExpression);
            }
            if (variable.IsReadOnly)
            {
                _diagnostics.ReportCannotAssign(syntax.EqualsToken.Span, name);
            }
            if (boundExpression.Type != variable.Type)
            {
                _diagnostics.ReportCannotConvert(syntax.Expression.Span, boundExpression.Type, variable.Type);
                return(boundExpression);
            }
            return(new BoundAssignmentExpression(variable, boundExpression));
        }