From: Jürg Billeter Date: Wed, 21 Oct 2009 19:40:36 +0000 (+0200) Subject: Support (!) non-null casts X-Git-Tag: 0.7.8~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=caf8697c7066d450acf5ce76153bed0596881d2b;p=thirdparty%2Fvala.git Support (!) non-null casts --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 2b2edde7a..9966bff0c 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -3955,6 +3955,12 @@ internal class Vala.CCodeBaseModule : CCodeModule { } public override void visit_cast_expression (CastExpression expr) { + if (expr.is_non_null_cast) { + // TODO add NULL runtime check + expr.ccodenode = expr.inner.ccodenode; + return; + } + if (expr.inner.value_type != null && gvalue_type != null && expr.inner.value_type.data_type == gvalue_type && expr.type_reference.get_type_id () != null) { // explicit conversion from GValue diff --git a/vala/valacastexpression.vala b/vala/valacastexpression.vala index f8e76c5f3..c0415b7f4 100644 --- a/vala/valacastexpression.vala +++ b/vala/valacastexpression.vala @@ -54,6 +54,8 @@ public class Vala.CastExpression : Expression { */ public bool is_silent_cast { get; set; } + public bool is_non_null_cast { get; set; } + private Expression _inner; private DataType _data_type; @@ -71,10 +73,18 @@ public class Vala.CastExpression : Expression { this.is_silent_cast = is_silent_cast; this.inner = inner; } - + + public CastExpression.non_null (Expression inner, SourceReference source_reference) { + this.inner = inner; + this.is_non_null_cast = true; + this.source_reference = source_reference; + } + public override void accept (CodeVisitor visitor) { inner.accept (visitor); - type_reference.accept (visitor); + if (!is_non_null_cast) { + type_reference.accept (visitor); + } visitor.visit_cast_expression (this); @@ -109,6 +119,16 @@ public class Vala.CastExpression : Expression { return false; } + if (is_non_null_cast) { + // (!) non-null cast + value_type = inner.value_type.copy (); + value_type.nullable = false; + + inner.target_type = inner.value_type.copy (); + + return !error; + } + type_reference.check (analyzer); // FIXME: check whether cast is allowed diff --git a/vala/valacodewriter.vala b/vala/valacodewriter.vala index 22f591935..1f28ea741 100644 --- a/vala/valacodewriter.vala +++ b/vala/valacodewriter.vala @@ -1446,6 +1446,12 @@ public class Vala.CodeWriter : CodeVisitor { } public override void visit_cast_expression (CastExpression expr) { + if (expr.is_non_null_cast) { + write_string ("(!) "); + expr.inner.accept (this); + return; + } + if (!expr.is_silent_cast) { write_string ("("); write_type (expr.type_reference); diff --git a/vala/valaparser.vala b/vala/valaparser.vala index 43687f7dc..cb544b2bb 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -944,6 +944,14 @@ public class Vala.Parser : CodeVisitor { } } break; + case TokenType.OP_NEG: + next (); + if (accept (TokenType.CLOSE_PARENS)) { + // (!) non-null cast + var inner = parse_unary_expression (); + return new CastExpression.non_null (inner, get_src (begin)); + } + break; default: break; }