diff options
author | Jürg Billeter <j@bitron.ch> | 2012-08-06 15:15:10 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2012-08-06 15:21:19 +0200 |
commit | 63ae7e3c8705aa77f4394bce502c082ca1df3a2a (patch) | |
tree | f31602051f6fc7eb0456f113a69c634d6407af88 | |
parent | 17918d3eaa33f1a8bce250db7b079a5845430503 (diff) | |
download | vala-63ae7e3c8705aa77f4394bce502c082ca1df3a2a.tar.gz |
Do not require explicit `this' to access generated to_string method
Fixes bug 614424.
-rw-r--r-- | vala/valamemberaccess.vala | 29 |
1 files changed, 29 insertions, 0 deletions
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; |