summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <[email protected]>2024-03-18 12:20:44 -0400
committergit <[email protected]>2024-03-18 17:00:07 +0000
commit548203eaf2101d800ac51efd4bb61adbecaef40c (patch)
treeb9128ccaea2c7dac762e477da6db065edbeb2c64
parent8514785e946dc14e5acaa74fc127303c805688d4 (diff)
[ruby/prism] Warn on frozen_string_literal after tokens
https://github.com/ruby/prism/commit/edece87801
-rw-r--r--prism/config.yml1
-rw-r--r--prism/prism.c6
-rw-r--r--prism/templates/src/diagnostic.c.erb1
3 files changed, 6 insertions, 2 deletions
diff --git a/prism/config.yml b/prism/config.yml
index 934574b3ea..68b388f2a6 100644
--- a/prism/config.yml
+++ b/prism/config.yml
@@ -245,6 +245,7 @@ warnings:
- DUPLICATED_HASH_KEY
- DUPLICATED_WHEN_CLAUSE
- FLOAT_OUT_OF_RANGE
+ - IGNORED_FROZEN_STRING_LITERAL
- INTEGER_IN_FLIP_FLOP
- INVALID_CHARACTER
- INVALID_NUMBERED_REFERENCE
diff --git a/prism/prism.c b/prism/prism.c
index 38390b5a11..4e55ac9dbe 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -7391,8 +7391,10 @@ parser_lex_magic_comment(pm_parser_t *parser, bool semantic_token_seen) {
// We only want to handle frozen string literal comments if it's before
// any semantic tokens have been seen.
- if (!semantic_token_seen) {
- if (key_length == 21 && pm_strncasecmp(key_source, (const uint8_t *) "frozen_string_literal", 21) == 0) {
+ if (key_length == 21 && pm_strncasecmp(key_source, (const uint8_t *) "frozen_string_literal", 21) == 0) {
+ if (semantic_token_seen) {
+ pm_parser_warn_token(parser, &parser->current, PM_WARN_IGNORED_FROZEN_STRING_LITERAL);
+ } else {
parser_lex_magic_comment_frozen_string_literal_value(parser, value_start, value_end);
}
}
diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb
index 12e14beb84..1aa261d2c8 100644
--- a/prism/templates/src/diagnostic.c.erb
+++ b/prism/templates/src/diagnostic.c.erb
@@ -325,6 +325,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
[PM_WARN_EQUAL_IN_CONDITIONAL] = { "found '= literal' in conditional, should be ==", PM_WARNING_LEVEL_DEFAULT },
[PM_WARN_END_IN_METHOD] = { "END in method; use at_exit", PM_WARNING_LEVEL_DEFAULT },
[PM_WARN_FLOAT_OUT_OF_RANGE] = { "Float %.*s%s out of range", PM_WARNING_LEVEL_VERBOSE },
+ [PM_WARN_IGNORED_FROZEN_STRING_LITERAL] = { "'frozen_string_literal' is ignored after any tokens", PM_WARNING_LEVEL_VERBOSE },
[PM_WARN_INTEGER_IN_FLIP_FLOP] = { "integer literal in flip-flop", PM_WARNING_LEVEL_DEFAULT },
[PM_WARN_INVALID_CHARACTER] = { "invalid character syntax; use %s%s%s", PM_WARNING_LEVEL_DEFAULT },
[PM_WARN_INVALID_SHAREABLE_CONSTANT_VALUE] = { "invalid value for shareable_constant_value: %.*s", PM_WARNING_LEVEL_VERBOSE },