coconut-develop 3.2.0.post0.dev5__tar.gz → 3.2.0.post0.dev7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/PKG-INFO +1 -1
  2. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/compiler/compiler.py +55 -32
  3. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/compiler/grammar.py +56 -30
  4. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/compiler/util.py +4 -1
  5. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/root.py +1 -1
  6. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/main_test.py +1 -1
  7. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/extras.coco +9 -0
  8. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/.claude/CLAUDE.md +0 -0
  9. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/.claude/settings.local.json +0 -0
  10. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/CONTRIBUTING.md +0 -0
  11. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/DOCS.md +0 -0
  12. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/FAQ.md +0 -0
  13. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/HELP.md +0 -0
  14. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/LICENSE.txt +0 -0
  15. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/MANIFEST.in +0 -0
  16. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/README.rst +0 -0
  17. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/__coconut__/__init__.py +0 -0
  18. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/__coconut__/__init__.pyi +0 -0
  19. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/__coconut__/py.typed +0 -0
  20. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/_coconut/__init__.py +0 -0
  21. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/_coconut/__init__.pyi +0 -0
  22. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/_coconut/py.typed +0 -0
  23. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/__coconut__.py +0 -0
  24. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/__coconut__.pyi +0 -0
  25. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/__init__.py +0 -0
  26. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/__init__.pyi +0 -0
  27. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/__main__.py +0 -0
  28. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/_pyparsing.py +0 -0
  29. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/api.py +0 -0
  30. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/api.pyi +0 -0
  31. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/__init__.py +0 -0
  32. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/__init__.pyi +0 -0
  33. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/cli.py +0 -0
  34. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/command.py +0 -0
  35. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/command.pyi +0 -0
  36. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/mypy.py +0 -0
  37. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/resources/zcoconut.pth +0 -0
  38. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/util.py +0 -0
  39. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/command/watch.py +0 -0
  40. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/compiler/__init__.py +0 -0
  41. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/compiler/header.py +0 -0
  42. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/compiler/matching.py +0 -0
  43. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/compiler/templates/header.py_template +0 -0
  44. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/constants.py +0 -0
  45. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/convenience.py +0 -0
  46. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/convenience.pyi +0 -0
  47. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/exceptions.py +0 -0
  48. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/highlighter.py +0 -0
  49. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/__init__.py +0 -0
  50. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/__main__.py +0 -0
  51. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/coconut/kernel.json +0 -0
  52. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/coconut_py/kernel.json +0 -0
  53. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/coconut_py2/kernel.json +0 -0
  54. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/coconut_py3/kernel.json +0 -0
  55. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/embed.py +0 -0
  56. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/icoconut/root.py +0 -0
  57. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/integrations.py +0 -0
  58. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/main.py +0 -0
  59. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/py.typed +0 -0
  60. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/requirements.py +0 -0
  61. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/terminal.py +0 -0
  62. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/__init__.py +0 -0
  63. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/__main__.py +0 -0
  64. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/constants_test.py +0 -0
  65. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/__init__.coco +0 -0
  66. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/__main__.coco +0 -0
  67. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/main.coco +0 -0
  68. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/primary_1.coco +0 -0
  69. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/primary_2.coco +0 -0
  70. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/specific.coco +0 -0
  71. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/suite.coco +0 -0
  72. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/tutorial.coco +0 -0
  73. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/agnostic/util.coco +0 -0
  74. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/non_strict/non_strict_test.coco +0 -0
  75. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_2/py2_test.coco +0 -0
  76. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_3/py3_test.coco +0 -0
  77. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_311/py311_test.coco +0 -0
  78. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_314/py314_test.coco +0 -0
  79. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_35/py35_test.coco +0 -0
  80. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_36/py36_test.coco +0 -0
  81. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_38/py38_test.coco +0 -0
  82. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/cocotest/target_sys/target_sys_test.coco +0 -0
  83. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/importable.coco +0 -0
  84. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/runnable.coco +0 -0
  85. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/tests/src/runner.coco +0 -0
  86. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut/util.py +0 -0
  87. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/coconut_develop.egg-info/SOURCES.txt +0 -0
  88. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/conf.py +0 -0
  89. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/pyproject.toml +0 -0
  90. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/setup.cfg +0 -0
  91. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/setup.py +0 -0
  92. {coconut_develop-3.2.0.post0.dev5 → coconut_develop-3.2.0.post0.dev7}/xontrib/coconut.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coconut-develop
3
- Version: 3.2.0.post0.dev5
3
+ Version: 3.2.0.post0.dev7
4
4
  Summary: Simple, elegant, Pythonic functional programming.
5
5
  Home-page: http://coconut-lang.org
6
6
  Author: Evan Hubinger
