Commit graph

183 commits

Author SHA1 Message Date
Stan Lo
cb9b885e78 [ruby/irb] Store context in RubyLex
Some background for this refactor:

1. Through a RubyLex instance's lifetime, the context passed to its methods
   should be the same.
   Given that `Context` is only initialised in `Irb#initialize`,
   this should be true.

2. When `RubyLex` is initialised, the context object should be accessible.
   This is also true in all 3 of `RubyLex.new`'s invocations.

With the above observations, we should be able to store the context in `RubyLex`
as an instance variable. And doing so will make `RubyLex`'s instance methods
easier to use and maintain.

5c8d3df2df
2023-01-14 09:19:09 +00:00
Stan Lo
019c65828b [ruby/irb] Remove redundant argument defaults from some RubyLex
methods
(https://github.com/ruby/irb/pull/502)

* Remove unnecessary parameter defaults

These methods are always called with tokens specified. So their default
`@tokens` value is never used and is misleading.

* Remove unnecessary context default

* Require tokens for `RubyLex#check_state`
2023-01-12 10:30:17 +00:00
Hiroshi SHIBATA
7e283c585e [ruby/irb] Formatting to header styles
cef125850d
2023-01-11 22:29:10 +00:00
Hiroshi SHIBATA
c7bb8d67b7 [ruby/irb] Removed Release Version and Revisions for old VCS software
07fae94862
2023-01-11 22:29:09 +00:00
Stan Lo
c693dfd7ef [ruby/irb] Drop unused arguments in RubyLex
(https://github.com/ruby/irb/pull/504)

* Simplify `RubyLex#set_prompt`

It's optional argument is never used by any caller.

* Remove the optional `p` argument from `RubyLex#set_input`

The argument is only used in a test case, which can be easily replaced by
a block argument.
2023-01-11 21:26:18 +00:00
tomoya ishida
34f8ca1714 [ruby/irb] Fix prompt and code mismatch
(https://github.com/ruby/irb/pull/386)

* fix prompt and code mismatch

* Add test for prompt and code mismatch bug

a5765d8177

Co-authored-by: Stan Lo <stan001212@gmail.com>
2023-01-02 19:25:11 +00:00
Mau Magnaguagno
ec7e082906 [ruby/irb] Refactor RubyLex#process_literal_type
(https://github.com/ruby/irb/pull/350)

Simplify part of regex ``[_a-zA-Z0-9]`` with equivalent shorthand ``\w``.
Replace case-when with match ``$1`` or default value ``?"``, making intention more clear.
2022-12-27 17:05:32 +00:00
tompng
953d4c22ed [ruby/irb] fix indent depth calculation after heredoc and embdoc
b7973dd2d2
2022-12-26 13:03:07 -08:00
tompng
f20aac5c59 [ruby/irb] fix auto-indent after multiline string
f65ec49684
2022-12-26 13:03:07 -08:00
Takashi Kokubun
c9fbc779a6 [ruby/irb] Add commands to start and use the debugger
(https://github.com/ruby/irb/pull/449)

* Seamlessly integrate a few debug commands

* Improve the break command support

* Utilize skip_src option if available

* Add step and delete commands

* Write end-to-end tests for each debugger command

* Add documentation

* Add backtrace, info, catch commands

976100c1c2
2022-11-21 08:46:27 +00:00
Takashi Kokubun
a13836e70d [ruby/irb] Allow non-identifier aliases like Pry's @ and $
(https://github.com/ruby/irb/pull/426)

* Allow non-identifier aliases

* Move the configuration to IRB.conf

* Avoid abusing method lookup for symbol aliases

* Add more alias tests

* A small optimization

* Assume non-nil Context

* Load IRB.conf earlier

e23db5132e
2022-11-03 22:09:55 +00:00
Stan Lo
c5d6a483f5 [ruby/irb] Refactor RubyLex and its tests
(https://github.com/ruby/irb/pull/427)

* Make sure `RubyLex#set_input`'s context is always present in tests

In real-world scenarios, the context should always be non-nil:
https://github.com/ruby/irb/blob/master/lib/irb.rb#L489

So we should make sure our test setup reflects that.

* Make context a required keyword

Since in practice, `set_input`'s context should always be non-nil, its
parameters should reflect that.

And since `RubyLex#check_state` is only called by `#lex` and
`#set_input`, both of which now always require context, we can assume
its context should be non-nil too.

1aeeb86203
2022-11-03 16:32:22 +00:00
tomoya ishida
a09f764ce5 [ruby/irb] Always use local variables in current context to parse code (https://github.com/ruby/irb/pull/397)
* Use local_variables for colorize, code_block_open check, nesting_level and assignment_expression check

* Check if expression is an assignment BEFORE evaluating it. evaluate might define new localvars and change result of assignment_expression?

* Add local_variables dependent code test

* pend local variable dependent test on truffleruby

code_block_open is not working on truffleruby

* Always pass context to RubyLex#lex

* Rename local_variable_assign_code generator method name

* Add assignment expression truncate test

* Add Context#local_variables and make generate_local_variables_assign_code more simple

* Update lib/irb/input-method.rb

Co-authored-by: Stan Lo <stan001212@gmail.com>

* Add a comment why assignment expression check should be done before evaluate

c8b3877281

Co-authored-by: Stan Lo <stan001212@gmail.com>
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
2022-10-18 05:44:07 +00:00
tomoya ishida
344e6c915f [ruby/irb] Fix code terminated check with heredoc and backtick (https://github.com/ruby/irb/pull/390)
* Fix backtick method def method call handled as backtick open

* Fix handling heredoc in check_string_literal

* Sort result of lexer.parse by pos in ruby<2.7. It's not sorted when the given code includes heredoc.

* Update lib/irb/ruby-lex.rb

Co-authored-by: Stan Lo <stan001212@gmail.com>

* Update lib/irb/ruby-lex.rb

Co-authored-by: Stan Lo <stan001212@gmail.com>

* Add check_string_literal test for heredoc code that does not end with newline

44bc712460

Co-authored-by: Stan Lo <stan001212@gmail.com>
2022-10-18 05:30:33 +00:00
st0012
5cab9d0ee2 [ruby/irb] Remove patches for Ruby 2.4
They were added in b34f26a0dd

0e760d2674
2022-10-03 04:59:51 +09:00
st0012
42fcbcc215 [ruby/irb] Remove unnecessary condition
daffb8bfe5
2022-10-03 04:59:50 +09:00
st0012
55e2116f2c [ruby/irb] Refactor ripper_lex_without_warning
0db0a8ddc5
2022-10-03 04:59:49 +09:00
tompng
641310ce37 [ruby/irb] Fix ripper_lex_without_warning duplicated heredoc token
45b539af39
2022-10-01 04:17:15 +09:00
manga_osyo
f279d41847 Fix warning in Lexer::Elem#[]
Changed to use `#pos` `#event` `#tok` `#state` since using Lexer::Elem#[0~4] now gives a warning.
see: 8944009be7

9adbb9af32
2021-12-24 20:44:02 +09:00
Kaíque Kandy Koga
6b64e78823 [ruby/irb] Examine indentation of in keyword when trying to type include
Use in_keyword_case_scope?

Return fast

8acc7f8dc7
2021-12-03 00:56:43 +09:00
manga_osyo
dcbe29d2ae [ruby/irb] Fix bug infinite loop when pasting multilines fo code in Ruby 2.6
Fix bug infinite loop when pasting multilines fo code in Ruby 2.6.
This is not reproduced in Ruby 2.7.
Changes added in https://github.com/ruby/irb/pull/242/files#diff-612b926e42ed78aed1a889ac1944f7d22229b3a489cc08f837a7f75eca3d3399R155 are also reflected in Ruby 2.6.

0a77f75bf0
2021-12-03 00:42:28 +09:00
schneems
2b22c93533 Compatibility with IRB
Instead of accessing the struct as an array, access it via methods. There are other places inside of this file already using this API (for example e0a5c3d2b7/lib/irb/ruby-lex.rb (L829-L830)).

This commit moves all struct array-ish calls to use their method calls instead. It is also ~1.23 faster accessing values via a method instead of as an array according to this microbenchmark:

```ruby
Elem = Struct.new(:pos, :event, :tok, :state, :message) do
  def initialize(pos, event, tok, state, message = nil)
    super(pos, event, tok, State.new(state), message)
  end

  # ...

  def to_a
    a = super
    a.pop unless a.empty?
    a
  end
end

class ElemClass
  attr_accessor :pos, :event, :tok, :state, :message

  def initialize(pos, event, tok, state, message = nil)
    @pos = pos
    @event = event
    @tok = tok
    @state = State.new(state)
    @message = message
  end

  def to_a
    if @message
      [@pos, @event, @tok, @state, @message]
    else
      [@pos, @event, @tok, @state]
    end
  end
end

# stub state class creation for now
class State; def initialize(val); end; end
```

```ruby
Benchmark.ips do |x|
  x.report("struct") { struct[1] }
  x.report("class ") { from_class.event }
  x.compare!
end; nil
```

```
Warming up --------------------------------------
              struct     1.624M i/100ms
              class      1.958M i/100ms
Calculating -------------------------------------
              struct     17.139M (± 2.6%) i/s -     86.077M in   5.025801s
              class      21.104M (± 3.4%) i/s -    105.709M in   5.015193s

Comparison:
              class : 21103826.3 i/s
              struct: 17139201.5 i/s - 1.23x  (± 0.00) slower
```
2021-12-02 15:55:42 +09:00
Kaíque Kandy Koga
80e2242da6 [ruby/irb] Update descriptions of methods
From Reidline to Reline

Update description used in take_corresponding_syntax_to_kw_do and is_the_in_correspond_to_a_for methods

Use possessive noun correctly

Second element

4fa9714d6f
2021-10-07 23:55:54 +09:00
Kaíque Kandy Koga
782d1d876b [ruby/irb] Use typed spaces when the line is inside the here documents
Use first method instead of square brackets to support 2.5 and 2.6 versions

Use tokens

Clear check_newline_depth_difference

6fec2a5d46
2021-09-22 23:26:41 +09:00
aycabta
f085a6fb69 [ruby/irb] Support symbol with backtick
0aa2425883
2021-09-10 04:59:17 +09:00
manga_osyo
86e0eecc84 [ruby/irb] Fix #256
Support int that follow on symbeg in IRB

90cb27b1bd
2021-07-23 03:13:14 +09:00
Jeremy Evans
289fd3c801 [ruby/irb] Pass local variables from workspace binding to lexer
This fixes at least an issue where irb will incorrectly assume
code opens a heredoc when it does not, such as this code:

```ruby
s1 = 'testing'
s2 = 'this'
s2 <<s1
p s1
s1
```

Ruby parses the `s2 <<s1` as `s2.<<(s1)`, not as a heredoc, because
`s2` is a local variable in scope.  irb was using ripper without
letting ripper know that `s2` was a local variable, so ripper would
lex it as a heredoc instead of a method call.

Fix the situation by prepending a line at line 0 with all local
variable definitions in scope whenever lexing.  This fixes the
heredoc issue, and potentially other issues that depend on whether
an identifier is a local variable or not.

Fixes [Bug #17530]

4ed2187f76
2021-07-10 13:44:17 +09:00
Ryuta Kamizono
fc24b0736e [ruby/irb] Fix typo ture -> true [ci skip]
783a0569e8
2021-04-26 21:13:42 +09:00
aycabta
ab89c45b90 [ruby/irb] Evaluate each toplevel statement
bc1b1d8bc3
2021-04-03 01:17:08 +09:00
aycabta
0259ee6008 [ruby/irb] Change ripper_lex_without_warning to a class method
d9f8abc17e
2021-03-24 14:39:50 +09:00
Jeremy Evans
2cc5827fdc [ruby/irb] Do not continue line if last expression is an endless range
Fixes [Bug #14824]

63414f8465
2021-03-05 22:03:05 +09:00
Nobuhiro IMAI
b0fb208218 [ruby/irb] follow up the actual line number
7aed8fe3b1
2021-02-03 00:09:32 +09:00
Nobuhiro IMAI
e80e5a2f89 [ruby/irb] use RubyLex::TerminateLineInput appropriately [Bug #17564]
* using the appropriciate exception instead of `break` so that the session
  can be continue after the `irb_source` and `irb_load` commands
* suppress extra new line due to one more `#prompt` call

bdefaa7cfd
2021-01-27 15:02:05 +09:00
aycabta
743c44ee21 [ruby/irb] Indent correctly with method calling with receiver
e7c68e74a0
2021-01-24 14:35:34 +09:00
aycabta
fc54af8aa1 [ruby/irb] Indent correctly with keyword "for" and "in"
47c83ea724
2021-01-24 14:35:26 +09:00
aycabta
fb33ec0119 [ruby/irb] Delete a doodle-level memo comment...
fc3e1d9e0c
2021-01-22 08:15:31 +09:00
Nobuyoshi Nakada
903af74bbd [ruby/irb] Ensure to restore $VERBOSE
cef474a76a
2021-01-05 18:07:18 +09:00
aycabta
0123bc9d38 [ruby/irb] Use error tokens if there are no correct tokens in the same place
For example, the broken code "%www" will result in only one error token.

9fa39a7cf3
2021-01-05 18:06:43 +09:00
aycabta
5a1866caff [ruby/irb] Use Ripper::Lexer#scan to take broken tokens
ref. https://github.com/ruby/reline/pull/242

54f90cb6c9
2021-01-05 18:06:34 +09:00
aycabta
505e01fe12 [ruby/irb] Heredoc may contain multiple newlines in a single token
Use the start token as the indentation criteria so that it works properly in
heredoc.

ref. https://github.com/ruby/reline/pull/242

9704808dfd
2021-01-05 18:06:26 +09:00
aycabta
5012512398 [ruby/irb] Handle indentations related to keyword "do" correctly
This fixes ruby/irb#158.

964643400b
2021-01-05 18:06:10 +09:00
aycabta
cce72a2411 [ruby/irb] Newline in oneliner def doesn't reset indent
This closes ruby/irb#132.

43456dcf5e
2021-01-05 18:04:45 +09:00
aycabta
31bd172185 [ruby/irb] Suppress "shadowing outer" warning
8b83fbef69
2020-12-23 21:26:25 +09:00
aycabta
841d22ea47 [ruby/reline] [ruby/irb] Handle multiple newlines in a token correctly
Co-authored-by: manga_osyo <manga.osyo@gmail.com>
Co-authored-by: ima1zumi <mariimaizumi5@gmail.com>

c59a9be82f

a7922da16b
2020-12-23 06:06:07 +09:00
aycabta
47b26795d0 [ruby/irb] Change variables handling for compatibility
26fd1a75cf
2020-12-22 23:45:43 +09:00
aycabta
8b6aaeaddf [ruby/irb] Handle rest of tokens correctly if no newline at last
f3c8edad2a
2020-12-20 16:23:58 +09:00
aycabta
dc61affd67 [ruby/reline] [ruby/irb] Call ripper only once when generating dynamic prompt
babb122a48

e6dbcb3b42
2020-12-19 02:12:11 +09:00
Nobuyoshi Nakada
b5effe07bd [ruby/irb] Fixed a typo in a comment [ci skip]
ce373417f3
2020-12-17 20:22:55 +09:00
Nobuhiro IMAI
cbf6a7f906 [ruby/irb] workaround for lack of tokens from Ripper.lex
* Fixes #38

905fb8e52e
2020-12-17 20:22:29 +09:00
Benoit Daloze
afb8aba4af [ruby/irb] Add a fallback for check_code_block that does not depend on implementation-private APIs
* Fixes https://github.com/ruby/irb/issues/133

5eb3ef3293
2020-11-22 21:00:11 +09:00