natalie_parser 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/include/natalie_parser/node/colon2_node.hpp +1 -0
- data/include/natalie_parser/node/hash_node.hpp +8 -3
- data/include/natalie_parser/node/hash_pattern_node.hpp +1 -1
- data/include/natalie_parser/parser.hpp +1 -1
- data/include/natalie_parser/token.hpp +1 -0
- data/lib/natalie_parser/version.rb +1 -1
- data/src/parser.cpp +12 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b35f9b98f6bbe4ec3bf8d5d9bce2c7e082504db23f442964f2a58e1ac9e11dc7
|
4
|
+
data.tar.gz: 1fbf06aa6fae8400855ea0d363d77a1b27d78869266bfb17b0f45cf9b8a30d41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 936ec0ef70541afd5839dbe4450401d7e8713499c3536d9ac7e53eb5617671dd308eee8e4f458188a9b0890f5a7ed5d855b3011c5539b64eb31639b4140e07fc
|
7
|
+
data.tar.gz: f6deb35c75e17e5c9fb49c6092e48453e904e7c7d4b515e2c7b5fe7fe69dc656da2faa6096b665b6021557ae8c47844ec65a9e8aca1933712f35d72f4db47c50
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 2.0.0 (2022-06-24)
|
4
|
+
|
5
|
+
- FEAT: Differentiate between bare/implicit hash and explicit one
|
6
|
+
- FIX: Fix calling colon2
|
7
|
+
- FIX: Parse implicit method calls with nth ref argument
|
8
|
+
|
3
9
|
## 1.2.1 (2022-06-16)
|
4
10
|
|
5
11
|
- FIX: Fix regression with unary/infix operators (+/-)
|
@@ -23,6 +23,7 @@ public:
|
|
23
23
|
virtual Type type() const override { return Type::Colon2; }
|
24
24
|
|
25
25
|
virtual bool is_assignable() const override { return true; }
|
26
|
+
virtual bool is_callable() const override { return true; }
|
26
27
|
|
27
28
|
const SharedPtr<Node> left() const { return m_left; }
|
28
29
|
SharedPtr<String> name() const { return m_name; }
|
@@ -11,8 +11,9 @@ using namespace TM;
|
|
11
11
|
|
12
12
|
class HashNode : public Node {
|
13
13
|
public:
|
14
|
-
HashNode(const Token &token)
|
15
|
-
: Node { token }
|
14
|
+
HashNode(const Token &token, bool bare)
|
15
|
+
: Node { token }
|
16
|
+
, m_bare { bare } { }
|
16
17
|
|
17
18
|
virtual Type type() const override { return Type::Hash; }
|
18
19
|
|
@@ -23,12 +24,16 @@ public:
|
|
23
24
|
const Vector<SharedPtr<Node>> &nodes() const { return m_nodes; }
|
24
25
|
|
25
26
|
virtual void transform(Creator *creator) const override {
|
26
|
-
|
27
|
+
if (m_bare)
|
28
|
+
creator->set_type("bare_hash");
|
29
|
+
else
|
30
|
+
creator->set_type("hash");
|
27
31
|
for (auto node : m_nodes)
|
28
32
|
creator->append(node);
|
29
33
|
}
|
30
34
|
|
31
35
|
protected:
|
32
36
|
Vector<SharedPtr<Node>> m_nodes {};
|
37
|
+
bool m_bare { false };
|
33
38
|
};
|
34
39
|
}
|
@@ -104,7 +104,7 @@ private:
|
|
104
104
|
SharedPtr<Node> parse_forward_args(LocalsHashmap &);
|
105
105
|
SharedPtr<Node> parse_group(LocalsHashmap &);
|
106
106
|
SharedPtr<Node> parse_hash(LocalsHashmap &);
|
107
|
-
SharedPtr<Node> parse_hash_inner(LocalsHashmap &, Precedence, Token::Type, SharedPtr<Node> = {});
|
107
|
+
SharedPtr<Node> parse_hash_inner(LocalsHashmap &, Precedence, Token::Type, bool, SharedPtr<Node> = {});
|
108
108
|
SharedPtr<Node> parse_identifier(LocalsHashmap &);
|
109
109
|
SharedPtr<Node> parse_if(LocalsHashmap &);
|
110
110
|
void parse_interpolated_body(LocalsHashmap &, InterpolatedNode &, Token::Type);
|
data/src/parser.cpp
CHANGED
@@ -337,7 +337,7 @@ SharedPtr<Node> Parser::parse_array(LocalsHashmap &locals) {
|
|
337
337
|
return array.static_cast_as<Node>();
|
338
338
|
}
|
339
339
|
if (token.type() == Token::Type::SymbolKey) {
|
340
|
-
array->add_node(parse_hash_inner(locals, Precedence::HASH, Token::Type::RBracket));
|
340
|
+
array->add_node(parse_hash_inner(locals, Precedence::HASH, Token::Type::RBracket, true));
|
341
341
|
expect(Token::Type::RBracket, "array closing bracket");
|
342
342
|
advance();
|
343
343
|
return array.static_cast_as<Node>();
|
@@ -345,7 +345,7 @@ SharedPtr<Node> Parser::parse_array(LocalsHashmap &locals) {
|
|
345
345
|
auto value = parse_expression(Precedence::ARRAY, locals);
|
346
346
|
token = current_token();
|
347
347
|
if (token.is_hash_rocket()) {
|
348
|
-
array->add_node(parse_hash_inner(locals, Precedence::HASH, Token::Type::RBracket, value));
|
348
|
+
array->add_node(parse_hash_inner(locals, Precedence::HASH, Token::Type::RBracket, true, value));
|
349
349
|
expect(Token::Type::RBracket, "array closing bracket");
|
350
350
|
advance();
|
351
351
|
return array.static_cast_as<Node>();
|
@@ -1299,17 +1299,17 @@ SharedPtr<Node> Parser::parse_hash(LocalsHashmap &locals) {
|
|
1299
1299
|
advance();
|
1300
1300
|
SharedPtr<Node> hash;
|
1301
1301
|
if (current_token().type() == Token::Type::RCurlyBrace)
|
1302
|
-
hash = new HashNode { token };
|
1302
|
+
hash = new HashNode { token, false };
|
1303
1303
|
else
|
1304
|
-
hash = parse_hash_inner(locals, Precedence::HASH, Token::Type::RCurlyBrace);
|
1304
|
+
hash = parse_hash_inner(locals, Precedence::HASH, Token::Type::RCurlyBrace, false);
|
1305
1305
|
expect(Token::Type::RCurlyBrace, "hash closing curly brace");
|
1306
1306
|
advance();
|
1307
1307
|
return hash;
|
1308
1308
|
}
|
1309
1309
|
|
1310
|
-
SharedPtr<Node> Parser::parse_hash_inner(LocalsHashmap &locals, Precedence precedence, Token::Type closing_token_type, SharedPtr<Node> first_key) {
|
1310
|
+
SharedPtr<Node> Parser::parse_hash_inner(LocalsHashmap &locals, Precedence precedence, Token::Type closing_token_type, bool bare, SharedPtr<Node> first_key) {
|
1311
1311
|
auto token = current_token();
|
1312
|
-
SharedPtr<HashNode> hash = new HashNode { token };
|
1312
|
+
SharedPtr<HashNode> hash = new HashNode { token, bare };
|
1313
1313
|
if (!first_key)
|
1314
1314
|
first_key = parse_expression(precedence, locals);
|
1315
1315
|
hash->add_node(first_key);
|
@@ -1640,7 +1640,7 @@ SharedPtr<Node> Parser::parse_keyword_splat(LocalsHashmap &locals) {
|
|
1640
1640
|
}
|
1641
1641
|
|
1642
1642
|
SharedPtr<Node> Parser::parse_keyword_splat_wrapped_in_hash(LocalsHashmap &locals) {
|
1643
|
-
SharedPtr<HashNode> hash = new HashNode { current_token() };
|
1643
|
+
SharedPtr<HashNode> hash = new HashNode { current_token(), true };
|
1644
1644
|
hash->add_node(parse_keyword_splat(locals));
|
1645
1645
|
return hash.static_cast_as<Node>();
|
1646
1646
|
}
|
@@ -2337,12 +2337,13 @@ void Parser::parse_call_args(NodeWithArgs &node, LocalsHashmap &locals, bool bar
|
|
2337
2337
|
m_call_depth.last()--;
|
2338
2338
|
}
|
2339
2339
|
|
2340
|
-
SharedPtr<Node> Parser::parse_call_hash_args(LocalsHashmap &locals, bool
|
2340
|
+
SharedPtr<Node> Parser::parse_call_hash_args(LocalsHashmap &locals, bool bare_call, Token::Type closing_token_type, SharedPtr<Node> first_arg) {
|
2341
|
+
bool bare_hash = true; // we got here via foo(1, a: 'b') so it's always a "bare" hash
|
2341
2342
|
SharedPtr<Node> hash;
|
2342
|
-
if (
|
2343
|
-
hash = parse_hash_inner(locals, Precedence::BARE_CALL_ARG, closing_token_type, first_arg);
|
2343
|
+
if (bare_call)
|
2344
|
+
hash = parse_hash_inner(locals, Precedence::BARE_CALL_ARG, closing_token_type, bare_hash, first_arg);
|
2344
2345
|
else
|
2345
|
-
hash = parse_hash_inner(locals, Precedence::CALL_ARG, closing_token_type, first_arg);
|
2346
|
+
hash = parse_hash_inner(locals, Precedence::CALL_ARG, closing_token_type, bare_hash, first_arg);
|
2346
2347
|
if (current_token().type() == Token::Type::StarStar)
|
2347
2348
|
hash.static_cast_as<HashNode>()->add_node(parse_keyword_splat(locals));
|
2348
2349
|
return hash;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: natalie_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Morgan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-06-
|
11
|
+
date: 2022-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: NatalieParser is a zero-dependency, from-scratch, hand-written recursive
|
14
14
|
descent parser for the Ruby Programming Language.
|