[vala] Support (!) non-null casts
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Support (!) non-null casts
- Date: Wed, 21 Oct 2009 19:43:44 +0000 (UTC)
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]