Skip to content

Commit 4c22789

Browse files
authored
parser: warn on @[deprecated_after] used without a corresponding @[deprecated] attribute (#25712)
1 parent 0037f0c commit 4c22789

File tree

5 files changed

+72
-5
lines changed

5 files changed

+72
-5
lines changed

vlib/v/parser/attribute.v

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ fn (mut p Parser) attributes() {
158158
if p.attrs.len == 0 {
159159
p.error_with_pos('attributes cannot be empty', start_pos.extend(p.tok.pos()))
160160
return
161+
} else {
162+
p.check_deprecated_attributes()
161163
}
162164
// TODO: remove when old attr syntax is removed
163165
if p.inside_struct_attr_decl && p.tok.kind == .lsbr {
@@ -170,3 +172,25 @@ fn (mut p Parser) attributes() {
170172
return
171173
}
172174
}
175+
176+
fn (mut p Parser) check_deprecated_attributes() {
177+
mut deprecated := false
178+
mut deprecated_after := false
179+
mut deprecated_after_pos := token.Pos{}
180+
for attr in p.attrs {
181+
match attr.name {
182+
'deprecated' {
183+
deprecated = true
184+
}
185+
'deprecated_after' {
186+
deprecated_after = true
187+
deprecated_after_pos = attr.pos
188+
}
189+
else {}
190+
}
191+
}
192+
if deprecated_after && !deprecated {
193+
p.warn_with_pos('@[deprecated_after] is only valid, in the presence of a `@[deprecated]` attribute',
194+
deprecated_after_pos)
195+
}
196+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
vlib/v/parser/tests/deprecated_after_without_deprecated.vv:1:1: warning: @[deprecated_after] is only valid, in the presence of a `@[deprecated]` attribute
2+
1 | @[deprecated_after: '2025-10-10']
3+
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4+
2 | fn my_fn() {
5+
3 | }
6+
vlib/v/parser/tests/deprecated_after_without_deprecated.vv:5:1: warning: @[deprecated_after] is only valid, in the presence of a `@[deprecated]` attribute
7+
3 | }
8+
4 |
9+
5 | @[deprecated_after: '2025-10-10']
10+
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11+
6 | const my_const = 123
12+
7 |
13+
vlib/v/parser/tests/deprecated_after_without_deprecated.vv:8:1: warning: @[deprecated_after] is only valid, in the presence of a `@[deprecated]` attribute
14+
6 | const my_const = 123
15+
7 |
16+
8 | @[deprecated_after: '2025-10-10']
17+
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18+
9 | type MyType = u8
19+
10 |
20+
vlib/v/parser/tests/deprecated_after_without_deprecated.vv:11:1: warning: @[deprecated_after] is only valid, in the presence of a `@[deprecated]` attribute
21+
9 | type MyType = u8
22+
10 |
23+
11 | @[deprecated_after: '2025-10-10']
24+
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25+
12 | interface MyInterface {
26+
13 | x int
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@[deprecated_after: '2025-10-10']
2+
fn my_fn() {
3+
}
4+
5+
@[deprecated_after: '2025-10-10']
6+
const my_const = 123
7+
8+
@[deprecated_after: '2025-10-10']
9+
type MyType = u8
10+
11+
@[deprecated_after: '2025-10-10']
12+
interface MyInterface {
13+
x int
14+
}

vlib/v/util/diff/diff.v

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,30 +43,32 @@ pub enum DiffTool {
4343
@[params]
4444
pub struct CompareOptions {
4545
pub:
46-
tool DiffTool @[deprecated_after: '2025-12-31']
46+
tool DiffTool @[deprecated: 'use compare_files or compare_text'; deprecated_after: '2025-12-31']
4747
// Custom args used with the diff command.
48-
args string @[deprecated_after: '2025-12-31']
48+
args string @[deprecated: 'use compare_files or compare_text'; deprecated_after: '2025-12-31']
4949
// Sets the environment variable whose value can overwrite a diff command passed to a compare function.
5050
// It also enables the use of commands that are not in the list of known diff tools.
5151
// Set it to `none` to disable it.
52-
env_overwrite_var ?string = 'VDIFF_CMD' @[deprecated_after: '2025-12-31']
52+
env_overwrite_var ?string = 'VDIFF_CMD' @[deprecated: 'use compare_files or compare_text'; deprecated_after: '2025-12-31']
5353
}
5454

5555
@[params]
5656
pub struct CompareTextOptions {
5757
CompareOptions
5858
pub:
59-
base_name string = 'base' @[deprecated_after: '2025-12-31']
60-
target_name string = 'target' @[deprecated_after: '2025-12-31']
59+
base_name string = 'base' @[deprecated: 'use compare_files or compare_text'; deprecated_after: '2025-12-31']
60+
target_name string = 'target' @[deprecated: 'use compare_files or compare_text'; deprecated_after: '2025-12-31']
6161
}
6262

6363
// Allows public checking for the available tools and prevents repeated searches
6464
// when using compare functions with automatic diff tool detection.
65+
@[deprecated: 'use compare_files or compare_text']
6566
@[deprecated_after: '2025-12-31']
6667
pub fn available_tools() []DiffTool {
6768
return []
6869
}
6970

71+
@[deprecated: 'use compare_files or compare_text']
7072
@[deprecated_after: '2025-12-31']
7173
pub fn find_working_diff_command() !string {
7274
return error('deprecated')

vlib/x/crypto/chacha20/chacha.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ pub fn (mut c Cipher) free() {
189189

190190
// reset quickly sets all Cipher's fields to default value.
191191
// This method will be deprecated.
192+
@[deprecated: 'do not use .reset() at all, create a new Cipher instead']
192193
@[deprecated_after: '2025-11-30']
193194
@[unsafe]
194195
pub fn (mut c Cipher) reset() {

0 commit comments

Comments
 (0)