Skip to content

Fix methods defined with invalid encoding are not displayed in completion #1101

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

ksaito422
Copy link

@ksaito422 ksaito422 commented Jun 3, 2025

Summary

This PR fixes a crash in IRB's method completion when a completion candidate contains characters that cannot be converted to Encoding.default_external.(#900

Problem

Currently, if a method or variable name includes characters incompatible with Encoding.default_external, triggering method completion results in an Encoding::UndefinedConversionError, which crashes the entire IRB session. This leads to a poor user experience, as the session terminates unexpectedly and work can be lost.

Solution

Instead of allowing the exception to crash the session, this change catches the encoding error and prints a warning message to stderr. To avoid flooding the console, this warning is displayed only once per session upon the first occurrence of the error.

This approach is preferable because it informs the user about the underlying encoding issue without abruptly ending their workflow.

Behavior Change

  • Before: IRB crashes when method completion is triggered with an incompatible character.
  • After: A warning is printed once, and the IRB session continues to run.

@ksaito422 ksaito422 force-pushed the invalid-encoding-method branch 3 times, most recently from 8fc5770 to 26a1d04 Compare June 7, 2025 06:14
@ksaito422 ksaito422 force-pushed the invalid-encoding-method branch from 26a1d04 to 04d2cf5 Compare June 7, 2025 08:38
@ksaito422 ksaito422 marked this pull request as ready for review June 7, 2025 08:46
i.encode(Encoding.default_external)
rescue Encoding::UndefinedConversionError
warn "Warning: Invalid encoding in method name '#{i}'. can't be converted to the locale #{Encoding.default_external}." unless @encoding_warning_shown
@encoding_warning_shown = true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not possible to show a warning safely here. I think we can just silently ignore invalid ones.
warn_while_completion

Comment on lines +199 to +200
i.encode(Encoding.default_external)
rescue Encoding::UndefinedConversionError
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add this encode and rescue to IRB::TypeCompletor#completion_candidates?
It is the default completor when RUBY_VERSION >= '3.4'

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