[vala/staging] vala: Move SemanticAnalyzer.vist_member_initializer() to MemberInitializer



commit 11e92fea1dc398b29145afc6af3fa25ba320470b
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Tue Feb 16 22:42:00 2021 +0100

    vala: Move SemanticAnalyzer.vist_member_initializer() to MemberInitializer

 vala/valamemberinitializer.vala        | 55 +++++++++++++++++++++++++++++++++-
 vala/valaobjectcreationexpression.vala |  2 +-
 vala/valasemanticanalyzer.vala         | 40 -------------------------
 3 files changed, 55 insertions(+), 42 deletions(-)
---
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) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]