]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Do not require explicit `this' to access generated to_string method
authorJürg Billeter <j@bitron.ch>
Mon, 6 Aug 2012 13:15:10 +0000 (15:15 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 6 Aug 2012 13:21:19 +0000 (15:21 +0200)
Fixes bug 614424.

vala/valamemberaccess.vala

index 8b480e1f77dce0d2dd0cd597ae9a617c647c0a6a..83441f4e921ad8dee9240ea12505be4bb2d729ad 100644 (file)
@@ -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;