Support C class names that ignore GIR

By writing `.MyAppComponent` instead of `MyApp.Component`, the compiler
will ignore GIR validation for that class and assume it's
application-defined.
This commit is contained in:
James Westman 2021-10-26 22:47:54 -05:00
parent 8ef65196f3
commit b387d4114f
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
3 changed files with 20 additions and 16 deletions

View file

@ -165,7 +165,7 @@ class Import(AstNode):
class Template(AstNode): class Template(AstNode):
child_type = "templates" child_type = "templates"
def __init__(self, name, class_name, object_content, namespace=None): def __init__(self, name, class_name, object_content, namespace=None, ignore_gir=False):
super().__init__() super().__init__()
assert_true(len(object_content) == 1) assert_true(len(object_content) == 1)
@ -173,26 +173,29 @@ class Template(AstNode):
self.parent_namespace = namespace self.parent_namespace = namespace
self.parent_class = class_name self.parent_class = class_name
self.object_content = object_content[0] self.object_content = object_content[0]
self.ignore_gir = ignore_gir
@validate("namespace", "class_name") @validate("namespace", "class_name")
def gir_parent(self): def gir_parent(self):
if not self.ignore_gir:
return self.root.gir.get_class(self.parent_class, self.parent_namespace) return self.root.gir.get_class(self.parent_class, self.parent_namespace)
@docs("namespace") @docs("namespace")
def namespace_docs(self): def namespace_docs(self):
return self.root.gir.namespaces[self.namespace].doc return self.root.gir.namespaces[self.parent_namespace].doc
@docs("class_name") @docs("class_name")
def class_docs(self): def class_docs(self):
return self.gir_class.doc if self.gir_parent:
return self.gir_parent.doc
def emit_xml(self, xml: XmlEmitter): def emit_xml(self, xml: XmlEmitter):
xml.start_tag("template", **{ xml.start_tag("template", **{
"class": self.name, "class": self.name,
"parent": self.gir_parent.glib_type_name, "parent": self.gir_parent.glib_type_name if self.gir_parent else self.parent_class,
}) })
self.object_content.emit_xml(xml) self.object_content.emit_xml(xml)
xml.end_tag() xml.end_tag()
@ -200,7 +203,7 @@ class Template(AstNode):
class Object(AstNode): class Object(AstNode):
child_type = "objects" child_type = "objects"
def __init__(self, class_name, object_content, namespace=None, id=None): def __init__(self, class_name, object_content, namespace=None, id=None, ignore_gir=False):
super().__init__() super().__init__()
assert_true(len(object_content) == 1) assert_true(len(object_content) == 1)
@ -208,9 +211,11 @@ class Object(AstNode):
self.class_name = class_name self.class_name = class_name
self.id = id self.id = id
self.object_content = object_content[0] self.object_content = object_content[0]
self.ignore_gir = ignore_gir
@validate("namespace", "class_name") @validate("namespace", "class_name")
def gir_class(self): def gir_class(self):
if not self.ignore_gir:
return self.root.gir.get_class(self.class_name, self.namespace) return self.root.gir.get_class(self.class_name, self.namespace)
@ -220,12 +225,13 @@ class Object(AstNode):
@docs("class_name") @docs("class_name")
def class_docs(self): def class_docs(self):
if self.gir_class:
return self.gir_class.doc return self.gir_class.doc
def emit_xml(self, xml: XmlEmitter): def emit_xml(self, xml: XmlEmitter):
xml.start_tag("object", **{ xml.start_tag("object", **{
"class": self.gir_class.glib_type_name, "class": self.gir_class.glib_type_name if self.gir_class else self.class_name,
"id": self.id, "id": self.id,
}) })
self.object_content.emit_xml(xml) self.object_content.emit_xml(xml)

View file

@ -190,7 +190,6 @@ class Repository(GirNode):
class GirContext: class GirContext:
def __init__(self): def __init__(self):
self.namespaces = {} self.namespaces = {}
self.incomplete = set([])
def add_namespace(self, namespace: Namespace): def add_namespace(self, namespace: Namespace):
@ -201,12 +200,6 @@ class GirContext:
self.namespaces[namespace.name] = namespace self.namespaces[namespace.name] = namespace
def add_incomplete(self, namespace: str):
""" Adds an "incomplete" namespace for which missing items won't cause
errors. """
self.incomplete.add(namespace)
def get_class(self, name: str, ns:str=None) -> Class: def get_class(self, name: str, ns:str=None) -> Class:
if ns is None: if ns is None:
options = [namespace.classes[name] options = [namespace.classes[name]

View file

@ -53,6 +53,11 @@ def parse(tokens) -> ast.UI:
Op("."), Op("."),
UseIdent("class_name"), UseIdent("class_name"),
), ),
Sequence(
Op("."),
UseIdent("class_name"),
UseLiteral("ignore_gir", True),
),
UseIdent("class_name"), UseIdent("class_name"),
) )