)]}'
{"oslo_versionedobjects/mypy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"776fffb6af995763d6a2e7cedb642753f52dedee","unresolved":true,"context_lines":[{"line_number":82,"context_line":"                self._fields_cache[ctx.cls.info.fullname] \u003d statement.rvalue"},{"line_number":83,"context_line":"                return"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_fields_dict_from_type_info("},{"line_number":86,"context_line":"        self, type_info: nodes.TypeInfo"},{"line_number":87,"context_line":"    ) -\u003e nodes.DictExpr | None:"},{"line_number":88,"context_line":"        \"\"\"Get the \u0027fields\u0027 dict expression for a class in the MRO."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        Checks the cache first (populated by _cache_fields), then falls back"},{"line_number":91,"context_line":"        to reading from the class body (which is only non-empty for the class"},{"line_number":92,"context_line":"        currently being processed)."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        if type_info.fullname in self._fields_cache:"},{"line_number":95,"context_line":"            return self._fields_cache[type_info.fullname]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # Fallback: read directly from the body (works for the current class)"},{"line_number":98,"context_line":"        for statement in type_info.defn.defs.body:"},{"line_number":99,"context_line":"            if ("},{"line_number":100,"context_line":"                isinstance(statement, nodes.AssignmentStmt)"},{"line_number":101,"context_line":"                and isinstance(statement.lvalues[0], nodes.NameExpr)"},{"line_number":102,"context_line":"                and statement.lvalues[0].name \u003d\u003d \"fields\""},{"line_number":103,"context_line":"                and isinstance(statement.rvalue, nodes.DictExpr)"},{"line_number":104,"context_line":"            ):"},{"line_number":105,"context_line":"                return statement.rvalue"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        return None"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"b11c0715_b22c40aa","line":105,"range":{"start_line":85,"start_character":0,"end_line":105,"end_character":39},"updated":"2026-03-20 14:42:44.000000000","message":"This is effectively a rework of `_get_fields_dict_expr` that could probably be dragged out to a separate change.","commit_id":"d438e151d5e7f21f81cf7aaca8a2b352e6a2267a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"93b1084b2924100a1b271e6547da0cab41e5a299","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                self._fields_cache[ctx.cls.info.fullname] \u003d statement.rvalue"},{"line_number":83,"context_line":"                return"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_fields_dict_from_type_info("},{"line_number":86,"context_line":"        self, type_info: nodes.TypeInfo"},{"line_number":87,"context_line":"    ) -\u003e nodes.DictExpr | None:"},{"line_number":88,"context_line":"        \"\"\"Get the \u0027fields\u0027 dict expression for a class in the MRO."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        Checks the cache first (populated by _cache_fields), then falls back"},{"line_number":91,"context_line":"        to reading from the class body (which is only non-empty for the class"},{"line_number":92,"context_line":"        currently being processed)."},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        if type_info.fullname in self._fields_cache:"},{"line_number":95,"context_line":"            return self._fields_cache[type_info.fullname]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # Fallback: read directly from the body (works for the current class)"},{"line_number":98,"context_line":"        for statement in type_info.defn.defs.body:"},{"line_number":99,"context_line":"            if ("},{"line_number":100,"context_line":"                isinstance(statement, nodes.AssignmentStmt)"},{"line_number":101,"context_line":"                and isinstance(statement.lvalues[0], nodes.NameExpr)"},{"line_number":102,"context_line":"                and statement.lvalues[0].name \u003d\u003d \"fields\""},{"line_number":103,"context_line":"                and isinstance(statement.rvalue, nodes.DictExpr)"},{"line_number":104,"context_line":"            ):"},{"line_number":105,"context_line":"                return statement.rvalue"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        return None"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"476bc76f_12ad5cdf","line":105,"range":{"start_line":85,"start_character":0,"end_line":105,"end_character":39},"in_reply_to":"b11c0715_b22c40aa","updated":"2026-04-17 22:47:50.000000000","message":"Done","commit_id":"d438e151d5e7f21f81cf7aaca8a2b352e6a2267a"}]}
