summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2012-08-06 15:15:10 +0200
committerJürg Billeter <j@bitron.ch>2012-08-06 15:21:19 +0200
commit63ae7e3c8705aa77f4394bce502c082ca1df3a2a (patch)
treef31602051f6fc7eb0456f113a69c634d6407af88
parent17918d3eaa33f1a8bce250db7b079a5845430503 (diff)
downloadvala-63ae7e3c8705aa77f4394bce502c082ca1df3a2a.tar.gz
Do not require explicit `this' to access generated to_string method
Fixes bug 614424.
-rw-r--r--vala/valamemberaccess.vala29
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;