@@ -1951,6 +1951,40 @@ def write_pyo3_wrapper(mod, type_info, namespace, f):
1951
1951
f .write ("Ok(())\n }" )
1952
1952
1953
1953
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
+
1954
1988
def write_ast_mod (mod , type_info , f ):
1955
1989
f .write (
1956
1990
"""
@@ -1972,6 +2006,7 @@ def write_ast_mod(mod, type_info, f):
1972
2006
def main (
1973
2007
input_filename ,
1974
2008
ast_dir ,
2009
+ parser_dir ,
1975
2010
ast_pyo3_dir ,
1976
2011
module_filename ,
1977
2012
dump_module = False ,
@@ -2000,6 +2035,14 @@ def main(
2000
2035
f .write (auto_gen_msg )
2001
2036
write (f )
2002
2037
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
+
2003
2046
for filename , write in [
2004
2047
("to_py_ast" , p (write_to_pyo3 , mod , type_info )),
2005
2048
("wrapper_located" , p (write_pyo3_wrapper , mod , type_info , "located" )),
@@ -2020,6 +2063,7 @@ def main(
2020
2063
parser = ArgumentParser ()
2021
2064
parser .add_argument ("input_file" , type = Path )
2022
2065
parser .add_argument ("-A" , "--ast-dir" , type = Path , required = True )
2066
+ parser .add_argument ("-P" , "--parser-dir" , type = Path , required = True )
2023
2067
parser .add_argument ("-O" , "--ast-pyo3-dir" , type = Path , required = True )
2024
2068
parser .add_argument ("-M" , "--module-file" , type = Path , required = True )
2025
2069
parser .add_argument ("-d" , "--dump-module" , action = "store_true" )
@@ -2028,6 +2072,7 @@ def main(
2028
2072
main (
2029
2073
args .input_file ,
2030
2074
args .ast_dir ,
2075
+ args .parser_dir ,
2031
2076
args .ast_pyo3_dir ,
2032
2077
args .module_file ,
2033
2078
args .dump_module ,
0 commit comments