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_static_info(
104 &mut self,
105 tokens: &TokenStream,
106 span: Span,
107 ) -> ParseResult<surface::StaticInfo> {
108 let ty = parser::parse_type(&mut self.cx(tokens, span))?;
109 Ok(surface::StaticInfo { ty })
110 }
111
112 pub fn parse_constant_info(
113 &mut self,
114 tokens: &TokenStream,
115 span: Span,
116 ) -> ParseResult<surface::ConstantInfo> {
117 let expr = parser::parse_expr(&mut self.cx(tokens, span), true)?;
118 Ok(surface::ConstantInfo { expr: Some(expr) })
119 }
120
121 pub fn parse_yes_or_no_with_reason(
122 &mut self,
123 tokens: &TokenStream,
124 span: Span,
125 ) -> ParseResult<bool> {
126 parser::parse_yes_or_no_with_reason(&mut self.cx(tokens, span))
127 }
128
129 pub fn next_node_id(&mut self) -> NodeId {
130 let id = NodeId(self.next_node_id);
131 self.next_node_id += 1;
132 id
133 }
134
135 pub fn parse_detached_specs(
136 &mut self,
137 tokens: &TokenStream,
138 span: Span,
139 ) -> ParseResult<surface::DetachedSpecs> {
140 parser::parse_detached_specs(&mut self.cx(tokens, span))
141 }
142}
143
144struct ParseCtxt<'a> {
145 sess: &'a mut ParseSess,
146 ctx: SyntaxContext,
147 parent: Option<LocalDefId>,
148 edition: Edition,
149 tokens: Cursor<'a>,
150}
151
152impl<'a> ParseCtxt<'a> {
153 fn new(sess: &'a mut ParseSess, tokens: &'a TokenStream, span: Span) -> Self {
154 Self {
155 sess,
156 ctx: span.ctxt(),
157 parent: span.parent(),
158 edition: span.edition(),
159 tokens: Cursor::new(tokens, span.lo()),
160 }
161 }
162
163 fn next_node_id(&mut self) -> NodeId {
164 self.sess.next_node_id()
165 }
166
167 fn mk_span(&self, lo: BytePos, hi: BytePos) -> Span {
168 Span::new(lo, hi, self.ctx, self.parent)
169 }
170
171 fn lo(&self) -> BytePos {
172 self.tokens.lo()
173 }
174
175 fn hi(&self) -> BytePos {
176 self.tokens.hi()
177 }
178
179 fn is_reserved(&self, sym: Symbol) -> bool {
180 symbols::is_reserved(sym, self.edition)
181 }
182
183 fn unexpected_token(&mut self, expected: Vec<Expected>) -> ParseError {
184 let tok = self.tokens.at(0);
185 let kind = if tok.kind == token::Eof {
186 ParseErrorKind::UnexpectedEof
187 } else {
188 ParseErrorKind::UnexpectedToken { expected }
189 };
190 ParseError { kind, span: self.mk_span(tok.lo, tok.hi) }
191 }
192
193 fn cannot_be_chained(&self, lo: BytePos, hi: BytePos) -> ParseError {
194 ParseError { kind: ParseErrorKind::CannotBeChained, span: self.mk_span(lo, hi) }
195 }
196}
197
198pub type ParseResult<T = ()> = Result<T, ParseError>;
199
200pub struct ParseError {
201 pub kind: ParseErrorKind,
202 pub span: Span,
203}
204
205#[derive(Debug)]
206pub enum ParseErrorKind {
207 UnexpectedToken { expected: Vec<Expected> },
208 UnexpectedEof,
209 CannotBeChained,
210 InvalidBinding,
211 InvalidSort,
212 InvalidDetachedSpec,
213}