X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/c891c65b6b2de7c257244cc409276b485130c275..9ef8e6c9b0090d787953bcd3c46a8942483fcc6b:/blib2to3/pygram.py

diff --git a/blib2to3/pygram.py b/blib2to3/pygram.py
index 725fb69..b8362b8 100644
--- a/blib2to3/pygram.py
+++ b/blib2to3/pygram.py
@@ -6,20 +6,23 @@
 # Python imports
 import os
 
+from typing import Union
+
 # Local imports
 from .pgen2 import token
 from .pgen2 import driver
-from . import pytree
 
-# The grammar file
-_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt")
-_PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__),
-                                     "PatternGrammar.txt")
+from .pgen2.grammar import Grammar
 
+# Moved into initialize because mypyc can't handle __file__ (XXX bug)
+# # The grammar file
+# _GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt")
+# _PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__),
+#                                      "PatternGrammar.txt")
 
-class Symbols(object):
 
-    def __init__(self, grammar):
+class Symbols(object):
+    def __init__(self, grammar: Grammar) -> None:
         """Initializer.
 
         Creates an attribute for each grammar symbol (nonterminal),
@@ -29,29 +32,166 @@ class Symbols(object):
             setattr(self, name, symbol)
 
 
-def initialize(cache_dir=None):
+class _python_symbols(Symbols):
+    and_expr: int
+    and_test: int
+    annassign: int
+    arglist: int
+    argument: int
+    arith_expr: int
+    assert_stmt: int
+    async_funcdef: int
+    async_stmt: int
+    atom: int
+    augassign: int
+    break_stmt: int
+    classdef: int
+    comp_for: int
+    comp_if: int
+    comp_iter: int
+    comp_op: int
+    comparison: int
+    compound_stmt: int
+    continue_stmt: int
+    decorated: int
+    decorator: int
+    decorators: int
+    del_stmt: int
+    dictsetmaker: int
+    dotted_as_name: int
+    dotted_as_names: int
+    dotted_name: int
+    encoding_decl: int
+    eval_input: int
+    except_clause: int
+    exec_stmt: int
+    expr: int
+    expr_stmt: int
+    exprlist: int
+    factor: int
+    file_input: int
+    flow_stmt: int
+    for_stmt: int
+    funcdef: int
+    global_stmt: int
+    if_stmt: int
+    import_as_name: int
+    import_as_names: int
+    import_from: int
+    import_name: int
+    import_stmt: int
+    lambdef: int
+    listmaker: int
+    namedexpr_test: int
+    not_test: int
+    old_comp_for: int
+    old_comp_if: int
+    old_comp_iter: int
+    old_lambdef: int
+    old_test: int
+    or_test: int
+    parameters: int
+    pass_stmt: int
+    power: int
+    print_stmt: int
+    raise_stmt: int
+    return_stmt: int
+    shift_expr: int
+    simple_stmt: int
+    single_input: int
+    sliceop: int
+    small_stmt: int
+    star_expr: int
+    stmt: int
+    subscript: int
+    subscriptlist: int
+    suite: int
+    term: int
+    test: int
+    testlist: int
+    testlist1: int
+    testlist_gexp: int
+    testlist_safe: int
+    testlist_star_expr: int
+    tfpdef: int
+    tfplist: int
+    tname: int
+    trailer: int
+    try_stmt: int
+    typedargslist: int
+    varargslist: int
+    vfpdef: int
+    vfplist: int
+    vname: int
+    while_stmt: int
+    with_item: int
+    with_stmt: int
+    with_var: int
+    xor_expr: int
+    yield_arg: int
+    yield_expr: int
+    yield_stmt: int
+
+
+class _pattern_symbols(Symbols):
+    Alternative: int
+    Alternatives: int
+    Details: int
+    Matcher: int
+    NegatedUnit: int
+    Repeater: int
+    Unit: int
+
+
+python_grammar: Grammar
+python_grammar_no_print_statement: Grammar
+python_grammar_no_print_statement_no_exec_statement: Grammar
+python_grammar_no_print_statement_no_exec_statement_async_keywords: Grammar
+python_grammar_no_exec_statement: Grammar
+pattern_grammar: Grammar
+
+python_symbols: _python_symbols
+pattern_symbols: _pattern_symbols
+
+
+def initialize(cache_dir: Union[str, "os.PathLike[str]", None] = None) -> None:
     global python_grammar
     global python_grammar_no_print_statement
     global python_grammar_no_print_statement_no_exec_statement
+    global python_grammar_no_print_statement_no_exec_statement_async_keywords
     global python_symbols
     global pattern_grammar
     global pattern_symbols
 
+    # The grammar file
+    _GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt")
+    _PATTERN_GRAMMAR_FILE = os.path.join(
+        os.path.dirname(__file__), "PatternGrammar.txt"
+    )
+
     # Python 2
-    python_grammar = driver.load_packaged_grammar("blib2to3", _GRAMMAR_FILE,
-                                                  cache_dir)
+    python_grammar = driver.load_packaged_grammar("blib2to3", _GRAMMAR_FILE, cache_dir)
 
-    python_symbols = Symbols(python_grammar)
+    python_symbols = _python_symbols(python_grammar)
 
     # Python 2 + from __future__ import print_function
     python_grammar_no_print_statement = python_grammar.copy()
     del python_grammar_no_print_statement.keywords["print"]
 
-    # Python 3
+    # Python 3.0-3.6
     python_grammar_no_print_statement_no_exec_statement = python_grammar.copy()
     del python_grammar_no_print_statement_no_exec_statement.keywords["print"]
     del python_grammar_no_print_statement_no_exec_statement.keywords["exec"]
 
-    pattern_grammar = driver.load_packaged_grammar("blib2to3", _PATTERN_GRAMMAR_FILE,
-                                                   cache_dir)
-    pattern_symbols = Symbols(pattern_grammar)
+    # Python 3.7+
+    python_grammar_no_print_statement_no_exec_statement_async_keywords = (
+        python_grammar_no_print_statement_no_exec_statement.copy()
+    )
+    python_grammar_no_print_statement_no_exec_statement_async_keywords.async_keywords = (
+        True
+    )
+
+    pattern_grammar = driver.load_packaged_grammar(
+        "blib2to3", _PATTERN_GRAMMAR_FILE, cache_dir
+    )
+    pattern_symbols = _pattern_symbols(pattern_grammar)