@@ -105,6 +105,7 @@ from coconut.constants import (
105
105
  incremental_cache_limit,
106
106
  use_line_by_line_parser,
107
107
  coconut_cache_dir,
108
+ wildcard,
108
109
  )
109
110
  from coconut.util import (
110
111
  pickle,
@@ -785,7 +786,7 @@ class Compiler(Grammar, pickleable_obj):
785
786
  cls.type_alias_stmt <<= handle_and_manage(
786
787
  cls.type_alias_stmt_ref,
787
788
  cls.method("type_alias_stmt_handle"),
788
- cls.method("type_alias_stmt_manage"),
789
+ cls.method("scope_manage"),
789
790
  include_in_packrat_context=False,
790
791
  )
791
792
 
@@ -869,6 +870,7 @@ class Compiler(Grammar, pickleable_obj):
869
870
  cls.no_partial_trailer_atom <<= attach(cls.no_partial_trailer_atom_ref, cls.method("item_handle"))
870
871
  cls.simple_assign <<= attach(cls.simple_assign_ref, cls.method("item_handle"))
871
872
  cls.expr_simple_assign <<= attach(cls.expr_simple_assign_ref, cls.method("item_handle"))
873
+ cls.unsafe_simple_assign <<= attach(cls.unsafe_simple_assign_ref, cls.method("item_handle"))
872
874
 
873
875
  # handle all star assignments with star_assign_item_check
874
876
  cls.star_assign_item <<= attach(cls.star_assign_item_ref, cls.method("star_assign_item_check"))
@@ -903,6 +905,16 @@ class Compiler(Grammar, pickleable_obj):
903
905
  cls.name_match_funcdef <<= attach(cls.name_match_funcdef_ref, cls.method("name_match_funcdef_handle"))
904
906
  cls.op_match_funcdef <<= attach(cls.op_match_funcdef_ref, cls.method("op_match_funcdef_handle"))
905
907
  cls.base_case_funcdef <<= attach(cls.base_case_funcdef_ref, cls.method("base_case_funcdef_handle"))
908
+ cls.case_funcdef_case <<= manage(
909
+ cls.case_funcdef_case_ref,
910
+ cls.method("case_funcdef_clause_manage"),
911
+ include_in_packrat_context=False,
912
+ )
913
+ cls.case_funcdef_type <<= manage(
914
+ cls.case_funcdef_type_ref,
915
+ cls.method("case_funcdef_clause_manage"),
916
+ include_in_packrat_context=False,
917
+ )
906
918
  cls.yield_from <<= attach(cls.yield_from_ref, cls.method("yield_from_handle"))
907
919
  cls.typedef <<= attach(cls.typedef_ref, cls.method("typedef_handle"))
908
920
  cls.typedef_default <<= attach(cls.typedef_default_ref, cls.method("typedef_handle"))
@@ -5196,19 +5208,6 @@ class {protocol_var}({tokens}, _coconut.typing.Protocol): pass
5196
5208
  raise CoconutInternalException("invalid TypeVarFunc", TypeVarFunc, "(", name, ")")
5197
5209
  return "_coconut.typing.Generic[" + ", ".join(generics) + "]"
5198
5210
 
5199
- @contextmanager
5200
- def type_alias_stmt_manage(self, original=None, loc=None, item=None):
5201
- """Manage the typevars parsing context."""
5202
- prev_typevar_info = self.current_parsing_context("typevars")
5203
- with self.add_to_parsing_context({
5204
- "typevars": {
5205
- "all_typevars": {} if prev_typevar_info is None else prev_typevar_info["all_typevars"].copy(),
5206
- "new_typevars": [],
5207
- "typevar_locs": {},
5208
- },
5209
- }):
5210
- yield
5211
-
5212
5211
  def type_alias_stmt_handle(self, tokens):
5213
5212
  """Handle type alias statements."""
5214
5213
  if len(tokens) == 2:
@@ -5276,6 +5275,26 @@ class {protocol_var}({tokens}, _coconut.typing.Protocol): pass
5276
5275
 
5277
5276
  return self.wrap_passthrough(out, early=True)
5278
5277
 
5278
+ @property
5279
+ def in_method(self):
5280
+ """Determine if currently in a method."""
5281
+ cls_context = self.current_parsing_context("class")
5282
+ return cls_context is not None and cls_context["name"] is not None and cls_context["in_method"]
5283
+
5284
+ @contextmanager
5285
+ def scope_manage(self, original=None, loc=None, item=None):
5286
+ """Manage a context that opens a new scope."""
5287
+ prev_typevar_info = self.current_parsing_context("typevars")
5288
+ with self.add_to_parsing_context({
5289
+ "scope": self.get_empty_scope(),
5290
+ "typevars": {
5291
+ "all_typevars": {} if prev_typevar_info is None else prev_typevar_info["all_typevars"].copy(),
5292
+ "new_typevars": [],
5293
+ "typevar_locs": {},
5294
+ },
5295
+ }):
5296
+ yield
5297
+
5279
5298
  @contextmanager
5280
5299
  def class_manage(self, original, loc, item):
5281
5300
  """Manage the class parsing context."""
@@ -5296,12 +5315,9 @@ class {protocol_var}({tokens}, _coconut.typing.Protocol): pass
5296
5315
  "in_method": False,
5297
5316
  })
