Skip to content

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

Merged
tompng merged 4 commits into
ruby:masterfrom
ksaito422:invalid-encoding-method
Jul 5, 2025
Merged

Fix methods defined with invalid encoding are not displayed in completion#1101
tompng merged 4 commits into
ruby:masterfrom
ksaito422:invalid-encoding-method

Conversation

@ksaito422

@ksaito422 ksaito422 commented Jun 3, 2025

Copy link
Copy Markdown
Contributor

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
Comment thread lib/irb/completion.rb Outdated
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
Copy Markdown
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

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed to ignore invalid encoding.
f8ed14a

Comment thread lib/irb/completion.rb
Comment on lines +199 to +200
i.encode(Encoding.default_external)
rescue Encoding::UndefinedConversionError

Copy link
Copy Markdown
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'

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Applied the same fix to IRB::TypeCompletor#completion_candidates.
4897ccf

@ksaito422

Copy link
Copy Markdown
Contributor Author

The CI failures don't seem related.

@tompng tompng left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good 👍

@tompng tompng merged commit fba491e into ruby:master Jul 5, 2025
60 of 64 checks passed
@tompng tompng added the bug Something isn't working label Jul 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

2 participants