1#![feature(rustc_private, box_patterns, new_range_api)]
2
3extern crate rustc_ast;
4extern crate rustc_errors;
5extern crate rustc_span;
6
7pub mod lexer;
8mod parser;
9pub mod surface;
10pub mod symbols;
11mod token;
12use lexer::Cursor;
13use rustc_ast::tokenstream::TokenStream;
14use rustc_span::{
15 BytePos, Ident, Span, Symbol, SyntaxContext, def_id::LocalDefId, edition::Edition,
16};
17use surface::NodeId;
18
19use crate::parser::lookahead::Expected;
20
21#[derive(Default)]
22pub struct ParseSess {
23 next_node_id: usize,
24}
25
26impl ParseSess {
27 fn cx<'a>(&'a mut self, tokens: &'a TokenStream, span: Span) -> ParseCtxt<'a> {
28 ParseCtxt::new(self, tokens, span)
29 }
30
31 pub fn parse_refined_by(
32 &mut self,
33 tokens: &TokenStream,
34 span: Span,
35 ) -> ParseResult<surface::RefineParams> {
36 parser::parse_refined_by(&mut self.cx(tokens, span))
37 }
38
39 pub fn parse_type_alias(
40 &mut self,
41 tokens: &TokenStream,
42 span: Span,
43 ) -> ParseResult<surface::TyAlias> {
44 parser::parse_type_alias(&mut self.cx(tokens, span))
45 }
46
47 pub fn parse_fn_sig(
48 &mut self,
49 tokens: &TokenStream,
50 span: Span,
51 ) -> ParseResult<surface::FnSig> {
52 parser::parse_fn_sig(&mut self.cx(tokens, span), token::Eof)
53 }
54
55 pub fn parse_trait_assoc_reft(
56 &mut self,
57 tokens: &TokenStream,
58 span: Span,
59 ) -> ParseResult<Vec<surface::TraitAssocReft>> {
60 parser::parse_trait_assoc_refts(&mut self.cx(tokens, span))
61 }
62
63 pub fn parse_impl_assoc_reft(
64 &mut self,
65 tokens: &TokenStream,
66 span: Span,
67 ) -> ParseResult<Vec<surface::ImplAssocReft>> {
68 parser::parse_impl_assoc_refts(&mut self.cx(tokens, span))
69 }
70
71 pub fn parse_ident_list(
72 &mut self,
73 tokens: &TokenStream,
74 span: Span,
75 ) -> ParseResult<Vec<Ident>> {
76 parser::parse_ident_list(&mut self.cx(tokens, span))
77 }
78
79 pub fn parse_flux_item(
80 &mut self,
81 tokens: &TokenStream,
82 span: Span,
83 ) -> ParseResult<Vec<surface::FluxItem>> {
84 parser::parse_flux_items(&mut self.cx(tokens, span))
85 }
86
87 pub fn parse_type(&mut self, tokens: &TokenStream, span: Span) -> ParseResult<surface::Ty> {
88 parser::parse_type(&mut self.cx(tokens, span))
89 }
90
91 pub fn parse_variant(
92 &mut self,
93 tokens: &TokenStream,
94 span: Span,
95 ) -> ParseResult<surface::VariantDef> {
96 parser::parse_variant(&mut self.cx(tokens, span), false)
97 }
98
99 pub fn parse_expr(&mut self, tokens: &TokenStream, span: Span) -> ParseResult<surface::Expr> {
100 parser::parse_expr(&mut self.cx(tokens, span), true)
101 }
102
103 pub fn parse_constant_info(
104 &mut self,
105 tokens: &TokenStream,
106 span: Span,
107 ) -> ParseResult<surface::ConstantInfo> {
108 let expr = parser::parse_expr(&mut self.cx(tokens, span), true)?;
109 Ok(surface::ConstantInfo { expr: Some(expr) })
110 }
111
112 pub fn parse_yes_or_no_with_reason(
113 &mut self,
114 tokens: &TokenStream,
115 span: Span,
116 ) -> ParseResult<bool> {
117 parser::parse_yes_or_no_with_reason(&mut self.cx(tokens, span))
118 }
119
120 pub fn next_node_id(&mut self) -> NodeId {
121 let id = NodeId(self.next_node_id);
122 self.next_node_id += 1;
123 id
124 }
125
126 pub fn parse_detached_specs(
127 &mut self,
128 tokens: &TokenStream,
129 span: Span,
130 ) -> ParseResult<surface::DetachedSpecs> {
131 parser::parse_detached_specs(&mut self.cx(tokens, span))
132 }
133}
134
135struct ParseCtxt<'a> {
136 sess: &'a mut ParseSess,
137 ctx: SyntaxContext,
138 parent: Option<LocalDefId>,
139 edition: Edition,
140 tokens: Cursor<'a>,
141}
142
143impl<'a> ParseCtxt<'a> {
144 fn new(sess: &'a mut ParseSess, tokens: &'a TokenStream, span: Span) -> Self {
145 Self {
146 sess,
147 ctx: span.ctxt(),
148 parent: span.parent(),
149 edition: span.edition(),
150 tokens: Cursor::new(tokens, span.lo()),
151 }
152 }
153
154 fn next_node_id(&mut self) -> NodeId {
155 self.sess.next_node_id()
156 }
157
158 fn mk_span(&self, lo: BytePos, hi: BytePos) -> Span {
159 Span::new(lo, hi, self.ctx, self.parent)
160 }
161
162 fn lo(&self) -> BytePos {
163 self.tokens.lo()
164 }
165
166 fn hi(&self) -> BytePos {
167 self.tokens.hi()
168 }
169
170 fn is_reserved(&self, sym: Symbol) -> bool {
171 symbols::is_reserved(sym, self.edition)
172 }
173
174 fn unexpected_token(&mut self, expected: Vec<Expected>) -> ParseError {
175 let tok = self.tokens.at(0);
176 let kind = if tok.kind == token::Eof {
177 ParseErrorKind::UnexpectedEof
178 } else {
179 ParseErrorKind::UnexpectedToken { expected }
180 };
181 ParseError { kind, span: self.mk_span(tok.lo, tok.hi) }
182 }
183
184 fn cannot_be_chained(&self, lo: BytePos, hi: BytePos) -> ParseError {
185 ParseError { kind: ParseErrorKind::CannotBeChained, span: self.mk_span(lo, hi) }
186 }
187}
188
189pub type ParseResult<T = ()> = Result<T, ParseError>;
190
191pub struct ParseError {
192 pub kind: ParseErrorKind,
193 pub span: Span,
194}
195
196#[derive(Debug)]
197pub enum ParseErrorKind {
198 UnexpectedToken { expected: Vec<Expected> },
199 UnexpectedEof,
200 CannotBeChained,
201 InvalidBinding,
202 InvalidSort,
203 InvalidDetachedSpec,
204}