|
1 | 1 | use crate::ast;
|
2 |
| -use crate::ast::{BlockCheckMode, Expr, ExprKind, Item, ItemKind, Pat, PatKind, QSelf, Ty, TyKind}; |
3 |
| -use crate::parse::parser::{BlockMode, PathStyle, TokenType, SemiColonMode}; |
| 2 | +use crate::ast::{ |
| 3 | + BlockCheckMode, Expr, ExprKind, Item, ItemKind, Pat, PatKind, QSelf, Ty, TyKind, VariantData, |
| 4 | +}; |
| 5 | +use crate::parse::parser::{BlockMode, PathStyle, SemiColonMode, TokenType}; |
4 | 6 | use crate::parse::token;
|
5 | 7 | use crate::parse::PResult;
|
6 | 8 | use crate::parse::Parser;
|
7 | 9 | use crate::print::pprust;
|
8 | 10 | use crate::ptr::P;
|
| 11 | +use crate::source_map::Spanned; |
9 | 12 | use crate::symbol::kw;
|
10 | 13 | use crate::ThinVec;
|
11 | 14 | use errors::{Applicability, DiagnosticBuilder};
|
12 |
| -use syntax_pos::Span; |
13 | 15 | use log::debug;
|
| 16 | +use syntax_pos::Span; |
14 | 17 |
|
15 | 18 | pub trait RecoverQPath: Sized + 'static {
|
16 | 19 | const PATH_STYLE: PathStyle = PathStyle::Expr;
|
@@ -79,6 +82,44 @@ impl<'a> Parser<'a> {
|
79 | 82 | }
|
80 | 83 | }
|
81 | 84 |
|
| 85 | + crate fn maybe_report_invalid_custom_discriminants( |
| 86 | + &mut self, |
| 87 | + discriminant_spans: Vec<Span>, |
| 88 | + variants: &[Spanned<ast::Variant_>], |
| 89 | + ) { |
| 90 | + let has_fields = variants.iter().any(|variant| match variant.node.data { |
| 91 | + VariantData::Tuple(..) | VariantData::Struct(..) => true, |
| 92 | + VariantData::Unit(..) => false, |
| 93 | + }); |
| 94 | + |
| 95 | + if !discriminant_spans.is_empty() && has_fields { |
| 96 | + let mut err = self.struct_span_err( |
| 97 | + discriminant_spans.clone(), |
| 98 | + "custom discriminant values are not allowed in enums with fields", |
| 99 | + ); |
| 100 | + for sp in discriminant_spans { |
| 101 | + err.span_label(sp, "invalid custom discriminant"); |
| 102 | + } |
| 103 | + for variant in variants.iter() { |
| 104 | + if let VariantData::Struct(fields, ..) | VariantData::Tuple(fields, ..) = |
| 105 | + &variant.node.data |
| 106 | + { |
| 107 | + let fields = if fields.len() > 1 { |
| 108 | + "fields" |
| 109 | + } else { |
| 110 | + "a field" |
| 111 | + }; |
| 112 | + err.span_label( |
| 113 | + variant.span, |
| 114 | + &format!("variant with {fields} defined here", fields = fields), |
| 115 | + ); |
| 116 | + |
| 117 | + } |
| 118 | + } |
| 119 | + err.emit(); |
| 120 | + } |
| 121 | + } |
| 122 | + |
82 | 123 | crate fn maybe_recover_from_bad_type_plus(
|
83 | 124 | &mut self,
|
84 | 125 | allow_plus: bool,
|
|
0 commit comments