Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attempt to fix daemon crash related to ABCs #16275

Merged
merged 1 commit into from
Oct 17, 2023
Merged

Attempt to fix daemon crash related to ABCs #16275

merged 1 commit into from
Oct 17, 2023

Conversation

JukkaL
Copy link
Collaborator

@JukkaL JukkaL commented Oct 17, 2023

I couldn't reproduce the crash with a small example, but this seems to fix this crash in a large codebase:

Traceback (most recent call last):
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 234, in serve
    resp = self.run_command(command, data)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 281, in run_command
    ret = method(self, **data)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 359, in cmd_check
    return self.check(sources, export_types, is_tty, terminal_width)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 413, in check
    res = self.initialize_fine_grained(sources, is_tty, terminal_width)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 498, in initialize_fine_grained
    messages = self.fine_grained_manager.update(changed, removed)
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 267, in update
    result = self.update_one(
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 369, in update_one
    result = self.update_module(next_id, next_path, next_id in removed_set, followed)
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 431, in update_module
    result = update_module_isolated(
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 667, in update_module_isolated
    state.type_check_first_pass()
  File "/Users/jukka/src/mypy/mypy/build.py", line 2306, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "/Users/jukka/src/mypy/mypy/checker.py", line 475, in check_first_pass
    self.accept(d)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 587, in accept
    report_internal_error(err, self.errors.file, stmt.line, self.errors, self.options)
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checker.py", line 585, in accept
    stmt.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 900, in accept
    return visitor.visit_decorator(self)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 4773, in visit_decorator
    self.visit_decorator_inner(e)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 4778, in visit_decorator_inner
    self.check_func_item(e.func, name=e.func.name, allow_empty=allow_empty)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 1071, in check_func_item
    self.check_func_def(defn, typ, name, allow_empty)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 1281, in check_func_def
    self.accept(item.body)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 587, in accept
    report_internal_error(err, self.errors.file, stmt.line, self.errors, self.options)
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checker.py", line 585, in accept
    stmt.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 1226, in accept
    return visitor.visit_block(self)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 2754, in visit_block
    self.accept(s)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 587, in accept
    report_internal_error(err, self.errors.file, stmt.line, self.errors, self.options)
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checker.py", line 585, in accept
    stmt.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 1313, in accept
    return visitor.visit_assignment_stmt(self)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 2802, in visit_assignment_stmt
    self.check_assignment(s.lvalues[-1], s.rvalue, s.type is None, s.new_syntax)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 3009, in check_assignment
    rvalue_type = self.expr_checker.accept(rvalue, type_context=type_context)
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 5372, in accept
    report_internal_error(
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 5370, in accept
    typ = node.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 1907, in accept
    return visitor.visit_call_expr(self)
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 452, in visit_call_expr
    return self.visit_call_expr_inner(e, allow_none_return=allow_none_return)
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 581, in visit_call_expr_inner
    ret_type = self.check_call_expr_with_callee_type(
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 1420, in check_call_expr_with_callee_type
    ret_type, callee_type = self.check_call(
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 1514, in check_call
    return self.check_callable_call(
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 1638, in check_callable_call
    self.msg.cannot_instantiate_abstract_class(
  File "/Users/jukka/src/mypy/mypy/messages.py", line 1479, in cannot_instantiate_abstract_class
    attrs = format_string_list([f'"{a}"' for a in abstract_attributes])
  File "/Users/jukka/src/mypy/mypy/messages.py", line 2948, in format_string_list
    assert lst
AssertionError

I suspect that we first set is_abstract to true, and later the class was no longer abstract and abstract_attributes got cleared, but is_abstract was stuck at true.

I couldn't reproduce the crash with a small example, but this seems to
fix this crash in a large codebase:
```
Traceback (most recent call last):
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 234, in serve
    resp = self.run_command(command, data)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 281, in run_command
    ret = method(self, **data)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 359, in cmd_check
    return self.check(sources, export_types, is_tty, terminal_width)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 413, in check
    res = self.initialize_fine_grained(sources, is_tty, terminal_width)
  File "/Users/jukka/src/mypy/mypy/dmypy_server.py", line 498, in initialize_fine_grained
    messages = self.fine_grained_manager.update(changed, removed)
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 267, in update
    result = self.update_one(
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 369, in update_one
    result = self.update_module(next_id, next_path, next_id in removed_set, followed)
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 431, in update_module
    result = update_module_isolated(
  File "/Users/jukka/src/mypy/mypy/server/update.py", line 667, in update_module_isolated
    state.type_check_first_pass()
  File "/Users/jukka/src/mypy/mypy/build.py", line 2306, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "/Users/jukka/src/mypy/mypy/checker.py", line 475, in check_first_pass
    self.accept(d)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 587, in accept
    report_internal_error(err, self.errors.file, stmt.line, self.errors, self.options)
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checker.py", line 585, in accept
    stmt.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 900, in accept
    return visitor.visit_decorator(self)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 4773, in visit_decorator
    self.visit_decorator_inner(e)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 4778, in visit_decorator_inner
    self.check_func_item(e.func, name=e.func.name, allow_empty=allow_empty)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 1071, in check_func_item
    self.check_func_def(defn, typ, name, allow_empty)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 1281, in check_func_def
    self.accept(item.body)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 587, in accept
    report_internal_error(err, self.errors.file, stmt.line, self.errors, self.options)
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checker.py", line 585, in accept
    stmt.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 1226, in accept
    return visitor.visit_block(self)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 2754, in visit_block
    self.accept(s)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 587, in accept
    report_internal_error(err, self.errors.file, stmt.line, self.errors, self.options)
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checker.py", line 585, in accept
    stmt.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 1313, in accept
    return visitor.visit_assignment_stmt(self)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 2802, in visit_assignment_stmt
    self.check_assignment(s.lvalues[-1], s.rvalue, s.type is None, s.new_syntax)
  File "/Users/jukka/src/mypy/mypy/checker.py", line 3009, in check_assignment
    rvalue_type = self.expr_checker.accept(rvalue, type_context=type_context)
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 5372, in accept
    report_internal_error(
  File "/Users/jukka/src/mypy/mypy/errors.py", line 1261, in report_internal_error
    raise err
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 5370, in accept
    typ = node.accept(self)
  File "/Users/jukka/src/mypy/mypy/nodes.py", line 1907, in accept
    return visitor.visit_call_expr(self)
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 452, in visit_call_expr
    return self.visit_call_expr_inner(e, allow_none_return=allow_none_return)
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 581, in visit_call_expr_inner
    ret_type = self.check_call_expr_with_callee_type(
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 1420, in check_call_expr_with_callee_type
    ret_type, callee_type = self.check_call(
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 1514, in check_call
    return self.check_callable_call(
  File "/Users/jukka/src/mypy/mypy/checkexpr.py", line 1638, in check_callable_call
    self.msg.cannot_instantiate_abstract_class(
  File "/Users/jukka/src/mypy/mypy/messages.py", line 1479, in cannot_instantiate_abstract_class
    attrs = format_string_list([f'"{a}"' for a in abstract_attributes])
  File "/Users/jukka/src/mypy/mypy/messages.py", line 2948, in format_string_list
    assert lst
AssertionError
```

I suspect that we first set `is_abstract` to true, and later the class
was no longer abstract and `abstract_attributes` got cleared, but `is_abstract`
was stuck at true.
@JukkaL JukkaL merged commit 4a9e6e6 into master Oct 17, 2023
17 checks passed
@JukkaL JukkaL deleted the daemon-abstract branch October 17, 2023 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants