From: Jürg Billeter Date: Mon, 6 Aug 2012 13:15:10 +0000 (+0200) Subject: Do not require explicit `this' to access generated to_string method X-Git-Tag: 0.17.4~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63ae7e3c8705aa77f4394bce502c082ca1df3a2a;p=thirdparty%2Fvala.git Do not require explicit `this' to access generated to_string method Fixes bug 614424. --- diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 8b480e1f7..83441f4e9 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;