mirror of
https://gitlab.gnome.org/jwestman/blueprint-compiler.git
synced 2025-05-04 15:59:08 -04:00
tests: Test custom types in lookup expressions
This commit is contained in:
parent
c7c32cbb4a
commit
52f7d790bd
10 changed files with 82 additions and 14 deletions
|
@ -32,6 +32,10 @@ class Expr(AstNode):
|
|||
def gir_type(self):
|
||||
return self.children[-1].gir_type
|
||||
|
||||
@property
|
||||
def glib_type_name(self):
|
||||
return self.children[-1].glib_type_name
|
||||
|
||||
def emit_xml(self, xml: XmlEmitter):
|
||||
self.children[-1].emit_xml(xml)
|
||||
|
||||
|
@ -71,6 +75,15 @@ class IdentExpr(AstNode):
|
|||
elif self.tokens["ident"] in scope.get_objects():
|
||||
return scope.get_objects()[self.tokens["ident"]].gir_class
|
||||
|
||||
@property
|
||||
def glib_type_name(self):
|
||||
scope = self.parent_by_type(Scope)
|
||||
|
||||
if self.is_this:
|
||||
return scope.this_type_glib_name
|
||||
elif self.tokens["ident"] in scope.get_objects():
|
||||
return scope.get_objects()[self.tokens["ident"]].glib_type_name
|
||||
|
||||
def emit_xml(self, xml: XmlEmitter):
|
||||
if self.is_this:
|
||||
raise CompilerBugError()
|
||||
|
@ -97,6 +110,10 @@ class ClosureExpr(AstNode):
|
|||
def gir_type(self):
|
||||
return self.parent.parent.gir_type
|
||||
|
||||
@property
|
||||
def glib_type_name(self):
|
||||
return self.parent.parent.glib_type_name
|
||||
|
||||
def emit_xml(self, xml: XmlEmitter):
|
||||
xml.start_tag("closure", function=self.tokens["function"], type=self.gir_type)
|
||||
for child in self.children[Expr]:
|
||||
|
@ -113,6 +130,11 @@ class LookupOp(InfixExpr):
|
|||
if prop := parent_type.properties.get(self.tokens["property"]):
|
||||
return prop.type
|
||||
|
||||
@property
|
||||
def glib_type_name(self):
|
||||
if self.gir_type is not None:
|
||||
return self.gir_type.glib_type_name
|
||||
|
||||
@validate("property")
|
||||
def property_exists(self):
|
||||
if parent_type := self.lhs.gir_type:
|
||||
|
@ -127,9 +149,9 @@ class LookupOp(InfixExpr):
|
|||
|
||||
def emit_xml(self, xml: XmlEmitter):
|
||||
if isinstance(self.lhs, IdentExpr) and self.lhs.is_this:
|
||||
xml.put_self_closing("lookup", name=self.tokens["property"], type=self.parent_by_type(Scope).this_type)
|
||||
xml.put_self_closing("lookup", name=self.tokens["property"], type=self.parent_by_type(Scope).this_type_glib_name)
|
||||
else:
|
||||
xml.start_tag("lookup", name=self.tokens["property"], type=self.lhs.gir_type)
|
||||
xml.start_tag("lookup", name=self.tokens["property"], type=self.lhs.glib_type_name)
|
||||
self.lhs.emit_xml(xml)
|
||||
xml.end_tag()
|
||||
|
||||
|
@ -141,6 +163,10 @@ class CastExpr(AstNode):
|
|||
def gir_type(self):
|
||||
return self.children[TypeName][0].gir_type
|
||||
|
||||
@property
|
||||
def glib_type_name(self):
|
||||
return self.children[TypeName][0].glib_type_name
|
||||
|
||||
def emit_xml(self, xml: XmlEmitter):
|
||||
self.children[Expr][0].emit_xml(xml)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue