summaryrefslogtreecommitdiff
path: root/vala/valamemberaccess.vala
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2020-09-30 08:41:05 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2020-10-18 22:41:42 +0200
commitb3bdd54eb4451bfc3d0f7e69b18b2ae5dc081af4 (patch)
tree87c188dd02dca1d2a1da408e23af19ba8242ee61 /vala/valamemberaccess.vala
parentb8bc5e2e44698cef18fa4378deafd737297fb65e (diff)
downloadvala-b3bdd54eb4451bfc3d0f7e69b18b2ae5dc081af4.tar.gz
WIP vala: Allow explicit access to class members using the "class" keywordwip/explicit-class-access
Diffstat (limited to 'vala/valamemberaccess.vala')
-rw-r--r--vala/valamemberaccess.vala21
1 files changed, 20 insertions, 1 deletions
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index b1cc20ada..4a6bda128 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -402,6 +402,22 @@ public class Vala.MemberAccess : Expression {
may_access_klass_members = true;
}
}
+ } else if (inner is ClassAccess) {
+ unowned Class cl = (Class) inner.symbol_reference;
+
+ while (cl != null) {
+ symbol_reference = cl.scope.lookup (member_name);
+ if (symbol_reference is Method && ((Method) symbol_reference).binding == MemberBinding.CLASS) {
+ may_access_klass_members = true;
+ break;
+ } else if (symbol_reference is Field && ((Field) symbol_reference).binding == MemberBinding.CLASS) {
+ may_access_klass_members = true;
+ break;
+ } else {
+ symbol_reference = null;
+ }
+ cl = cl.base_class;
+ }
}
if (inner is MemberAccess && inner.symbol_reference is TypeParameter) {
@@ -916,12 +932,15 @@ public class Vala.MemberAccess : Expression {
value_type.value_owned = target_type.value_owned;
}
} else {
- // implicit this access
+ // implicit this or class access
if (instance && inner == null) {
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;
+ } else if (klass && inner == null) {
+ inner = new ClassAccess (source_reference);
+ inner.check (context);
} else {
check_lvalue_access ();
}