@@ -1951,6 +1951,40 @@ def write_pyo3_wrapper(mod, type_info, namespace, f):
19511951 f .write ("Ok(())\n }" )
19521952
19531953
1954+ def write_parse_def (mod , type_info , f ):
1955+ for info in type_info .values ():
1956+ if info .enum_name not in ["expr" , "stmt" ]:
1957+ continue
1958+
1959+ type_name = rust_type_name (info .enum_name )
1960+ cons_name = rust_type_name (info .name )
1961+
1962+ f .write (f"""
1963+ impl Parse for ast::{ info .rust_sum_name } {{
1964+ fn lex_starts_at(
1965+ source: &str,
1966+ offset: TextSize,
1967+ ) -> SoftKeywordTransformer<Lexer<std::str::Chars>> {{
1968+ ast::{ type_name } ::lex_starts_at(source, offset)
1969+ }}
1970+ fn parse_tokens(
1971+ lxr: impl IntoIterator<Item = LexResult>,
1972+ source_path: &str,
1973+ ) -> Result<Self, ParseError> {{
1974+ let node = ast::{ type_name } ::parse_tokens(lxr, source_path)?;
1975+ match node {{
1976+ ast::{ type_name } ::{ cons_name } (node) => Ok(node),
1977+ node => Err(ParseError {{
1978+ error: ParseErrorType::InvalidToken,
1979+ offset: node.range().start(),
1980+ source_path: source_path.to_owned(),
1981+ }}),
1982+ }}
1983+ }}
1984+ }}
1985+ """ )
1986+
1987+
19541988def write_ast_mod (mod , type_info , f ):
19551989 f .write (
19561990 """
@@ -1972,6 +2006,7 @@ def write_ast_mod(mod, type_info, f):
19722006def main (
19732007 input_filename ,
19742008 ast_dir ,
2009+ parser_dir ,
19752010 ast_pyo3_dir ,
19762011 module_filename ,
19772012 dump_module = False ,
@@ -2000,6 +2035,14 @@ def main(
20002035 f .write (auto_gen_msg )
20012036 write (f )
20022037
2038+ for filename , write in [
2039+ ("parse" , p (write_parse_def , mod , type_info )),
2040+ ]:
2041+ with (parser_dir / f"{ filename } .rs" ).open ("w" ) as f :
2042+ f .write (auto_gen_msg )
2043+ write (f )
2044+
2045+
20032046 for filename , write in [
20042047 ("to_py_ast" , p (write_to_pyo3 , mod , type_info )),
20052048 ("wrapper_located" , p (write_pyo3_wrapper , mod , type_info , "located" )),
@@ -2020,6 +2063,7 @@ def main(
20202063 parser = ArgumentParser ()
20212064 parser .add_argument ("input_file" , type = Path )
20222065 parser .add_argument ("-A" , "--ast-dir" , type = Path , required = True )
2066+ parser .add_argument ("-P" , "--parser-dir" , type = Path , required = True )
20232067 parser .add_argument ("-O" , "--ast-pyo3-dir" , type = Path , required = True )
20242068 parser .add_argument ("-M" , "--module-file" , type = Path , required = True )
20252069 parser .add_argument ("-d" , "--dump-module" , action = "store_true" )
@@ -2028,6 +2072,7 @@ def main(
20282072 main (
20292073 args .input_file ,
20302074 args .ast_dir ,
2075+ args .parser_dir ,
20312076 args .ast_pyo3_dir ,
20322077 args .module_file ,
20332078 args .dump_module ,
0 commit comments