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)); }
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)); }
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)); }