11//! The main parser interface.
22
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;
74use crate :: parse:: parser:: { Parser , emit_unclosed_delims} ;
85use crate :: parse:: token:: { Nonterminal , TokenKind } ;
96use crate :: tokenstream:: { self , TokenStream , TokenTree } ;
107use crate :: print:: pprust;
11- use crate :: symbol:: Symbol ;
128
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 } ;
1510#[ cfg( target_arch = "x86_64" ) ]
1611use 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 } ;
2114
2215use std:: borrow:: Cow ;
23- use std:: path:: { Path , PathBuf } ;
16+ use std:: path:: Path ;
2417use std:: str;
2518
2619use log:: info;
@@ -33,6 +26,8 @@ pub mod parser;
3326pub mod attr;
3427pub mod lexer;
3528pub mod token;
29+ mod sess;
30+ pub use sess:: ParseSess ;
3631
3732crate mod classify;
3833crate mod diagnostics;
@@ -46,112 +41,6 @@ pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a>>;
4641#[ cfg( target_arch = "x86_64" ) ]
4742static_assert_size ! ( PResult <' _, bool >, 16 ) ;
4843
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-
15544#[ derive( Clone ) ]
15645pub struct Directory < ' a > {
15746 pub path : Cow < ' a , Path > ,
0 commit comments