validation: Disallow instantiating abstract classes

This commit is contained in:
James Westman 2022-04-28 23:07:32 -05:00
parent f78478bea1
commit 99e428d93c
17 changed files with 35 additions and 13 deletions

View file

@ -61,6 +61,14 @@ class Object(AstNode):
if self.tokens["class_name"] and not self.tokens["ignore_gir"] and self.gir_ns is not None:
self.root.gir.validate_class(self.tokens["class_name"], self.tokens["namespace"])
@validate("namespace", "class_name")
def not_abstract(self):
if self.gir_class is not None and self.gir_class.abstract:
raise CompileError(
f"{self.gir_class.full_name} can't be instantiated because it's abstract",
hints=[f"did you mean to use a subclass of {self.gir_class.full_name}?"]
)
@property
def gir_ns(self):
if not self.tokens["ignore_gir"]:

View file

@ -33,7 +33,7 @@ class Menu(Object):
@property
def gir_class(self):
return self.root.gir.namespaces["Gtk"].lookup_type("Gio.MenuModel")
return self.root.gir.namespaces["Gtk"].lookup_type("Gio.Menu")
class MenuAttribute(BaseAttribute):

View file

@ -33,6 +33,10 @@ class Template(Object):
ObjectContent,
]
@validate()
def not_abstract(self):
pass # does not apply to templates
def emit_xml(self, xml: XmlEmitter):
if self.gir_class:
parent = self.gir_class.glib_type_name