-
Notifications
You must be signed in to change notification settings - Fork 29.6k
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
repl: refactor LineParser
implementation
#6171
Conversation
7da4fd4
to
c7066fb
Compare
lib/repl.js
Outdated
var wrappedCmd = false; | ||
var input = code; | ||
|
||
if (/^\s*\{/.test(code) && /\}\s*$/.test(code)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could have a semicolon after the }
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Absolutely. I didn't want to change too much code with this refactor though - I've only changed how it's run (E.g. to run after the user hits enter, instead of each line). Here's the original check: https://github.com/nodejs/node/pull/6171/files/680c88111413ad25bafbe9d7578079d6c0ca5ff0#diff-b13d72249263845d8e8341db0426f9d3L426. Could definitely change to check to include a semicolon.
CI: https://ci.nodejs.org/job/node-test-pull-request/3018/ Seems to me this changes enough properties that it is probably semver-major.. |
Looks like the CI is refusing to run with a rebase, CI without rebasing: https://ci.nodejs.org/job/node-test-pull-request/3019/ |
680c881
to
44ba60a
Compare
bc6e18c
to
34a3f83
Compare
@Fishrock123 I just rebased again on top of the changes that have occurred. Is there anything I can do to make this land? It'd be very convenient for myself and others that have built custom REPLs for transpiled programming languages. I intend to use this to support running TypeScript in a REPL with multiple lines. Although not a big deal for TypeScript, since it follows JavaScript semantics, it's might be more useful for transpile language targets that may fail the existing "should code fail" checks used in the line parser. It also helps to separate the existing concerns that are mixed as new features get added to the JavaScript implementation that aren't relevant for transpiled languages. |
@nodejs/collaborators can someone review? |
c133999
to
83c7a88
Compare
@blakeembrey ... do you still want to pursue this? |
@jasnell I will refactor again if someone will review it and thinks it's useful. Otherwise, not really. It is still required to improve interop with transpiler REPLs where recovery/new lines can be detected differently. |
Yep. Understood. I'll commit to reviewing. |
I'll review it too. |
34a3f83
to
632c58e
Compare
@targos @jasnell I just updated the PR and it's passing locally. I'm not sure if the CI build is meant to be running? Edit: I see I'm meant to wait (https://github.com/nodejs/node/blob/master/CONTRIBUTING.md#ci-testing) 😄 |
CI 3: https://ci.nodejs.org/job/node-test-commit/8236/ EDIT: CI is green |
This has conflicts. |
@blakeembrey could you rebase? |
632c58e
to
c06f9c3
Compare
Move the core logic from `LineParser` should fail handling into the recoverable error check for the REPL default eval.
c06f9c3
to
6e05e03
Compare
Move the core logic from `LineParser` should fail handling into the recoverable error check for the REPL default eval. PR-URL: #6171 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
Landed in 39d9afe. Thank you @blakeembrey. Sorry again for this taking so long! |
Thanks @jasnell for landing this, and everyone else involved 😄 |
return; | ||
} else if (!self.bufferedCommand) { | ||
self.outputStream.write('Invalid REPL keyword\n'); | ||
if (trimmedCmd) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this broke the command line debugger. Previously an empty command would be sent to the eval function. Now <enter>
is silently ignored.
The CLI debugger was using <enter>
for "repeat last command".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ugh. Ok, we can back it out if necessary but let's see if we can find a fix first.
/cc @blakeembrey
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's also see if we can get a regression test added since this case obviously wasn't being tested in CI :-(
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't think this is super urgent, was just digging through why it passed against the last 8.x nightly but not against master.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the fix is as simple as removing that else branch: #11871
This fixes a regression introduced in nodejs#6171
Move the core logic from `LineParser` should fail handling into the recoverable error check for the REPL default eval. PR-URL: nodejs#6171 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
This fixes a regression introduced in nodejs#6171 PR-URL: nodejs#11871 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Added |
Checklist
Affected core subsystem(s)
repl
Description of change
Move the core logic from
LineParser
should fail handling into the recoverable error check for the REPL default eval. This was originally from #3488, and I've split it out for separate review and hopefully speed it up. The idea is to make the current recoverable check part of the defaulteval
instead of limiting the usefulness of the REPL functionality to only JavaScript languages (E.g. enable TypeScript).