diff options
Diffstat (limited to 'Cython/Compiler/ParseTreeTransforms.py')
-rw-r--r-- | Cython/Compiler/ParseTreeTransforms.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index bc4943b79..301d93335 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -193,6 +193,7 @@ class PostParse(ScopeTrackingTransform): self.specialattribute_handlers = { '__cythonbufferdefaults__' : self.handle_bufferdefaults } + self.in_pattern_node = False def visit_LambdaNode(self, node): # unpack a lambda expression into the corresponding DefNode @@ -385,6 +386,32 @@ class PostParse(ScopeTrackingTransform): self.visitchildren(node) return node + def visit_ErrorNode(self, node): + error(node.pos, node.what) + return None + + def visit_MatchCaseNode(self, node): + node.validate_targets() + self.visitchildren(node) + return node + + def visit_MatchNode(self, node): + node.validate_irrefutable() + self.visitchildren(node) + return node + + def visit_PatternNode(self, node): + in_pattern_node, self.in_pattern_node = self.in_pattern_node, True + self.visitchildren(node) + self.in_pattern_node = in_pattern_node + return node + + def visit_JoinedStrNode(self, node): + if self.in_pattern_node: + error(node.pos, "f-strings are not accepted for pattern matching") + self.visitchildren(node) + return node + class _AssignmentExpressionTargetNameFinder(TreeVisitor): def __init__(self): super(_AssignmentExpressionTargetNameFinder, self).__init__() @@ -918,6 +945,9 @@ class InterpretCompilerDirectives(CythonTransform): self.directives = old_directives return node + def visit_CompilerDirectivesExprNode(self, node): + return self.visit_CompilerDirectivesNode(node) + # The following four functions track imports and cimports that # begin with "cython" def is_cython_directive(self, name): @@ -1550,6 +1580,9 @@ class ParallelRangeTransform(CythonTransform, SkipDeclarations): class WithTransform(VisitorTransform, SkipDeclarations): + # also includes some transforms for MatchCase + # (because this is a convenient time to do them, before constant folding and + # branch elimination) def visit_WithStatNode(self, node): self.visitchildren(node, 'body') pos = node.pos @@ -1611,6 +1644,11 @@ class WithTransform(VisitorTransform, SkipDeclarations): ) return node + def visit_MatchNode(self, node): + node.refactor_cases() + self.visitchildren(node) + return node + def visit_ExprNode(self, node): # With statements are never inside expressions. return node @@ -1990,6 +2028,9 @@ class ForwardDeclareTypes(CythonTransform): env.directives = old return node + def visit_CompilerDirectivesExprNode(self, node): + return self.visit_CompilerDirectivesNode(node) + def visit_ModuleNode(self, node): self.module_scope = node.scope self.module_scope.directives = node.directives @@ -2863,6 +2904,9 @@ class AdjustDefByDirectives(CythonTransform, SkipDeclarations): self.directives = old_directives return node + def visit_CompilerDirectivesExprNode(self, node): + return self.visit_CompilerDirectivesNode(node) + def visit_DefNode(self, node): modifiers = [] if 'inline' in self.directives: |