[vala/wip/effectfree: 11/44] Set lvalue to inner member access having type non-nullable struct



commit 432aa6fa15086f2dfd5aa4ed54fc7b819b43315e
Author: Luca Bruno <lucabru src gnome org>
Date:   Thu Jun 16 20:22:48 2011 +0200

    Set lvalue to inner member access having type non-nullable struct

 vala/valamemberaccess.vala |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)
---
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 5a46de0..51978ed 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -752,6 +752,8 @@ public class Vala.MemberAccess : Expression {
 				inner.value_type = this_parameter.variable_type.copy ();
 				inner.value_type.value_owned = false;
 				inner.symbol_reference = this_parameter;
+			} else {
+				check_lvalue_struct_access ();
 			}
 
 			if (context.experimental_non_null && instance && inner.value_type.nullable &&
@@ -812,6 +814,26 @@ public class Vala.MemberAccess : Expression {
 		return !error;
 	}
 
+	private void check_lvalue_struct_access () {
+		if (inner == null) {
+			return;
+		}
+		var instance = symbol_reference is Field && ((Field) symbol_reference).binding == MemberBinding.INSTANCE;
+		if (!instance) {
+			instance = symbol_reference is Method && ((Method) symbol_reference).binding == MemberBinding.INSTANCE;
+		}
+		if (!instance) {
+			instance = symbol_reference is Property && ((Property) symbol_reference).binding == MemberBinding.INSTANCE;
+		}
+		var this_access = inner.symbol_reference is Parameter && inner.symbol_reference.name == "this";
+		if (instance && inner.value_type is StructValueType && !inner.value_type.nullable && (symbol_reference is Method || lvalue) && ((inner is MemberAccess && inner.symbol_reference is Variable) || inner is ElementAccess) && !this_access) {
+			inner.lvalue = true;
+			if (inner is MemberAccess) {
+				((MemberAccess) inner).check_lvalue_struct_access ();
+			}
+		}
+	}
+
 	public override void emit (CodeGenerator codegen) {
 		if (inner != null) {
 			inner.emit (codegen);



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