1
1
//! The main parser interface.
2
2
3
- use crate :: ast:: { self , CrateConfig , NodeId } ;
4
- use crate :: early_buffered_lints:: { BufferedEarlyLint , BufferedEarlyLintId } ;
5
- use crate :: source_map:: { SourceMap , FilePathMapping } ;
6
- use crate :: feature_gate:: UnstableFeatures ;
3
+ use crate :: ast;
7
4
use crate :: parse:: parser:: { Parser , emit_unclosed_delims} ;
8
5
use crate :: parse:: token:: { Nonterminal , TokenKind } ;
9
6
use crate :: tokenstream:: { self , TokenStream , TokenTree } ;
10
7
use crate :: print:: pprust;
11
- use crate :: symbol:: Symbol ;
12
8
13
- use errors:: { Applicability , FatalError , Level , Handler , ColorConfig , Diagnostic , DiagnosticBuilder } ;
14
- use rustc_data_structures:: fx:: { FxHashSet , FxHashMap } ;
9
+ use errors:: { FatalError , Level , Diagnostic , DiagnosticBuilder } ;
15
10
#[ cfg( target_arch = "x86_64" ) ]
16
11
use rustc_data_structures:: static_assert_size;
17
- use rustc_data_structures:: sync:: { Lrc , Lock , Once } ;
18
- use syntax_pos:: { Span , SourceFile , FileName , MultiSpan } ;
19
- use syntax_pos:: edition:: Edition ;
20
- use syntax_pos:: hygiene:: ExpnId ;
12
+ use rustc_data_structures:: sync:: Lrc ;
13
+ use syntax_pos:: { Span , SourceFile , FileName } ;
21
14
22
15
use std:: borrow:: Cow ;
23
- use std:: path:: { Path , PathBuf } ;
16
+ use std:: path:: Path ;
24
17
use std:: str;
25
18
26
19
use log:: info;
@@ -33,6 +26,8 @@ pub mod parser;
33
26
pub mod attr;
34
27
pub mod lexer;
35
28
pub mod token;
29
+ mod sess;
30
+ pub use sess:: ParseSess ;
36
31
37
32
crate mod classify;
38
33
crate mod diagnostics;
@@ -46,112 +41,6 @@ pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a>>;
46
41
#[ cfg( target_arch = "x86_64" ) ]
47
42
static_assert_size ! ( PResult <' _, bool >, 16 ) ;
48
43
49
- /// Collected spans during parsing for places where a certain feature was
50
- /// used and should be feature gated accordingly in `check_crate`.
51
- #[ derive( Default ) ]
52
- pub struct GatedSpans {
53
- /// Spans collected for gating `let_chains`, e.g. `if a && let b = c {}`.
54
- pub let_chains : Lock < Vec < Span > > ,
55
- /// Spans collected for gating `async_closure`, e.g. `async || ..`.
56
- pub async_closure : Lock < Vec < Span > > ,
57
- /// Spans collected for gating `yield e?` expressions (`generators` gate).
58
- pub yields : Lock < Vec < Span > > ,
59
- /// Spans collected for gating `or_patterns`, e.g. `Some(Foo | Bar)`.
60
- pub or_patterns : Lock < Vec < Span > > ,
61
- /// Spans collected for gating `const_extern_fn`, e.g. `const extern fn foo`.
62
- pub const_extern_fn : Lock < Vec < Span > > ,
63
- }
64
-
65
- /// Info about a parsing session.
66
- pub struct ParseSess {
67
- pub span_diagnostic : Handler ,
68
- pub unstable_features : UnstableFeatures ,
69
- pub config : CrateConfig ,
70
- pub edition : Edition ,
71
- pub missing_fragment_specifiers : Lock < FxHashSet < Span > > ,
72
- /// Places where raw identifiers were used. This is used for feature-gating raw identifiers.
73
- pub raw_identifier_spans : Lock < Vec < Span > > ,
74
- /// Used to determine and report recursive module inclusions.
75
- included_mod_stack : Lock < Vec < PathBuf > > ,
76
- source_map : Lrc < SourceMap > ,
77
- pub buffered_lints : Lock < Vec < BufferedEarlyLint > > ,
78
- /// Contains the spans of block expressions that could have been incomplete based on the
79
- /// operation token that followed it, but that the parser cannot identify without further
80
- /// analysis.
81
- pub ambiguous_block_expr_parse : Lock < FxHashMap < Span , Span > > ,
82
- pub injected_crate_name : Once < Symbol > ,
83
- pub gated_spans : GatedSpans ,
84
- }
85
-
86
- impl ParseSess {
87
- pub fn new ( file_path_mapping : FilePathMapping ) -> Self {
88
- let cm = Lrc :: new ( SourceMap :: new ( file_path_mapping) ) ;
89
- let handler = Handler :: with_tty_emitter (
90
- ColorConfig :: Auto ,
91
- true ,
92
- None ,
93
- Some ( cm. clone ( ) ) ,
94
- ) ;
95
- ParseSess :: with_span_handler ( handler, cm)
96
- }
97
-
98
- pub fn with_span_handler ( handler : Handler , source_map : Lrc < SourceMap > ) -> Self {
99
- Self {
100
- span_diagnostic : handler,
101
- unstable_features : UnstableFeatures :: from_environment ( ) ,
102
- config : FxHashSet :: default ( ) ,
103
- edition : ExpnId :: root ( ) . expn_data ( ) . edition ,
104
- missing_fragment_specifiers : Lock :: new ( FxHashSet :: default ( ) ) ,
105
- raw_identifier_spans : Lock :: new ( Vec :: new ( ) ) ,
106
- included_mod_stack : Lock :: new ( vec ! [ ] ) ,
107
- source_map,
108
- buffered_lints : Lock :: new ( vec ! [ ] ) ,
109
- ambiguous_block_expr_parse : Lock :: new ( FxHashMap :: default ( ) ) ,
110
- injected_crate_name : Once :: new ( ) ,
111
- gated_spans : GatedSpans :: default ( ) ,
112
- }
113
- }
114
-
115
- #[ inline]
116
- pub fn source_map ( & self ) -> & SourceMap {
117
- & self . source_map
118
- }
119
-
120
- pub fn buffer_lint < S : Into < MultiSpan > > ( & self ,
121
- lint_id : BufferedEarlyLintId ,
122
- span : S ,
123
- id : NodeId ,
124
- msg : & str ,
125
- ) {
126
- self . buffered_lints . with_lock ( |buffered_lints| {
127
- buffered_lints. push ( BufferedEarlyLint {
128
- span : span. into ( ) ,
129
- id,
130
- msg : msg. into ( ) ,
131
- lint_id,
132
- } ) ;
133
- } ) ;
134
- }
135
-
136
- /// Extend an error with a suggestion to wrap an expression with parentheses to allow the
137
- /// parser to continue parsing the following operation as part of the same expression.
138
- pub fn expr_parentheses_needed (
139
- & self ,
140
- err : & mut DiagnosticBuilder < ' _ > ,
141
- span : Span ,
142
- alt_snippet : Option < String > ,
143
- ) {
144
- if let Some ( snippet) = self . source_map ( ) . span_to_snippet ( span) . ok ( ) . or ( alt_snippet) {
145
- err. span_suggestion (
146
- span,
147
- "parentheses are required to parse this as an expression" ,
148
- format ! ( "({})" , snippet) ,
149
- Applicability :: MachineApplicable ,
150
- ) ;
151
- }
152
- }
153
- }
154
-
155
44
#[ derive( Clone ) ]
156
45
pub struct Directory < ' a > {
157
46
pub path : Cow < ' a , Path > ,
0 commit comments