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):
|
||||
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__()
|
||||
assert_true(len(object_content) == 1)
|
||||
|
||||
|
@ -173,26 +173,29 @@ class Template(AstNode):
|
|||
self.parent_namespace = namespace
|
||||
self.parent_class = class_name
|
||||
self.object_content = object_content[0]
|
||||
self.ignore_gir = ignore_gir
|
||||
|
||||
|
||||
@validate("namespace", "class_name")
|
||||
def gir_parent(self):
|
||||
return self.root.gir.get_class(self.parent_class, self.parent_namespace)
|
||||
if not self.ignore_gir:
|
||||
return self.root.gir.get_class(self.parent_class, self.parent_namespace)
|
||||
|
||||
|
||||
@docs("namespace")
|
||||
def namespace_docs(self):
|
||||
return self.root.gir.namespaces[self.namespace].doc
|
||||
return self.root.gir.namespaces[self.parent_namespace].doc
|
||||
|
||||
@docs("class_name")
|
||||
def class_docs(self):
|
||||
return self.gir_class.doc
|
||||
if self.gir_parent:
|
||||
return self.gir_parent.doc
|
||||
|
||||
|
||||
def emit_xml(self, xml: XmlEmitter):
|
||||
xml.start_tag("template", **{
|
||||
"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)
|
||||
xml.end_tag()
|
||||
|
@ -200,7 +203,7 @@ class Template(AstNode):
|
|||
|
||||
class Object(AstNode):
|
||||
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__()
|
||||
assert_true(len(object_content) == 1)
|
||||
|
||||
|
@ -208,10 +211,12 @@ class Object(AstNode):
|
|||
self.class_name = class_name
|
||||
self.id = id
|
||||
self.object_content = object_content[0]
|
||||
self.ignore_gir = ignore_gir
|
||||
|
||||
@validate("namespace", "class_name")
|
||||
def gir_class(self):
|
||||
return self.root.gir.get_class(self.class_name, self.namespace)
|
||||
if not self.ignore_gir:
|
||||
return self.root.gir.get_class(self.class_name, self.namespace)
|
||||
|
||||
|
||||
@docs("namespace")
|
||||
|
@ -220,12 +225,13 @@ class Object(AstNode):
|
|||
|
||||
@docs("class_name")
|
||||
def class_docs(self):
|
||||
return self.gir_class.doc
|
||||
if self.gir_class:
|
||||
return self.gir_class.doc
|
||||
|
||||
|
||||
def emit_xml(self, xml: XmlEmitter):
|
||||
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,
|
||||
})
|
||||
self.object_content.emit_xml(xml)
|
||||
|
|
|
@ -190,7 +190,6 @@ class Repository(GirNode):
|
|||
class GirContext:
|
||||
def __init__(self):
|
||||
self.namespaces = {}
|
||||
self.incomplete = set([])
|
||||
|
||||
|
||||
def add_namespace(self, namespace: Namespace):
|
||||
|
@ -201,12 +200,6 @@ class GirContext:
|
|||
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:
|
||||
if ns is None:
|
||||
options = [namespace.classes[name]
|
||||
|
|
|
@ -53,6 +53,11 @@ def parse(tokens) -> ast.UI:
|
|||
Op("."),
|
||||
UseIdent("class_name"),
|
||||
),
|
||||
Sequence(
|
||||
Op("."),
|
||||
UseIdent("class_name"),
|
||||
UseLiteral("ignore_gir", True),
|
||||
),
|
||||
UseIdent("class_name"),
|
||||
)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue