[vala] Do not require explicit `this' to access generated to_string method
- From: JÃrg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] Do not require explicit `this' to access generated to_string method
- Date: Mon, 6 Aug 2012 14:01:13 +0000 (UTC)
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]