Skip to content

Commit

Permalink
Fix parsing context for lambda and modules (#3363)
Browse files Browse the repository at this point in the history
Signed-off-by: Alexandre Terrasa <alexandre.terrasa@shopify.com>
  • Loading branch information
Morriar committed Sep 10, 2020
1 parent b41bc21 commit 0e0bad3
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 2 deletions.
4 changes: 4 additions & 0 deletions test/whitequark/test_context_lambda.rb
@@ -0,0 +1,4 @@
# typed: strict

module A; ->(a = (return; 1)) {}; end
class B; ->(a = (return; 1)) {}; end
23 changes: 23 additions & 0 deletions test/whitequark/test_context_lambda.rb.parse-tree-whitequark.exp
@@ -0,0 +1,23 @@
s(:begin,
s(:module,
s(:const, nil, :A),
s(:block,
s(:send,
s(:const, nil, :Kernel), :lambda),
s(:args,
s(:optarg, :a,
s(:begin,
s(:begin,
s(:return),
s(:int, "1"))))), nil)),
s(:class,
s(:const, nil, :B), nil,
s(:block,
s(:send,
s(:const, nil, :Kernel), :lambda),
s(:args,
s(:optarg, :a,
s(:begin,
s(:begin,
s(:return),
s(:int, "1"))))), nil)))
11 changes: 9 additions & 2 deletions third_party/parser/cc/grammars/typedruby.ypp
Expand Up @@ -1490,10 +1490,14 @@ int yylex(parser::semantic_type *lval, ruby_parser::typedruby27 &driver) {
delimited_block->end);
DIAGCHECK();
}
| tLAMBDA lambda
| tLAMBDA
{
driver.lex.context.push(Context::State::LAMBDA);
}
lambda
{
auto lambda_call = driver.build.callLambda(self, $1);
auto &lambda = $2;
auto &lambda = $3;
$$ = driver.build.block(self, lambda_call,
lambda->begin,
lambda->args,
Expand Down Expand Up @@ -1593,6 +1597,7 @@ int yylex(parser::semantic_type *lval, ruby_parser::typedruby27 &driver) {
{
driver.lex.extend_static();
driver.lex.cmdarg.push(false);
driver.lex.context.push(Context::State::MODULE);
}
bodystmt kEND
{
Expand All @@ -1608,6 +1613,7 @@ int yylex(parser::semantic_type *lval, ruby_parser::typedruby27 &driver) {

driver.lex.cmdarg.pop();
driver.lex.unextend();
driver.lex.context.pop();
}
| kDEF fname
{
Expand Down Expand Up @@ -1970,6 +1976,7 @@ opt_block_args_tail:
}
f_larglist
{
driver.lex.context.pop();
driver.lex.cmdarg.push(false);
}
lambda_body
Expand Down
1 change: 1 addition & 0 deletions third_party/parser/include/ruby_parser/context.hh
Expand Up @@ -11,6 +11,7 @@ class Context {
public:
enum class State {
CLASS,
MODULE,
SCLASS,
DEF,
DEFS,
Expand Down

0 comments on commit 0e0bad3

Please sign in to comment.