5298
5317
  try:
5299
- # handles support for class type variables
5300
- with self.type_alias_stmt_manage():
5301
- with self.add_to_parsing_context({
5302
- "scope": self.get_empty_scope(),
5303
- }):
5304
- yield
5318
+ # handles support for class type variables and opens a new scope
5319
+ with self.scope_manage():
5320
+ yield
5305
5321
  finally:
5306
5322
  cls_stack.pop()
5307
5323
 
@@ -5312,21 +5328,20 @@ class {protocol_var}({tokens}, _coconut.typing.Protocol): pass
5312
5328
  if cls_context is not None:
5313
5329
  in_method, cls_context["in_method"] = cls_context["in_method"], True
5314
5330
  try:
5315
- # handles support for function type variables
5316
- with self.type_alias_stmt_manage():
5317
- with self.add_to_parsing_context({
5318
- "scope": self.get_empty_scope(),
5319
- }):
5320
- yield
5331
+ # handles support for function type variables and opens a new scope
5332
+ with self.scope_manage():
5333
+ yield
5321
5334
  finally:
5322
5335
  if cls_context is not None:
5323
5336
  cls_context["in_method"] = in_method
5324
5337
 
5325
- @property
5326
- def in_method(self):
5327
- """Determine if currently in a method."""
5328
- cls_context = self.current_parsing_context("class")
5329
- return cls_context is not None and cls_context["name"] is not None and cls_context["in_method"]
5338
+ @contextmanager
5339
+ def case_funcdef_clause_manage(self, original, loc, item):
5340
+ """Manage the scope for each case clause in a case def."""
5341
+ with self.add_to_parsing_context({
5342
+ "scope": self.get_empty_scope(),
5343
+ }):
5344
+ yield
5330
5345
 
5331
5346
  @contextmanager
5332
5347
  def has_expr_setname_manage(self, original, loc, item):
@@ -5519,7 +5534,15 @@ class {protocol_var}({tokens}, _coconut.typing.Protocol): pass
5519
5534
  # only mark as final after all checks pass
5520
5535
  if is_final:
5521
5536
  final_vars[name] = loc
5522
- if self.pure and assign and not escaped and not expr_setname:
5537
+ if (
5538
+ self.pure
5539
+ and assign
5540
+ and not escaped
5541
+ and not expr_setname
5542
+ # wildcard matching uses setname but doesn't actually assign the name,
5543
+ # so we need this to avoid false positives
5544
+ and name != wildcard
5545
+ ):
5523
5546
  pure_vars[name] = loc
5524
5547
 
5525
5548
  if name == "exec":
@@ -1511,9 +1511,27 @@ class Grammar(object):
1511
1511
  expr_assign_item = expr_base_assign_item | expr_star_assign_item
1512
1512
  expr_assignlist <<= itemlist(expr_assign_item, comma, suppress_trailing=False)
1513
1513
 
1514
+ # must be kept in sync with assignlist block above (but with unsafe_name)
1515
+ unsafe_simple_assign = Forward()
1516
+ unsafe_simple_assign_ref = maybeparens(
1517
+ lparen,
1518
+ (
1519
+ # refname if there's a trailer, unsafe_name if not
1520
+ (refname | passthrough_atom) + OneOrMore(ZeroOrMore(complex_trailer) + OneOrMore(simple_trailer))
1521
+ | unsafe_name
1522
+ | passthrough_atom
1523
+ ),
1524
+ rparen,
1525
+ )
1526
+
1514
1527
  simple_assignlist = maybeparens(lparen, itemlist(simple_assign, comma, suppress_trailing=False), rparen)
1515
1528
  typed_assign_stmt = Forward()
1516
- typed_assign_stmt_ref = simple_assign + colon.suppress() + typedef_test + Optional(equals.suppress() + test_expr)
1529
+ typed_assign_stmt_ref = (
1530
+ # with assignment value, use simple_assign
1531
+ simple_assign + colon.suppress() + typedef_test + equals.suppress() + test_expr
1532
+ # bare annotation, use unsafe_simple_assign
1533
+ | unsafe_simple_assign + colon.suppress() + typedef_test
1534
+ )
1517
1535
  basic_stmt = addspace(ZeroOrMore(assignlist + equals) + test_expr)
1518
1536
 
1519
1537
  type_param = Forward()
@@ -2369,6 +2387,41 @@ class Grammar(object):
2369
2387
  )
