]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Move SemanticAnalyzer.vist_member_initializer() to MemberInitializer
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 16 Feb 2021 21:42:00 +0000 (22:42 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 16 Feb 2021 21:42:00 +0000 (22:42 +0100)
vala/valamemberinitializer.vala
vala/valaobjectcreationexpression.vala
vala/valasemanticanalyzer.vala

index bc39dad33e83163ee5b767ce61893b803e60e8fc..270e4204d3600874e0d81e5664e1efdd72ba129b 100644 (file)
@@ -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) {
index 1f792f30ced00bc5a5fffc878df476f53deca231..1126288b8abde1bf91f5332e2d5b1320cce2f73d 100644 (file)
@@ -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
index 2c8db80c0209fc15f5dde9dff8e107cfc4caadaa..9d2d7ea07e8a860c928ada8c8305a836723bbb9b 100644 (file)
@@ -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) {