*/
public bool is_abstract { get; set; }
+ /**
+ * Specifies whether this class is sealed. Sealed classes may not be
+ * subclassed.
+ */
+ public bool is_sealed { get; set; }
+
/**
* Instances of compact classes are fast to create and have a
* compact memory layout. Compact classes don't support runtime
}
}
+ if (base_class != null && base_class.is_sealed) {
+ Report.error (source_reference, "`%s' subclasses a `%s' which is a sealed class".printf (get_full_name (), base_class.get_full_name ()));
+ }
+
/* all abstract symbols defined in base classes have to be implemented in non-abstract classes */
if (!is_abstract) {
unowned Class? base_class = base_class;
// set the interface struct name
iface.symbol.set_attribute_string ("CCode", "type_cname", get_cname ());
}
+ var cls = iface.symbol as Class;
+ if (iface != null && cls != null && !cls.is_abstract && girdata["disguised"] != "1") {
+ cls.is_sealed = true;
+ }
merged = true;
}
}
unresolved_gir_symbols.add (current.gtype_struct_for);
}
+ var disguised = reader.get_attribute ("disguised");
+ if (disguised != null) {
+ current.gtype_struct_for = parse_symbol_from_string (gtype_struct_for, current.source_reference);
+ unresolved_gir_symbols.add (current.gtype_struct_for);
+ }
+
bool first_field = true;
next ();
if (ModifierFlags.ABSTRACT in flags) {
cl.is_abstract = true;
}
+ if (ModifierFlags.SEALED in flags) {
+ cl.is_sealed = true;
+ }
if (ModifierFlags.EXTERN in flags) {
cl.is_extern = true;
}
if (ModifierFlags.ABSTRACT in flags
|| ModifierFlags.VIRTUAL in flags
- || ModifierFlags.OVERRIDE in flags) {
- Report.error (f.source_reference, "abstract, virtual, and override modifiers are not applicable to fields");
+ || ModifierFlags.OVERRIDE in flags
+ || ModifierFlags.SEALED in flags) {
+ Report.error (f.source_reference, "abstract, virtual, override, and modifiers are not applicable to fields");
}
if (ModifierFlags.EXTERN in flags) {
f.is_extern = true;
if (ModifierFlags.OVERRIDE in flags) {
method.overrides = true;
}
+ if (ModifierFlags.SEALED in flags) {
+ throw new ParseError.SYNTAX ("the modifier `sealed' is not valid for methods");
+ }
if ((method.is_abstract && method.is_virtual)
|| (method.is_abstract && method.overrides)
|| (method.is_virtual && method.overrides)) {
} else {
if (ModifierFlags.ABSTRACT in flags
|| ModifierFlags.VIRTUAL in flags
- || ModifierFlags.OVERRIDE in flags) {
- throw new ParseError.SYNTAX ("the modifiers `abstract', `virtual', and `override' are not valid for %s methods", (ModifierFlags.CLASS in flags) ? "class" : "static");
+ || ModifierFlags.OVERRIDE in flags
+ || ModifierFlags.SEALED in flags) {
+ throw new ParseError.SYNTAX ("the modifiers `abstract', `virtual', `override', and `sealed' are not valid for %s methods", (ModifierFlags.CLASS in flags) ? "class" : "static");
}
}
if (ModifierFlags.OVERRIDE in flags) {
prop.overrides = true;
}
+ if (ModifierFlags.SEALED in flags) {
+ throw new ParseError.SYNTAX ("the modifier `sealed' is not valid for properties");
+ }
if (ModifierFlags.NEW in flags) {
prop.hides = true;
}
} else if (ModifierFlags.CLASS in flags) {
throw new ParseError.SYNTAX ("`class' modifier not allowed on signals");
}
+ if (ModifierFlags.SEALED in flags) {
+ throw new ParseError.SYNTAX ("`sealed' modifier not allowed on signals");
+ }
if (ModifierFlags.VIRTUAL in flags) {
sig.is_virtual = true;
}
}
if (ModifierFlags.ABSTRACT in flags
|| ModifierFlags.VIRTUAL in flags
- || ModifierFlags.OVERRIDE in flags) {
- Report.error (method.source_reference, "abstract, virtual, and override modifiers are not applicable to creation methods");
+ || ModifierFlags.OVERRIDE in flags
+ || ModifierFlags.SEALED in flags) {
+ Report.error (method.source_reference, "abstract, virtual, override, and sealed modifiers are not applicable to creation methods");
}
if (ModifierFlags.ASYNC in flags) {
method.coroutine = true;