def visit_expression(self, expr):
     expr = super().visit_expression(expr)
     if isinstance(expr, exprs.UnresolvedCallExpression) and isinstance(
             expr.func, exprs.PropertyAccessExpression):
         return exprs.UnresolvedMethodCallExpression(
             expr.func.object, expr.func.property_name, expr.type_args,
             expr.args)
     return expr
 def transform(self, expr):
     # TODO: convert ElementAccess to ElementGet and ElementSet expressions
     if isinstance(expr, exprs.BinaryExpression) and isinstance(
             expr.left, exprs.ElementAccessExpression):
         expr.left.object = self.main.run_plugins_on(expr.left.object)
         if self.is_map_or_array_type(expr.left.object.get_type()):
             #const right = expr.operator === "=" ? expr.right : new BinaryExpression(<Expression>expr.left.clone(), expr.operator === "+=" ? "+" : "-", expr.right);
             return exprs.UnresolvedMethodCallExpression(
                 expr.left.object, "set", [],
                 [expr.left.element_expr, expr.right])
     elif isinstance(expr, exprs.ElementAccessExpression):
         expr.object = self.main.run_plugins_on(expr.object)
         if self.is_map_or_array_type(expr.object.get_type()):
             return exprs.UnresolvedMethodCallExpression(
                 expr.object, "get", [], [expr.element_expr])
         elif isinstance(expr.element_expr, exprs.StringLiteral):
             return exprs.PropertyAccessExpression(
                 expr.object, expr.element_expr.string_value)
     return expr