summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ParseTreeTransforms.py
diff options
context:
space:
mode:
Diffstat (limited to 'Cython/Compiler/ParseTreeTransforms.py')
-rw-r--r--Cython/Compiler/ParseTreeTransforms.py44
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: