flux_syntax/
lib.rs

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}