return p.get_attribute ("NoAccessorMethod") != null;
}
+ public static bool get_ccode_concrete_accessor (Property p) {
+ return p.get_attribute ("ConcreteAccessor") != null;
+ }
+
public static bool get_ccode_has_type_id (TypeSymbol sym) {
return sym.get_attribute_bool ("CCode", "has_type_id", true);
}
var ccast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (get_ccode_upper_case_name (base_type))));
ccast.add_argument (new CCodeIdentifier ("klass"));
- if (!get_ccode_no_accessor_method (prop.base_property)) {
+ if (!get_ccode_no_accessor_method (prop.base_property) && !get_ccode_concrete_accessor (prop.base_property)) {
if (prop.get_accessor != null) {
string cname = CCodeBaseModule.get_ccode_real_name (prop.get_accessor);
ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), new CCodeIdentifier (cname));
var ciface = new CCodeIdentifier ("iface");
- if (!get_ccode_no_accessor_method (prop.base_interface_property)) {
+ if (!get_ccode_no_accessor_method (prop.base_interface_property) && !get_ccode_concrete_accessor (prop.base_interface_property)) {
if (prop.get_accessor != null) {
string cname = CCodeBaseModule.get_ccode_real_name (prop.get_accessor);
if (prop.is_abstract || prop.is_virtual) {
if (prop.get_accessor != null) {
var m = getter != null ? getter.symbol as Method : null;
// ensure getter vfunc if the property is abstract
- if (m != null && (m.is_abstract || m.is_virtual || !prop.is_abstract)) {
+ if (m != null) {
getter.process (parser);
if (m.return_type is VoidType || m.get_parameters().size != 0) {
prop.set_attribute ("NoAccessorMethod", true);
}
}
}
+
prop.get_accessor.value_type.value_owned = m.return_type.value_owned;
+
+ if (!m.is_abstract && !m.is_virtual && prop.is_abstract) {
+ prop.set_attribute ("ConcreteAccessor", true);
+ }
}
} else {
prop.set_attribute ("NoAccessorMethod", true);
}
}
+
if (prop.get_attribute ("NoAccessorMethod") == null && prop.set_accessor != null && prop.set_accessor.writable) {
var m = setter != null ? setter.symbol as Method : null;
// ensure setter vfunc if the property is abstract
- if (m != null && (m.is_abstract || m.is_virtual || !prop.is_abstract)) {
+ if (m != null) {
setter.process (parser);
if (!(m.return_type is VoidType) || m.get_parameters().size != 1) {
prop.set_attribute ("NoAccessorMethod", true);
+ prop.set_attribute ("ConcreteAccessor", false);
} else {
prop.set_accessor.value_type.value_owned = m.get_parameters()[0].variable_type.value_owned;
+ if (prop.get_attribute ("ConcreteAccessor") != null && !m.is_abstract && !m.is_virtual && prop.is_abstract) {
+ prop.set_attribute ("ConcreteAccessor", true);
+ prop.set_attribute ("NoAccessorMethod", false);
+ }
}
} else {
prop.set_attribute ("NoAccessorMethod", true);
+ prop.set_attribute ("ConcreteAccessor", false);
}
}
+
if (prop.get_attribute ("NoAccessorMethod") != null) {
// gobject defaults
if (prop.get_accessor != null) {
"GenericAccessors", "",
"Diagnostics", "",
"NoAccessorMethod", "",
+ "ConcreteAccessor", "",
"HasEmitter", "",
"ReturnsModifiedPointer", "",
"Deprecated", "since", "replacement", "",