}
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) {
}
foreach (MemberInitializer init in get_object_initializer ()) {
- context.analyzer.visit_member_initializer (init, type_reference);
+ init.check (context);
}
// FIXME code duplication in MethodCall.check
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) {