Skip to content

Commit c18aabc

Browse files
authored
Deprecate macro fresh variables with constant names (#16293)
1 parent 7476e53 commit c18aabc

File tree

2 files changed

+35
-14
lines changed

2 files changed

+35
-14
lines changed

spec/compiler/parser/warnings_spec.cr

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
require "../../support/syntax"
22

3-
private def assert_parser_warning(source, message, *, file = __FILE__, line = __LINE__)
3+
private def assert_parser_warning(source, *messages, file = __FILE__, line = __LINE__)
44
parser = Parser.new(source)
55
parser.filename = "/test.cr"
66
parser.parse
77

88
warnings = parser.warnings.infos
9-
warnings.size.should eq(1), file: file, line: line
10-
warnings[0].should contain(message), file: file, line: line
9+
warnings.size.should eq(messages.size), file: file, line: line
10+
warnings.zip(messages) do |warning, message|
11+
warning.should contain(message), file: file, line: line
12+
end
1113
end
1214

1315
private def assert_no_parser_warning(source, *, file = __FILE__, line = __LINE__)
14-
parser = Parser.new(source)
15-
parser.filename = "/test.cr"
16-
parser.parse
17-
18-
warnings = parser.warnings.infos
19-
warnings.should eq([] of String), file: file, line: line
16+
assert_parser_warning(source, file: file, line: line)
2017
end
2118

2219
VALID_SIGILS = ['i', 'q', 'r', 'w', 'x', 'Q']
@@ -67,8 +64,8 @@ describe "Parser warnings" do
6764
end
6865
end
6966

70-
it "warns on single-letter macro fresh variables with indices" do
71-
chars = ('A'..'Z').to_a + ('a'..'z').to_a - VALID_SIGILS
67+
it "warns on single-letter macro lowercase fresh variables with indices" do
68+
chars = ('a'..'z').to_a - VALID_SIGILS
7269
chars.each do |letter|
7370
assert_parser_warning <<-CRYSTAL, "Warning: single-letter macro fresh variables with indices are deprecated"
7471
macro foo
@@ -78,6 +75,17 @@ describe "Parser warnings" do
7875
end
7976
end
8077

78+
it "warns on single-letter uppercase macro fresh variables with indices" do
79+
chars = ('A'..'Z').to_a.push('Dz') - VALID_SIGILS
80+
chars.each do |letter|
81+
assert_parser_warning <<-CRYSTAL, "Warning: macro fresh variables with constant names are deprecated", "Warning: single-letter macro fresh variables with indices are deprecated"
82+
macro foo
83+
%#{letter}{1} = 2
84+
end
85+
CRYSTAL
86+
end
87+
end
88+
8189
it "doesn't warn on sigils that resemble single-letter macro fresh variables with indices" do
8290
VALID_SIGILS.each do |letter|
8391
assert_no_parser_warning <<-CRYSTAL
@@ -88,12 +96,22 @@ describe "Parser warnings" do
8896
end
8997
end
9098

91-
it "doesn't warn on single-letter macro fresh variables without indices" do
92-
('A'..'Z').each do |letter|
99+
it "warns on single-letter uppercase macro fresh variables without indices" do
100+
chars = ('A'..'Z').to_a.push('Dz')
101+
chars.each do |letter|
102+
assert_parser_warning <<-CRYSTAL, "Warning: macro fresh variables with constant names are deprecated"
103+
macro foo
104+
%#{letter} = 1
105+
end
106+
CRYSTAL
107+
end
108+
end
109+
110+
it "doesn't warn on single-letter lowercase macro fresh variables without indices" do
111+
('a'..'z').each do |letter|
93112
assert_no_parser_warning <<-CRYSTAL
94113
macro foo
95114
%#{letter} = 1
96-
%#{letter.downcase} = 2
97115
end
98116
CRYSTAL
99117
end

src/compiler/crystal/syntax/parser.cr

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3280,6 +3280,9 @@ module Crystal
32803280
when .macro_var?
32813281
macro_var_name = @token.value.to_s
32823282
location = @token.location
3283+
if macro_var_name[0].uppercase? || macro_var_name[0].titlecase?
3284+
warnings.add_warning_at @token.location, "macro fresh variables with constant names are deprecated"
3285+
end
32833286
if current_char == '{'
32843287
if macro_var_name.size == 1
32853288
warnings.add_warning_at @token.location, "single-letter macro fresh variables with indices are deprecated"

0 commit comments

Comments
 (0)