refactor arena state
[hiphop-php.git] / hphp / hack / src / parser / api / positioned_full_trivia_parser.rs
blob313186731c0f5296b40d706737d967ddb2174ea7
1 // Copyright (c) Facebook, Inc. and its affiliates.
2 //
3 // This source code is licensed under the MIT license found in the
4 // LICENSE file in the "hack" directory of this source tree.
5 use bumpalo::Bump;
6 use parser::{
7     indexed_source_text::IndexedSourceText,
8     parser::Parser,
9     parser_env::ParserEnv,
10     source_text::SourceText,
11     syntax_by_ref::serialize,
12     syntax_by_ref::{
13         arena_state::State,
14         positioned_token::{PositionedTokenFullTrivia, TokenFactoryFullTrivia},
15         positioned_value::PositionedValueFullTrivia,
16         syntax,
17     },
18     syntax_error::SyntaxError,
20 use positioned_smart_constructors::*;
21 use serde::{Serialize, Serializer};
22 use stack_limit::StackLimit;
24 pub type Syntax<'a> =
25     syntax::Syntax<'a, PositionedTokenFullTrivia<'a>, PositionedValueFullTrivia<'a>>;
27 pub type SmartConstructors<'a> =
28     PositionedSmartConstructors<Syntax<'a>, TokenFactoryFullTrivia<'a>, State<'a>>;
30 pub fn parse_script<'src, 'arena>(
31     arena: &'arena Bump,
32     source: &SourceText<'src>,
33     env: ParserEnv,
34     stack_limit: Option<&'src StackLimit>,
35 ) -> (Syntax<'arena>, Vec<SyntaxError>) {
36     let tf = TokenFactoryFullTrivia::new(arena);
37     let sc = SmartConstructors::new(State { arena }, tf);
38     let mut parser = Parser::new(&source, env, sc);
39     let root = parser.parse_script(stack_limit);
40     let errors = parser.errors();
41     (root, errors)
44 pub fn parse_script_to_json<'src, 'arena, S: Serializer>(
45     arena: &'arena Bump,
46     s: S,
47     source: &IndexedSourceText<'src>,
48     env: ParserEnv,
49     stack_limit: Option<&'src StackLimit>,
50 ) -> Result<S::Ok, S::Error> {
51     #[derive(Serialize)]
52     struct Output<'a> {
53         parse_tree: serialize::WithContext<'a, Syntax<'a>>,
54         program_text: &'a str,
55         version: &'static str,
56     }
58     let tf = TokenFactoryFullTrivia::new(arena);
59     let sc = SmartConstructors::new(State { arena }, tf);
60     let mut parser = Parser::new(source.source_text(), env, sc);
61     let root = parser.parse_script(stack_limit);
63     let parse_tree = serialize::WithContext(&source, &root);
64     let output = Output {
65         parse_tree,
66         program_text: source.source_text().text_as_str(),
67         version: full_fidelity_schema_version_number::VERSION,
68     };
69     output.serialize(s)