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