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