Add annotation for __dir__ - #3181
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add
%a{implicitly-returns-nil}toKernel#__dir__and change its return type fromString?toString.__dir__returnsnilonly when the caller has no file path, which in practice means a stringevalwithout a file name:In ordinary code, i.e. in a file, it is always a
String. The same trade-off is already made forModule#name,Exception#backtrace,Array#first, etc.Why
__dir__is almost always used to build a path relative to the current file. The path-taking methods do not acceptnil, soString?forces every caller to handle a case that does not occur in that usage:With
String?each of these is a type error and needs__dir__ or raise/__dir__.to_s-style workarounds. With this change they type-check as written.The
nilcase is still covered bytest___dir__(assert_equal nil, eval('__dir__')), andRBS::Testskips the return-type check fornilthanks to the annotation.Notes
__method__/__callee__are left asSymbol?on purpose.🤖 Generated with Claude Code