diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-09-30 08:41:05 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-10-18 22:41:42 +0200 |
commit | b3bdd54eb4451bfc3d0f7e69b18b2ae5dc081af4 (patch) | |
tree | 87c188dd02dca1d2a1da408e23af19ba8242ee61 /vala/valamemberaccess.vala | |
parent | b8bc5e2e44698cef18fa4378deafd737297fb65e (diff) | |
download | vala-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.vala | 21 |
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 (); } |