mirror of
https://gitlab.gnome.org/jwestman/blueprint-compiler.git
synced 2025-05-04 15:59:08 -04:00
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:
parent
8ef65196f3
commit
b387d4114f
3 changed files with 20 additions and 16 deletions
|
@ -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)
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue