Add __FILE__, __LINE__ to class-, module_eval calls#106
Open
Shamaoke wants to merge 2 commits intomongoid:masterfrom
Shamaoke:issue-105
Open
Add __FILE__, __LINE__ to class-, module_eval calls#106Shamaoke wants to merge 2 commits intomongoid:masterfrom Shamaoke:issue-105
Shamaoke wants to merge 2 commits intomongoid:masterfrom
Shamaoke:issue-105
Conversation
Sometimes when exploring or debugging code it's necessary to know where
some method was defined. For this purpose `Method#source_location` is
used. It reports a filename and a line in the file with a method
definition. However, when using `Module#class_eval` and
`Module#module_eval` to dynamically define methods,
the output of `Method#source_location` is uninformative.
For this reason it's better to add `__FILE__` and `__LINE__` constants
as the second and third arguments to the aforementioned methods. This
allows `Method#source_location` to properly locate methods which was
defined dynamically.
Here's some examples:
require 'origin'
class Band
extend Origin::Forwardable
select_with :queryable
def self.queryable
Object.new.extend Origin::Queryable
end
end
Band.method(:where).source_location
# without __FILE__, __LINE__
#=> ["(eval)", 1]
# with __FILE__, __LINE__
#=> ["<...>/lib/origin/forwardable.rb", 53]
require 'origin'
module Finders
extend Origin::Forwardable
select_with :queryable
def queryable
Object.new.extend Origin::Queryable
end
end
class Band
extend Finders
end
Band.method(:where).source_location
# without __FILE__, __LINE__
#=> ["(eval)", 1]
# with __FILE__, __LINE__
#=> ["<...>/lib/origin/forwardable.rb", 47]
lib/origin/forwardable.rb
Outdated
Contributor
There was a problem hiding this comment.
I think it should be __LINE__ + 1
The actual location of a method which was defined through `Module#class-/module_eval` with a heredoc as the first argument is one line below the one reported by `Method#source_location`. For that reason it needs to increase the __LINE__ value by one.
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.
Sometimes when exploring or debugging code it's necessary to know where
some method was defined. For this purpose
Method#source_locationisused. It reports a filename and a line in the file with a method
definition. However, when using
Module#class_evalandModule#module_evalto dynamically define methods,the output of
Method#source_locationis uninformative.For this reason it's better to add
__FILE__and__LINE__constantsas the second and third arguments to the aforementioned methods. This
allows
Method#source_locationto properly locate methods which wasdefined dynamically.
Here's some examples: