This is the central parsing class Jinja uses. It's passed to extensions and can be used to parse expressions or statements.
| 44 | |
| 45 | |
| 46 | class Parser: |
| 47 | """This is the central parsing class Jinja uses. It's passed to |
| 48 | extensions and can be used to parse expressions or statements. |
| 49 | """ |
| 50 | |
| 51 | def __init__( |
| 52 | self, |
| 53 | environment: "Environment", |
| 54 | source: str, |
| 55 | name: t.Optional[str] = None, |
| 56 | filename: t.Optional[str] = None, |
| 57 | state: t.Optional[str] = None, |
| 58 | ) -> None: |
| 59 | self.environment = environment |
| 60 | self.stream = environment._tokenize(source, name, filename, state) |
| 61 | self.name = name |
| 62 | self.filename = filename |
| 63 | self.closed = False |
| 64 | self.extensions: t.Dict[ |
| 65 | str, t.Callable[["Parser"], t.Union[nodes.Node, t.List[nodes.Node]]] |
| 66 | ] = {} |
| 67 | for extension in environment.iter_extensions(): |
| 68 | for tag in extension.tags: |
| 69 | self.extensions[tag] = extension.parse |
| 70 | self._last_identifier = 0 |
| 71 | self._tag_stack: t.List[str] = [] |
| 72 | self._end_token_stack: t.List[t.Tuple[str, ...]] = [] |
| 73 | |
| 74 | def fail( |
| 75 | self, |
| 76 | msg: str, |
| 77 | lineno: t.Optional[int] = None, |
| 78 | exc: t.Type[TemplateSyntaxError] = TemplateSyntaxError, |
| 79 | ) -> "te.NoReturn": |
| 80 | """Convenience method that raises `exc` with the message, passed |
| 81 | line number or last line number as well as the current name and |
| 82 | filename. |
| 83 | """ |
| 84 | if lineno is None: |
| 85 | lineno = self.stream.current.lineno |
| 86 | raise exc(msg, lineno, self.name, self.filename) |
| 87 | |
| 88 | def _fail_ut_eof( |
| 89 | self, |
| 90 | name: t.Optional[str], |
| 91 | end_token_stack: t.List[t.Tuple[str, ...]], |
| 92 | lineno: t.Optional[int], |
| 93 | ) -> "te.NoReturn": |
| 94 | expected: t.Set[str] = set() |
| 95 | for exprs in end_token_stack: |
| 96 | expected.update(map(describe_token_expr, exprs)) |
| 97 | if end_token_stack: |
| 98 | currently_looking: t.Optional[str] = " or ".join( |
| 99 | map(repr, map(describe_token_expr, end_token_stack[-1])) |
| 100 | ) |
| 101 | else: |
| 102 | currently_looking = None |
| 103 |
no outgoing calls
no test coverage detected