Beispiel #1
0
        private BoundExpression BindAssignmentExpression(AssignmentExpressionSyntax syntax)
        {
            var name            = syntax.IdentifierToken.Text;
            var boundExpression = BindExpression(syntax.Expression);

            if (!_scope.TryLookupVariable(name, out var variable))
            {
                _diagnostics.ReportUndefinedName(syntax.IdentifierToken.Span, name);

                return(new BoundErrorExpression());
            }

            if (variable.IsReadOnly)
            {
                _diagnostics.ReportCannotAssign(syntax.IdentifierToken.Span, name);

                return(new BoundErrorExpression());
            }

            if (variable.Type != boundExpression.Type)
            {
                _diagnostics.ReportTypeMismatch(syntax.Expression.Span, boundExpression.Type, variable.Type);

                return(new BoundErrorExpression());
            }

            return(new BoundAssignmentExpression(variable, boundExpression));
        }
Beispiel #2
0
        private BoundExpression BindAssignmentExpression(AssignmentExpressionSyntax syntax)
        {
            var name            = syntax.IdentifierToken.Text;
            var boundExpression = BindExpression(syntax.Expression);

            if (!_scope.TryLookupVariable(name, out var variable))
            {
                _diagnostics.ReportUndefinedName(syntax.IdentifierToken.Span, name);
                return(boundExpression);
            }

            if (variable.IsReadOnly)
            {
                _diagnostics.ReportCannotAssign(syntax.EqualsToken.Span, name);
            }

            var convertedExpression = BindConversion(syntax.Expression.Span, boundExpression, variable.Type);

            return(new BoundAssignmentExpression(variable, convertedExpression));
        }