summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-27 14:50:40 -0400
committergit <svn-admin@ruby-lang.org>2024-03-27 18:57:35 +0000
commit9b97f1f3e8c50742c25de46469389bb06ca873a7 (patch)
tree80e85dea0a2032663e49c76a7fbb707f409dda47
parent9f9c0425c314ea814c60035ddbcd41d3404a0366 (diff)
[ruby/prism] Compare duplicates keys/whens for __FILE__
https://github.com/ruby/prism/commit/85263ade63
-rw-r--r--prism/static_literals.c12
-rw-r--r--test/prism/static_literals_test.rb13
2 files changed, 16 insertions, 9 deletions
diff --git a/prism/static_literals.c b/prism/static_literals.c
index 1708e31a16..469bdfd5ea 100644
--- a/prism/static_literals.c
+++ b/prism/static_literals.c
@@ -95,13 +95,17 @@ node_hash(const pm_parser_t *parser, const pm_node_t *node) {
// Strings hash their value and mix in their flags so that different
// encodings are not considered equal.
const pm_string_t *value = &((const pm_string_node_t *) node)->unescaped;
- return murmur_hash(pm_string_source(value), pm_string_length(value) * sizeof(uint8_t)) ^ murmur_scramble((uint32_t) node->flags);
+
+ pm_node_flags_t flags = node->flags;
+ flags &= (PM_STRING_FLAGS_FORCED_BINARY_ENCODING | PM_STRING_FLAGS_FORCED_UTF8_ENCODING);
+
+ return murmur_hash(pm_string_source(value), pm_string_length(value) * sizeof(uint8_t)) ^ murmur_scramble((uint32_t) flags);
}
case PM_SOURCE_FILE_NODE: {
// Source files hash their value and mix in their flags so that
// different encodings are not considered equal.
const pm_string_t *value = &((const pm_source_file_node_t *) node)->filepath;
- return murmur_hash(pm_string_source(value), pm_string_length(value) * sizeof(uint8_t)) ^ murmur_scramble((uint32_t) node->flags);
+ return murmur_hash(pm_string_source(value), pm_string_length(value) * sizeof(uint8_t));
}
case PM_REGULAR_EXPRESSION_NODE: {
// Regular expressions hash their value and mix in their flags so
@@ -316,8 +320,6 @@ pm_compare_regular_expression_nodes(PRISM_ATTRIBUTE_UNUSED const pm_parser_t *pa
*/
pm_node_t *
pm_static_literals_add(const pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *node) {
- if (!PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) return NULL;
-
switch (PM_NODE_TYPE(node)) {
case PM_INTEGER_NODE:
case PM_SOURCE_LINE_NODE:
@@ -435,8 +437,6 @@ pm_rational_inspect(pm_buffer_t *buffer, pm_rational_node_t *node) {
*/
PRISM_EXPORTED_FUNCTION void
pm_static_literal_inspect(pm_buffer_t *buffer, const pm_parser_t *parser, const pm_node_t *node) {
- assert(PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL));
-
switch (PM_NODE_TYPE(node)) {
case PM_FALSE_NODE:
pm_buffer_append_string(buffer, "false", 5);
diff --git a/test/prism/static_literals_test.rb b/test/prism/static_literals_test.rb
index 2669931974..31c802bf90 100644
--- a/test/prism/static_literals_test.rb
+++ b/test/prism/static_literals_test.rb
@@ -32,6 +32,7 @@ module Prism
assert_warning("1ri", "1ri", "(0+(1/1)*i)")
assert_warning("1.0ri", "1.0ri", "(0+(1/1)*i)")
+ assert_warning("__FILE__", "\"#{__FILE__}\"", __FILE__)
assert_warning("\"#{__FILE__}\"")
assert_warning("\"foo\"")
@@ -50,17 +51,23 @@ module Prism
private
+ class NullWarning
+ def message
+ ""
+ end
+ end
+
def parse_warnings(left, right)
warnings = []
- warnings << Prism.parse(<<~RUBY, filepath: __FILE__).warnings.first
+ warnings << (Prism.parse(<<~RUBY, filepath: __FILE__).warnings.first || NullWarning.new)
{
#{left} => 1,
#{right} => 2
}
RUBY
- warnings << Prism.parse(<<~RUBY, filepath: __FILE__).warnings.first
+ warnings << (Prism.parse(<<~RUBY, filepath: __FILE__).warnings.first || NullWarning.new)
case foo
when #{left}
when #{right}
@@ -79,7 +86,7 @@ module Prism
end
def refute_warning(left, right)
- assert_empty parse_warnings(left, right).compact
+ assert_empty parse_warnings(left, right).grep_v(NullWarning)
end
end
end