[vala] Support (!) non-null casts



commit caf8697c7066d450acf5ce76153bed0596881d2b
Author: Jürg Billeter <j bitron ch>
Date:   Wed Oct 21 21:40:36 2009 +0200

    Support (!) non-null casts

 codegen/valaccodebasemodule.vala |    6 ++++++
 vala/valacastexpression.vala     |   24 ++++++++++++++++++++++--
 vala/valacodewriter.vala         |    6 ++++++
 vala/valaparser.vala             |    8 ++++++++
 4 files changed, 42 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 2b2edde..9966bff 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 f8e76c5..c0415b7 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 22f5919..1f28ea7 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 43687f7..cb544b2 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;
 			}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]