def construct_operand(op): from langkit.expressions import Cast, New expr = construct(op) check_source_language( expr.type == LogicVarType or expr.type.matches(T.root_node) or expr.type.matches(T.root_node.env_el()), "Operands to a logic bind operator should be either " "a logic variable or an ASTNode, got {}".format(expr.type) ) if expr.type.matches(T.root_node.env_el()): if expr.type is not T.root_node.env_el(): expr = Cast.Expr(expr, T.root_node.env_el()) elif expr.type.matches(T.root_node): # Cast the ast node type if necessary if expr.type is not T.root_node: expr = Cast.Expr(expr, T.root_node) # If the expression is a root node, implicitly construct an # env_element from it. expr = New.StructExpr(T.root_node.env_el(), { Name('El'): expr, Name('MD'): LiteralExpr('<>', None), Name('Parents_Bindings'): LiteralExpr('null', None) }) return expr
def make_as_entity(node_expr, entity_info=None, null_check=True, abstract_expr=None): """ Helper for as_entity. Takes a resolved expression instead of an abstract one. :param ResolvedExpression node_expr: The AST node expression to wrap as an entity. :param ResolvedExpression|None entity_info: Expression to use as the entity information. If provided, its type must be T.entity_info. Otherwise, the ambient entity info is used. """ from langkit.expressions import If, IsNull, New entity_type = node_expr.type.entity # If we use the ambient entity info, make the current property an entity # one. if entity_info is None: p = PropertyDef.get() p.set_uses_entity_info() entity_info = construct(p.entity_info_arg) # Expression tree sharing is forbidden, so if we need to reference the # result of the input node expression multiple times, create a variable to # hold the input node. node_ref = (node_expr.create_result_var('Node_For_Entity') if null_check else node_expr) entity_expr = New.StructExpr( entity_type, { names.Name('El'): node_ref, names.Name('Info'): entity_info }, result_var_name=names.Name.from_lower('as_entity'), ) result = If.Expr( IsNull.construct_static(node_expr), NullExpr(entity_type), entity_expr, entity_type, abstract_expr=abstract_expr) if null_check else entity_expr result.abstract_expr = abstract_expr return result