Beispiel #1
0
        private BoundExpression BindExpression(ExpressionSyntax syntax, Type type)
        {
            var result = BindExpression(syntax);

            if (result.Type != type)
            {
                _diagnostics.ReportCannotConvert(syntax.Span, result.Type, type);
            }
            return(result);
        }
Beispiel #2
0
        private BoundExpression BindExpression(ExpressionSyntax syntax, TypeSymbol expectedType)
        {
            var expression = BindExpression(syntax);

            if (expectedType != TypeSymbol.Error && expression.Type != TypeSymbol.Error && expression.Type != expectedType)
            {
                _diagnostics.ReportCannotConvert(syntax.Span, expression.Type, expectedType);
            }

            return(expression);
        }
Beispiel #3
0
        private BoundExpression BindExpression(ExpressionSyntax syntax, TypeSymbol targetType)
        {
            var result = BindExpression(syntax);

            if (targetType != TypeSymbol.Error &&
                result.Type != TypeSymbol.Error &&
                result.Type != targetType)
            {
                diagnostics.ReportCannotConvert(syntax.Span, result.Type, targetType);
            }

            return(result);
        }
Beispiel #4
0
        private BoundExpression BindConversion(TextSpan diagnosticSpan, BoundExpression expression, TypeSymbol type, bool allowExplicit = false)
        {
            var conversion = Conversion.Classify(expression.Type, type);

            if (!conversion.Exists)
            {
                if (expression.Type != TypeSymbol.Error && type != TypeSymbol.Error)
                {
                    _diagnostics.ReportCannotConvert(diagnosticSpan, expression.Type, type);
                }

                return(new BoundErrorExpression());
            }

            if (!allowExplicit && conversion.IsExplicit)
            {
                _diagnostics.ReportCannotConvertImplicitly(diagnosticSpan, expression.Type, type);
            }

            if (conversion.IsIdentity)
            {
                return(expression);
            }

            return(new BoundConversionExpression(type, expression));
        }
Beispiel #5
0
        private BoundExpression BindAssignmentExpression(AssignmentExpressionSyntax syntax)
        {
            var name            = syntax.IdentifierToken.Text;
            var boundExpression = BindExpression(syntax.Expression);

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