From: Rico Tzschichholz Date: Tue, 16 Feb 2021 21:42:00 +0000 (+0100) Subject: vala: Move SemanticAnalyzer.vist_member_initializer() to MemberInitializer X-Git-Tag: 0.51.2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=11e92fea1dc398b29145afc6af3fa25ba320470b;p=thirdparty%2Fvala.git vala: Move SemanticAnalyzer.vist_member_initializer() to MemberInitializer --- diff --git a/vala/valamemberinitializer.vala b/vala/valamemberinitializer.vala index bc39dad33..270e4204d 100644 --- a/vala/valamemberinitializer.vala +++ b/vala/valamemberinitializer.vala @@ -69,7 +69,60 @@ public class Vala.MemberInitializer : CodeNode { } public override bool check (CodeContext context) { - return initializer.check (context); + if (checked) { + return !error; + } + + checked = true; + + unowned ObjectCreationExpression? oce = parent_node as ObjectCreationExpression; + if (oce == null) { + error = true; + Report.error (source_reference, "internal: Invalid member initializer"); + return false; + } + + unowned DataType type = oce.type_reference; + + symbol_reference = SemanticAnalyzer.symbol_lookup_inherited (type.type_symbol, name); + if (!(symbol_reference is Field || symbol_reference is Property)) { + error = true; + Report.error (source_reference, "Invalid member `%s' in `%s'", name, type.type_symbol.get_full_name ()); + return false; + } + if (symbol_reference.access != SymbolAccessibility.PUBLIC) { + error = true; + Report.error (source_reference, "Access to private member `%s' denied", symbol_reference.get_full_name ()); + return false; + } + DataType member_type = null; + if (symbol_reference is Field) { + unowned Field f = (Field) symbol_reference; + member_type = f.variable_type; + } else if (symbol_reference is Property) { + unowned Property prop = (Property) symbol_reference; + member_type = prop.property_type; + if (prop.set_accessor == null || !prop.set_accessor.writable) { + error = true; + Report.error (source_reference, "Property `%s' is read-only", prop.get_full_name ()); + return false; + } + } + + initializer.formal_target_type = member_type; + initializer.target_type = initializer.formal_target_type.get_actual_type (type, null, this); + + if (!initializer.check (context)) { + return false; + } + + if (initializer.value_type == null || !initializer.value_type.compatible (initializer.target_type)) { + error = true; + Report.error (source_reference, "Invalid type for member `%s'", name); + return false; + } + + return !error; } public override void emit (CodeGenerator codegen) { diff --git a/vala/valaobjectcreationexpression.vala b/vala/valaobjectcreationexpression.vala index 1f792f30c..1126288b8 100644 --- a/vala/valaobjectcreationexpression.vala +++ b/vala/valaobjectcreationexpression.vala @@ -508,7 +508,7 @@ public class Vala.ObjectCreationExpression : Expression, CallableExpression { } foreach (MemberInitializer init in get_object_initializer ()) { - context.analyzer.visit_member_initializer (init, type_reference); + init.check (context); } // FIXME code duplication in MethodCall.check diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 2c8db80c0..9d2d7ea07 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -1045,46 +1045,6 @@ public class Vala.SemanticAnalyzer : CodeVisitor { return temp_access; } - public void visit_member_initializer (MemberInitializer init, DataType type) { - init.symbol_reference = symbol_lookup_inherited (type.type_symbol, init.name); - if (!(init.symbol_reference is Field || init.symbol_reference is Property)) { - init.error = true; - Report.error (init.source_reference, "Invalid member `%s' in `%s'", init.name, type.type_symbol.get_full_name ()); - return; - } - if (init.symbol_reference.access != SymbolAccessibility.PUBLIC) { - init.error = true; - Report.error (init.source_reference, "Access to private member `%s' denied", init.symbol_reference.get_full_name ()); - return; - } - DataType member_type = null; - if (init.symbol_reference is Field) { - unowned Field f = (Field) init.symbol_reference; - member_type = f.variable_type; - } else if (init.symbol_reference is Property) { - unowned Property prop = (Property) init.symbol_reference; - member_type = prop.property_type; - if (prop.set_accessor == null || !prop.set_accessor.writable) { - init.error = true; - Report.error (init.source_reference, "Property `%s' is read-only", prop.get_full_name ()); - return; - } - } - - init.initializer.formal_target_type = member_type; - init.initializer.target_type = init.initializer.formal_target_type.get_actual_type (type, null, init); - - if (!init.check (context)) { - return; - } - - if (init.initializer.value_type == null || !init.initializer.value_type.compatible (init.initializer.target_type)) { - init.error = true; - Report.error (init.source_reference, "Invalid type for member `%s'", init.name); - return; - } - } - unowned Struct? get_arithmetic_struct (DataType type) { unowned Struct? result = type.type_symbol as Struct; if (result == null && type is EnumValueType) {