expressions: Validate lookup expressions

This commit is contained in:
James Westman 2022-04-30 15:20:05 -05:00
parent 3f7688a563
commit c7c32cbb4a
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
8 changed files with 50 additions and 9 deletions

View file

@ -50,12 +50,26 @@ class IdentExpr(AstNode):
def is_this(self):
return self.parent_by_type(Scope).this_name == self.tokens["ident"]
@validate()
def exists(self):
if self.is_this:
return
scope = self.parent_by_type(Scope)
if self.tokens["ident"] not in scope.get_objects():
raise CompileError(
f"Could not find object with ID '{self.tokens['ident']}'",
did_you_mean=(self.tokens['ident'], scope.get_objects().keys()),
)
@property
def gir_type(self):
scope = self.parent_by_type(Scope)
if self.is_this:
return self.parent_by_type(Scope).this_type
else:
return None
return scope.this_type
elif self.tokens["ident"] in scope.get_objects():
return scope.get_objects()[self.tokens["ident"]].gir_class
def emit_xml(self, xml: XmlEmitter):
if self.is_this:
@ -95,7 +109,21 @@ class LookupOp(InfixExpr):
@property
def gir_type(self):
return None
if parent_type := self.lhs.gir_type:
if prop := parent_type.properties.get(self.tokens["property"]):
return prop.type
@validate("property")
def property_exists(self):
if parent_type := self.lhs.gir_type:
if not (isinstance(parent_type, gir.Class) or isinstance(parent_type, gir.Interface)):
raise CompileError(f"Type {parent_type.full_name} does not have properties")
elif self.tokens["property"] not in parent_type.properties:
raise CompileError(
f"{parent_type.full_name} does not have a property called {self.tokens['property']}",
hints=["Do you need to cast the previous expression?"],
did_you_mean=(self.tokens['property'], parent_type.properties.keys()),
)
def emit_xml(self, xml: XmlEmitter):
if isinstance(self.lhs, IdentExpr) and self.lhs.is_this: