[vala] Do not require explicit `this' to access generated to_string method



commit 63ae7e3c8705aa77f4394bce502c082ca1df3a2a
Author: JÃrg Billeter <j bitron ch>
Date:   Mon Aug 6 15:15:10 2012 +0200

    Do not require explicit `this' to access generated to_string method
    
    Fixes bug 614424.

 vala/valamemberaccess.vala |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)
---
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 8b480e1..83441f4 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -267,6 +267,21 @@ public class Vala.MemberAccess : Expression {
 
 				symbol_reference = SemanticAnalyzer.symbol_lookup_inherited (sym, member_name);
 
+				if (symbol_reference == null && may_access_instance_members) {
+					// used for generated to_string methods in enums
+					symbol_reference = this_parameter.variable_type.get_member (member_name);
+
+					if (symbol_reference != null && is_instance_symbol (symbol_reference)) {
+						// implicit this
+						inner = new MemberAccess (null, "this", source_reference);
+						inner.value_type = this_parameter.variable_type.copy ();
+						inner.value_type.value_owned = false;
+						inner.symbol_reference = this_parameter;
+
+						symbol_reference = inner.value_type.get_member (member_name);
+					}
+				}
+
 				if (symbol_reference == null) {
 					if (sym is TypeSymbol) {
 						// do not allow instance access to outer classes
@@ -833,6 +848,20 @@ public class Vala.MemberAccess : Expression {
 		return !error;
 	}
 
+	static bool is_instance_symbol (Symbol symbol) {
+		if (symbol is Field && ((Field) symbol).binding == MemberBinding.INSTANCE) {
+			return true;
+		} else if (symbol is Method && !(symbol is CreationMethod) && ((Method) symbol).binding == MemberBinding.INSTANCE) {
+			return true;
+		} else if (symbol is Property && ((Property) symbol).binding == MemberBinding.INSTANCE) {
+			return true;
+		} else if (symbol is Signal) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
 	public void check_lvalue_access () {
 		if (inner == null) {
 			return;



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