diff options
Diffstat (limited to 'vala')
-rw-r--r-- | vala/valamemberaccess.vala | 6 | ||||
-rw-r--r-- | vala/valasemanticanalyzer.vala | 27 |
2 files changed, 28 insertions, 5 deletions
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 5f32ed50a..ece44b9fd 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -47,6 +47,12 @@ public class Vala.MemberAccess : Expression { */ public string! member_name { get; set; } + /** + * Represents access to an instance member without an actual instance, + * e.g. `MyClass.an_instance_method`. + */ + public bool prototype_access { get; set; } + private Expression _inner; private Gee.List<TypeReference> type_argument_list = new ArrayList<TypeReference> (); diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 479e23e9b..20d395219 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -1249,6 +1249,15 @@ public class Vala.SemanticAnalyzer : CodeVisitor { return; } + if (expr.inner is MemberAccess) { + var ma = (MemberAccess) expr.inner; + if (ma.prototype_access) { + expr.error = true; + Report.error (expr.source_reference, "Access to instance member `%s' denied".printf (expr.inner.symbol_reference.get_full_name ())); + return; + } + } + if (expr.inner is MemberAccess || expr.inner is BaseAccess) { base_symbol = expr.inner.symbol_reference; if (base_symbol is Namespace || base_symbol is DataType) { @@ -1321,14 +1330,13 @@ public class Vala.SemanticAnalyzer : CodeVisitor { } } if (instance && !may_access_instance_members) { - expr.error = true; - Report.error (expr.source_reference, "Access to instance member `%s' denied".printf (member.get_full_name ())); - return; + expr.prototype_access = true; + // no static type for prototype access + } else { + expr.static_type = get_static_type_for_symbol (expr.symbol_reference); } current_source_file.add_symbol_dependency (expr.symbol_reference, SourceFileDependencyType.SOURCE); - - expr.static_type = get_static_type_for_symbol (expr.symbol_reference); } private bool is_type_compatible (TypeReference! expression_type, TypeReference! expected_type) { @@ -1411,6 +1419,15 @@ public class Vala.SemanticAnalyzer : CodeVisitor { return; } + if (expr.call is MemberAccess) { + var ma = (MemberAccess) expr.call; + if (ma.prototype_access) { + expr.error = true; + Report.error (expr.source_reference, "Access to instance member `%s' denied".printf (expr.call.symbol_reference.get_full_name ())); + return; + } + } + var msym = expr.call.symbol_reference; if (msym == null) { |