2370
2388
 
2371
2389
  base_case_funcdef = Forward()
2390
+ case_funcdef_case = Forward()
2391
+ case_funcdef_case_ref = (
2392
+ keyword("case").suppress()
2393
+ + lparen.suppress()
2394
+ + match_args_list
2395
+ + match_guard
2396
+ + rparen.suppress()
2397
+ + (
2398
+ colon.suppress()
2399
+ + (
2400
+ newline.suppress()
2401
+ + indent.suppress()
2402
+ + attach(condense(OneOrMore(stmt)), make_suite_handle)
2403
+ + dedent.suppress()
2404
+ | attach(simple_stmt, make_suite_handle)
2405
+ )
2406
+ | equals.suppress()
2407
+ + (
2408
+ (
2409
+ newline.suppress()
2410
+ + indent.suppress()
2411
+ + attach(math_funcdef_body, make_suite_handle)
2412
+ + dedent.suppress()
2413
+ )
2414
+ | attach(implicit_return_stmt, make_suite_handle)
2415
+ )
2416
+ )
2417
+ )
2418
+ case_funcdef_type = Forward()
2419
+ case_funcdef_type_ref = (
2420
+ keyword("type").suppress()
2421
+ + parameters
2422
+ + return_typedef
2423
+ + newline.suppress()
2424
+ )
2372
2425
  base_case_funcdef_ref = (
2373
2426
  keyword("def").suppress()
2374
2427
  + Group(
@@ -2381,38 +2434,11 @@ class Grammar(object):
2381
2434
  - Optional(docstring)
2382
2435
  - Group(OneOrMore(
2383
2436
  labeled_group(
2384
- keyword("case").suppress()
2385
- + lparen.suppress()
2386
- + match_args_list
2387
- + match_guard
2388
- + rparen.suppress()
2389
- + (
2390
- colon.suppress()
2391
- + (
2392
- newline.suppress()
2393
- + indent.suppress()
2394
- + attach(condense(OneOrMore(stmt)), make_suite_handle)
2395
- + dedent.suppress()
2396
- | attach(simple_stmt, make_suite_handle)
2397
- )
2398
- | equals.suppress()
2399
- + (
2400
- (
2401
- newline.suppress()
2402
- + indent.suppress()
2403
- + attach(math_funcdef_body, make_suite_handle)
2404
- + dedent.suppress()
2405
- )
2406
- | attach(implicit_return_stmt, make_suite_handle)
2407
- )
2408
- ),
2437
+ case_funcdef_case,
2409
2438
  "match",
2410
2439
  )
2411
2440
  | labeled_group(
2412
- keyword("type").suppress()
2413
- + parameters
2414
- + return_typedef
2415
- + newline.suppress(),
2441
+ case_funcdef_type,
2416
2442
  "type",
2417
2443
  )
2418
2444
  ))
@@ -1393,7 +1393,10 @@ class Wrap(ParseElementEnhance):
1393
1393
 
1394
1394
 
1395
1395
  def manage(item, manager, include_in_packrat_context, greedy=True):
1396
- """Attach a manager to the given parse item."""
1396
+ """Attach a manager to the given parse item.
1397
+
1398
+ include_in_packrat_context should be True if the manager changes whether a parse can succeed and False otherwise.
1399
+ """
1397
1400
  return Wrap(item, manager, include_in_packrat_context=include_in_packrat_context, greedy=greedy)
1398
1401
 
1399
1402
 
@@ -26,7 +26,7 @@ import sys as _coconut_sys
26
26
  VERSION = "3.2.0"
27
27
  VERSION_NAME = None
28
28
  # False for release, int >= 1 for develop
29
- DEVELOP = 5
29
+ DEVELOP = 7
30
30
  ALPHA = False # for pre releases rather than post releases
31
31
 
32
32
  assert DEVELOP is False or DEVELOP >= 1, "DEVELOP must be False or an int >= 1"
@@ -1113,7 +1113,7 @@ if TEST_ALL:
1113
1113
  if not PYPY or PY2:
1114
1114
  def test_prelude(self):
1115
1115
  with using_paths(prelude):
1116
- comp_prelude(expect_retcode=None)
1116
+ comp_prelude(["--strict", "--pure"], expect_retcode=None)
1117
1117
  if MYPY and PY38:
1118
1118
  run_prelude()
1119
1119
 
@@ -572,6 +572,15 @@ class A:
572
572
  class A:
573
573
  def mk_int(x) = int(x)
574
574
  """.strip())
575
+ assert parse("""
576
+ x: int
577
+ x = 1
578
+ """.strip())
579
+ assert parse("""
580
+ case def f:
581
+ case(x) = x
582
+ case(x, y) = x + y
583
+ """.strip())
575
584
  assert_raises(-> parse("""
576
585
  def f():
577
586
  global x