[vala/staging] vala: Move SemanticAnalyzer.vist_member_initializer() to MemberInitializer
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] vala: Move SemanticAnalyzer.vist_member_initializer() to MemberInitializer
- Date: Tue, 16 Feb 2021 21:57:38 +0000 (UTC)
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]