Skip to content

Commit ddecb76

Browse files
authored
Rollup merge of #156363 - scrabsha:attributes/expect-string-literal, r=JonathanBrouwer
`rustc_attr_parsing`: add `AcceptContext::expect_string_literal`
2 parents 3401857 + dcdba78 commit ddecb76

23 files changed

Lines changed: 142 additions & 205 deletions

compiler/rustc_ast/src/attr/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,7 @@ pub fn list_contains_name(items: &[MetaItemInner], name: Symbol) -> bool {
845845
}
846846

847847
impl MetaItemLit {
848-
pub fn value_str(&self) -> Option<Symbol> {
848+
pub fn value_as_str(&self) -> Option<Symbol> {
849849
LitKind::from_token_lit(self.as_token_lit()).ok().and_then(|lit| lit.str())
850850
}
851851
}

compiler/rustc_attr_parsing/src/attributes/cfg.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ fn parse_cfg_entry_version(
135135
cx.emit_err(session_diagnostics::ExpectedSingleVersionLiteral { span: list.span })
136136
);
137137
};
138-
let Some(version_lit) = version.lit() else {
138+
let Some(version_lit) = version.as_lit() else {
139139
return Err(
140140
cx.emit_err(session_diagnostics::ExpectedVersionLiteral { span: version.span() })
141141
);
142142
};
143-
let Some(version_str) = version_lit.value_str() else {
143+
let Some(version_str) = version_lit.value_as_str() else {
144144
return Err(
145145
cx.emit_err(session_diagnostics::ExpectedVersionLiteral { span: version_lit.span })
146146
);

compiler/rustc_attr_parsing/src/attributes/cfi_encoding.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ impl SingleAttributeParser for CfiEncodingParser {
1313
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
1414
let name_value = cx.expect_name_value(args, cx.attr_span, Some(sym::cfi_encoding))?;
1515

16-
let Some(value_str) = name_value.value_as_str() else {
17-
cx.adcx().expected_string_literal(name_value.value_span, None);
18-
return None;
19-
};
16+
let value_str = cx.expect_string_literal(name_value)?;
2017

2118
if value_str.as_str().trim().is_empty() {
2219
cx.adcx().expected_non_empty_string_literal(name_value.value_span);

compiler/rustc_attr_parsing/src/attributes/codegen_attrs.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,7 @@ impl SingleAttributeParser for ExportNameParser {
119119

120120
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
121121
let nv = cx.expect_name_value(args, cx.attr_span, None)?;
122-
let Some(name) = nv.value_as_str() else {
123-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
124-
return None;
125-
};
122+
let name = cx.expect_string_literal(nv)?;
126123
if name.as_str().contains('\0') {
127124
// `#[export_name = ...]` will be converted to a null-terminated string,
128125
// so it may not contain any null characters.
@@ -484,8 +481,7 @@ fn parse_tf_attribute(
484481
}
485482

486483
// Use value
487-
let Some(value_str) = value.value_as_str() else {
488-
cx.adcx().expected_string_literal(value.value_span, Some(value.value_as_lit()));
484+
let Some(value_str) = cx.expect_string_literal(value) else {
489485
return features;
490486
};
491487
for feature in value_str.as_str().split(",") {
@@ -600,8 +596,10 @@ impl SingleAttributeParser for SanitizeParser {
600596
return;
601597
}
602598
None => {
603-
cx.adcx()
604-
.expected_string_literal(value.value_span, Some(value.value_as_lit()));
599+
cx.adcx().expected_specific_argument_strings(
600+
value.value_span,
601+
&[sym::on, sym::off],
602+
);
605603
return;
606604
}
607605
};

compiler/rustc_attr_parsing/src/attributes/confusables.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ impl AttributeParser for ConfusablesParser {
1919
}
2020

2121
for param in list.mixed() {
22-
let span = param.span();
23-
24-
let Some(lit) = param.lit().and_then(|i| i.value_str()) else {
25-
cx.adcx().expected_string_literal(span, param.lit());
22+
let Some(lit) = cx.expect_string_literal(param) else {
2623
continue;
2724
};
2825

compiler/rustc_attr_parsing/src/attributes/crate_level.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ impl SingleAttributeParser for CrateNameParser {
1717
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
1818
let n = cx.expect_name_value(args, cx.attr_span, None)?;
1919

20-
let Some(name) = n.value_as_str() else {
21-
cx.adcx().expected_string_literal(n.value_span, Some(n.value_as_lit()));
22-
return None;
23-
};
20+
let name = cx.expect_string_literal(n)?;
2421

2522
Some(AttributeKind::CrateName { name, name_span: n.value_span, attr_span: cx.attr_span })
2623
}
@@ -44,10 +41,7 @@ impl CombineAttributeParser for CrateTypeParser {
4441
) -> impl IntoIterator<Item = Self::Item> {
4542
let n = cx.expect_name_value(args, cx.attr_span, None)?;
4643

47-
let Some(crate_type) = n.value_as_str() else {
48-
cx.adcx().expected_string_literal(n.value_span, Some(n.value_as_lit()));
49-
return None;
50-
};
44+
let crate_type = cx.expect_string_literal(n)?;
5145

5246
let Ok(crate_type) = crate_type.try_into() else {
5347
// We don't error on invalid `#![crate_type]` when not applied to a crate

compiler/rustc_attr_parsing/src/attributes/debugger.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ impl CombineAttributeParser for DebuggerViualizerParser {
3434
}
3535
};
3636

37-
let Some(path) = args.value_as_str() else {
38-
cx.adcx().expected_string_literal(args.value_span, Some(args.value_as_lit()));
39-
return None;
40-
};
37+
let path = cx.expect_string_literal(args)?;
4138

4239
Some(DebugVisualizer { span: ident.span.to(args.value_span), visualizer_type, path })
4340
}

compiler/rustc_attr_parsing/src/attributes/doc.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,15 @@ impl DocParser {
255255
}
256256
ArgParser::List(list) => {
257257
for i in list.mixed() {
258-
let Some(alias) = i.lit().and_then(|i| i.value_str()) else {
259-
cx.adcx().expected_string_literal(i.span(), i.lit());
258+
let Some(alias) = cx.expect_string_literal(i) else {
260259
continue;
261260
};
262261

263262
self.add_alias(cx, alias, i.span());
264263
}
265264
}
266265
ArgParser::NameValue(nv) => {
267-
let Some(alias) = nv.value_as_str() else {
268-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
266+
let Some(alias) = cx.expect_string_literal(nv) else {
269267
return;
270268
};
271269
self.add_alias(cx, alias, nv.value_span);

compiler/rustc_attr_parsing/src/attributes/inline.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,11 @@ impl SingleAttributeParser for RustcForceInlineParser {
7777
ArgParser::List(list) => {
7878
let l = cx.expect_single(list)?;
7979

80-
let Some(reason) = l.lit().and_then(|i| i.kind.str()) else {
81-
cx.adcx().expected_string_literal(l.span(), l.lit());
82-
return None;
83-
};
84-
85-
Some(reason)
86-
}
87-
ArgParser::NameValue(v) => {
88-
let Some(reason) = v.value_as_str() else {
89-
cx.adcx().expected_string_literal(v.value_span, Some(v.value_as_lit()));
90-
return None;
91-
};
80+
let reason = cx.expect_string_literal(l)?;
9281

9382
Some(reason)
9483
}
84+
ArgParser::NameValue(v) => cx.expect_string_literal(v),
9585
};
9686

9787
Some(AttributeKind::Inline(

compiler/rustc_attr_parsing/src/attributes/link_attrs.rs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ impl SingleAttributeParser for LinkNameParser {
3737

3838
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
3939
let nv = cx.expect_name_value(args, cx.attr_span, None)?;
40-
let Some(name) = nv.value_as_str() else {
41-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
42-
return None;
43-
};
40+
let name = cx.expect_string_literal(nv)?;
4441

4542
if name.as_str().contains('\0') {
4643
// `#[link_name = ...]` will be converted to a null-terminated string,
@@ -267,8 +264,7 @@ impl LinkParser {
267264
let Some(nv) = cx.expect_name_value(item.args(), item.span(), Some(sym::name)) else {
268265
return false;
269266
};
270-
let Some(link_name) = nv.value_as_str() else {
271-
cx.adcx().expected_string_literal(nv.args_span(), Some(nv.value_as_lit()));
267+
let Some(link_name) = cx.expect_string_literal(nv) else {
272268
return false;
273269
};
274270

@@ -297,8 +293,7 @@ impl LinkParser {
297293
let Some(nv) = cx.expect_name_value(item.args(), item.span(), Some(sym::kind)) else {
298294
return true;
299295
};
300-
let Some(link_kind) = nv.value_as_str() else {
301-
cx.adcx().expected_string_literal(item.span(), Some(nv.value_as_lit()));
296+
let Some(link_kind) = cx.expect_string_literal(nv) else {
302297
return true;
303298
};
304299

@@ -376,8 +371,7 @@ impl LinkParser {
376371
let Some(nv) = cx.expect_name_value(item.args(), item.span(), Some(sym::modifiers)) else {
377372
return true;
378373
};
379-
let Some(link_modifiers) = nv.value_as_str() else {
380-
cx.adcx().expected_string_literal(item.span(), Some(nv.value_as_lit()));
374+
let Some(link_modifiers) = cx.expect_string_literal(nv) else {
381375
return true;
382376
};
383377
*modifiers = Some((link_modifiers, nv.value_span));
@@ -419,8 +413,7 @@ impl LinkParser {
419413
else {
420414
return true;
421415
};
422-
let Some(link_wasm_import_module) = nv.value_as_str() else {
423-
cx.adcx().expected_string_literal(item.span(), Some(nv.value_as_lit()));
416+
let Some(link_wasm_import_module) = cx.expect_string_literal(nv) else {
424417
return true;
425418
};
426419
*wasm_import_module = Some((link_wasm_import_module, item.span()));
@@ -440,8 +433,7 @@ impl LinkParser {
440433
else {
441434
return true;
442435
};
443-
let Some(link_import_name_type) = nv.value_as_str() else {
444-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
436+
let Some(link_import_name_type) = cx.expect_string_literal(nv) else {
445437
return true;
446438
};
447439
if cx.sess().target.arch != Arch::X86 {
@@ -509,10 +501,7 @@ impl SingleAttributeParser for LinkSectionParser {
509501

510502
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
511503
let nv = cx.expect_name_value(args, cx.attr_span, None)?;
512-
let Some(name) = nv.value_as_str() else {
513-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
514-
return None;
515-
};
504+
let name = cx.expect_string_literal(nv)?;
516505
if name.as_str().contains('\0') {
517506
// `#[link_section = ...]` will be converted to a null-terminated string,
518507
// so it may not contain any null characters.
@@ -641,9 +630,7 @@ impl SingleAttributeParser for LinkageParser {
641630
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
642631
let name_value = cx.expect_name_value(args, cx.attr_span, Some(sym::linkage))?;
643632

644-
let Some(value) = name_value.value_as_str() else {
645-
cx.adcx()
646-
.expected_string_literal(name_value.value_span, Some(name_value.value_as_lit()));
633+
let Some(value) = cx.expect_string_literal(name_value) else {
647634
return None;
648635
};
649636

0 commit comments

Comments
 (0)