コード例 #1
0
ファイル: SemanticAnalyzer.cs プロジェクト: smx-smx/ValaSharp
        // Create an access to a temporary variable, with proper reference transfer if needed
        public static Expression create_temp_access(LocalVariable local, DataType target_type)
        {
            Expression temp_access = MemberAccess.simple(local.name, local.source_reference);

            var target_owned = target_type != null && target_type.value_owned;

            if (target_owned && local.variable_type.is_disposable())
            {
                temp_access             = new ReferenceTransferExpression(temp_access, local.source_reference);
                temp_access.target_type = target_type != null?target_type.copy() : local.variable_type.copy();

                temp_access.target_type.value_owned = true;
            }
            else
            {
                temp_access.target_type = target_type != null?target_type.copy() : null;
            }

            return(temp_access);
        }
コード例 #2
0
 public override void visit_reference_transfer_expression(ReferenceTransferExpression expr)
 {
     expr.accept_children(this);
 }
コード例 #3
0
        public override bool check(CodeContext context)
        {
            if (is_checked)
            {
                return(!error);
            }

            is_checked = true;

            if (!value_type.check(context))
            {
                error = true;
                return(false);
            }

            var old_symbol = context.analyzer.current_symbol;

            context.analyzer.current_symbol = this;

            if (writable || construction)
            {
                value_parameter = new Parameter("value", value_type, source_reference);
            }

            if (prop.source_type == SourceFileType.SOURCE)
            {
                if (body == null && !prop.interface_only && !prop.is_abstract)
                {
                    /* no accessor body specified, insert default body */

                    automatic_body = true;
                    body           = new Block(source_reference);
                    var ma = MemberAccess.simple("_%s".printf(prop.name), source_reference);
                    if (readable)
                    {
                        body.add_statement(new ReturnStatement(ma, source_reference));
                    }
                    else
                    {
                        Expression value = MemberAccess.simple("value", source_reference);
                        if (value_type.value_owned)
                        {
                            value = new ReferenceTransferExpression(value, source_reference);
                        }
                        var assignment = new Assignment(ma, value, AssignmentOperator.SIMPLE, source_reference);
                        body.add_statement(new ExpressionStatement(assignment));
                    }
                }
            }

            if ((prop.is_abstract || prop.is_virtual || prop.overrides) && access == SymbolAccessibility.PRIVATE)
            {
                error = true;
                Report.error(source_reference, "Property `%s' with private accessor cannot be marked as abstract, virtual or override".printf(prop.get_full_name()));
                return(false);
            }

            if (body != null)
            {
                if (writable || construction)
                {
                    body.scope.add(value_parameter.name, value_parameter);
                }

                body.check(context);

                foreach (DataType body_error_type in body.get_error_types())
                {
                    if (!((ErrorType)body_error_type).dynamic_error)
                    {
                        Report.warning(body_error_type.source_reference, "unhandled error `%s'".printf(body_error_type.ToString()));
                    }
                }
            }

            context.analyzer.current_symbol = old_symbol;

            return(!error);
        }
コード例 #4
0
 /// <summary>
 /// Visit operation called for reference transfer expressions.
 ///
 /// <param name="expr">a reference transfer expression</param>
 /// </summary>
 public virtual void visit_reference_transfer_expression(ReferenceTransferExpression expr)
 {
 }