prism 0.15.0 → 0.16.0

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -1
  3. data/Makefile +6 -0
  4. data/README.md +2 -0
  5. data/config.yml +21 -20
  6. data/docs/configuration.md +2 -0
  7. data/docs/javascript.md +90 -0
  8. data/docs/releasing.md +27 -0
  9. data/docs/ruby_api.md +2 -0
  10. data/ext/prism/api_node.c +66 -68
  11. data/ext/prism/extension.c +73 -0
  12. data/ext/prism/extension.h +1 -1
  13. data/include/prism/ast.h +40 -40
  14. data/include/prism/defines.h +9 -0
  15. data/include/prism/enc/pm_encoding.h +1 -0
  16. data/include/prism/node.h +0 -17
  17. data/include/prism/parser.h +1 -0
  18. data/include/prism/prettyprint.h +15 -0
  19. data/include/prism/util/pm_buffer.h +10 -4
  20. data/include/prism/util/pm_constant_pool.h +1 -1
  21. data/include/prism/util/pm_newline_list.h +1 -1
  22. data/include/prism/version.h +2 -2
  23. data/include/prism.h +11 -11
  24. data/lib/prism/compiler.rb +0 -3
  25. data/lib/prism/debug.rb +20 -6
  26. data/lib/prism/desugar_compiler.rb +1 -1
  27. data/lib/prism/dispatcher.rb +0 -14
  28. data/lib/prism/dsl.rb +8 -13
  29. data/lib/prism/ffi.rb +25 -0
  30. data/lib/prism/lex_compat.rb +1 -1
  31. data/lib/prism/mutation_compiler.rb +3 -8
  32. data/lib/prism/node.rb +123 -159
  33. data/lib/prism/node_ext.rb +23 -16
  34. data/lib/prism/parse_result.rb +21 -5
  35. data/lib/prism/pattern.rb +3 -3
  36. data/lib/prism/serialize.rb +900 -304
  37. data/lib/prism/visitor.rb +0 -3
  38. data/prism.gemspec +8 -1
  39. data/rbi/prism.rbi +7261 -0
  40. data/rbi/prism_static.rbi +182 -0
  41. data/sig/prism.rbs +4439 -0
  42. data/sig/prism_static.rbs +110 -0
  43. data/src/enc/pm_unicode.c +1 -1
  44. data/src/node.c +28 -29
  45. data/src/prettyprint.c +7674 -1647
  46. data/src/prism.c +353 -300
  47. data/src/regexp.c +2 -0
  48. data/src/serialize.c +392 -381
  49. data/src/util/pm_buffer.c +47 -12
  50. data/src/util/pm_constant_pool.c +2 -2
  51. data/src/util/pm_newline_list.c +8 -54
  52. metadata +9 -2
@@ -0,0 +1,110 @@
1
+ module Prism
2
+ class ParseResult
3
+ def value: () -> ProgramNode
4
+ def comments: () -> Array[Comment]
5
+ def errors: () -> Array[ParseError]
6
+ def warnings: () -> Array[ParseWarning]
7
+ def source: () -> Source
8
+ end
9
+
10
+ class ParseError
11
+ def message: () -> String
12
+ def location: () -> Location
13
+ end
14
+
15
+ class ParseWarning
16
+ def message: () -> String
17
+ def location: () -> Location
18
+ end
19
+
20
+ class Node
21
+ def child_nodes: () -> Array[Node?]
22
+ def location: () -> Location
23
+ def slice: () -> String
24
+ end
25
+
26
+ class Comment
27
+ def location: () -> Location
28
+ end
29
+
30
+ class Location
31
+ def initialize: (source: Source, start_offset: Integer, length: Integer) -> void
32
+ def slice: () -> String
33
+ def comments: () -> Array[Comment]
34
+ def copy: (**untyped) -> Location
35
+ def start_offset: () -> Integer
36
+ def end_offset: () -> Integer
37
+ def start_line: () -> Integer
38
+ def end_line: () -> Integer
39
+ def start_column: () -> Integer
40
+ def end_column: () -> Integer
41
+ end
42
+
43
+ class Source
44
+ attr_reader source: String
45
+ attr_reader offsets: Array[Integer]
46
+
47
+ @source: String
48
+ @offsets: Array[Integer]
49
+
50
+ def initialize: (source: String, offsets: Array[Integer]) -> void
51
+ def slice: (offset: Integer, length: Integer) -> String
52
+ def line: (value: Integer) -> Integer
53
+ def line_offset: (value: Integer) -> Integer
54
+ def column: (value: Integer) -> Integer
55
+ end
56
+
57
+ class Token
58
+ attr_reader type: untyped
59
+ attr_reader value: String
60
+ attr_reader location: Location
61
+
62
+ @type: untyped
63
+ @value: String
64
+ @location: Location
65
+
66
+ def initialize: (type: untyped, value: String, location: Location) -> void
67
+ def deconstruct_keys: (keys: untyped) -> untyped
68
+ def pretty_print: (q: untyped) -> untyped
69
+ def ==: (other: untyped) -> bool
70
+ end
71
+
72
+ class NodeInspector
73
+ attr_reader prefix: String
74
+ attr_reader output: String
75
+
76
+ @prefix: String
77
+ @output: String
78
+
79
+ def initialize: (prefix: String) -> void
80
+
81
+ # Appends a line to the output with the current prefix.
82
+ def <<: (line: String) -> void
83
+
84
+ # This generates a string that is used as the header of the inspect output
85
+ # for any given node.
86
+ def header: (node: Node) -> String
87
+
88
+ # Generates a string that represents a list of nodes. It handles properly
89
+ # using the box drawing characters to make the output look nice.
90
+ def list: (prefix: String, nodes: Array[Node]) -> String
91
+
92
+ # Generates a string that represents a location field on a node.
93
+ def location: (value: Location) -> String
94
+
95
+ # Generates a string that represents a child node.
96
+ def child_node: (node: Node, append: String) -> String
97
+
98
+ # Returns a new inspector that can be used to inspect a child node.
99
+ def child_inspector: (append: String) -> NodeInspector
100
+
101
+ # Returns the output as a string.
102
+ def to_str: () -> String
103
+ end
104
+
105
+ class BasicVisitor
106
+ def visit: (node: Node?) -> void
107
+ def visit_all: (nodes: Array[Node?]) -> void
108
+ def visit_child_nodes: (node: Node) -> void
109
+ end
110
+ end
data/src/enc/pm_unicode.c CHANGED
@@ -2285,7 +2285,7 @@ pm_encoding_utf_8_alnum_char(const uint8_t *b, ptrdiff_t n) {
2285
2285
  }
2286
2286
  }
2287
2287
 
2288
- static bool
2288
+ bool
2289
2289
  pm_encoding_utf_8_isupper_char(const uint8_t *b, ptrdiff_t n) {
2290
2290
  if (*b < 0x80) {
2291
2291
  return (pm_encoding_unicode_table[*b] & PRISM_ENCODING_UPPERCASE_BIT) ? true : false;
data/src/node.c CHANGED
@@ -529,9 +529,9 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
529
529
  if (cast->constant != NULL) {
530
530
  pm_node_destroy(parser, (pm_node_t *)cast->constant);
531
531
  }
532
- pm_node_list_free(parser, &cast->assocs);
533
- if (cast->kwrest != NULL) {
534
- pm_node_destroy(parser, (pm_node_t *)cast->kwrest);
532
+ pm_node_list_free(parser, &cast->elements);
533
+ if (cast->rest != NULL) {
534
+ pm_node_destroy(parser, (pm_node_t *)cast->rest);
535
535
  }
536
536
  break;
537
537
  }
@@ -785,13 +785,21 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
785
785
  #line 57 "node.c.erb"
786
786
  case PM_MULTI_TARGET_NODE: {
787
787
  pm_multi_target_node_t *cast = (pm_multi_target_node_t *) node;
788
- pm_node_list_free(parser, &cast->targets);
788
+ pm_node_list_free(parser, &cast->lefts);
789
+ if (cast->rest != NULL) {
790
+ pm_node_destroy(parser, (pm_node_t *)cast->rest);
791
+ }
792
+ pm_node_list_free(parser, &cast->rights);
789
793
  break;
790
794
  }
791
795
  #line 57 "node.c.erb"
792
796
  case PM_MULTI_WRITE_NODE: {
793
797
  pm_multi_write_node_t *cast = (pm_multi_write_node_t *) node;
794
- pm_node_list_free(parser, &cast->targets);
798
+ pm_node_list_free(parser, &cast->lefts);
799
+ if (cast->rest != NULL) {
800
+ pm_node_destroy(parser, (pm_node_t *)cast->rest);
801
+ }
802
+ pm_node_list_free(parser, &cast->rights);
795
803
  pm_node_destroy(parser, (pm_node_t *)cast->value);
796
804
  break;
797
805
  }
@@ -916,12 +924,6 @@ pm_node_destroy(pm_parser_t *parser, pm_node_t *node) {
916
924
  pm_string_free(&cast->unescaped);
917
925
  break;
918
926
  }
919
- #line 57 "node.c.erb"
920
- case PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE: {
921
- pm_required_destructured_parameter_node_t *cast = (pm_required_destructured_parameter_node_t *) node;
922
- pm_node_list_free(parser, &cast->parameters);
923
- break;
924
- }
925
927
  #line 57 "node.c.erb"
926
928
  case PM_REQUIRED_PARAMETER_NODE: {
927
929
  break;
@@ -1685,9 +1687,9 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
1685
1687
  if (cast->constant != NULL) {
1686
1688
  pm_node_memsize_node((pm_node_t *)cast->constant, memsize);
1687
1689
  }
1688
- memsize->memsize += pm_node_list_memsize(&cast->assocs, memsize);
1689
- if (cast->kwrest != NULL) {
1690
- pm_node_memsize_node((pm_node_t *)cast->kwrest, memsize);
1690
+ memsize->memsize += pm_node_list_memsize(&cast->elements, memsize);
1691
+ if (cast->rest != NULL) {
1692
+ pm_node_memsize_node((pm_node_t *)cast->rest, memsize);
1691
1693
  }
1692
1694
  break;
1693
1695
  }
@@ -2003,8 +2005,12 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
2003
2005
  pm_multi_target_node_t *cast = (pm_multi_target_node_t *) node;
2004
2006
  memsize->memsize += sizeof(*cast);
2005
2007
  // Node lists will add in their own sizes below.
2006
- memsize->memsize -= sizeof(pm_node_list_t) * 1;
2007
- memsize->memsize += pm_node_list_memsize(&cast->targets, memsize);
2008
+ memsize->memsize -= sizeof(pm_node_list_t) * 2;
2009
+ memsize->memsize += pm_node_list_memsize(&cast->lefts, memsize);
2010
+ if (cast->rest != NULL) {
2011
+ pm_node_memsize_node((pm_node_t *)cast->rest, memsize);
2012
+ }
2013
+ memsize->memsize += pm_node_list_memsize(&cast->rights, memsize);
2008
2014
  break;
2009
2015
  }
2010
2016
  #line 102 "node.c.erb"
@@ -2012,8 +2018,12 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
2012
2018
  pm_multi_write_node_t *cast = (pm_multi_write_node_t *) node;
2013
2019
  memsize->memsize += sizeof(*cast);
2014
2020
  // Node lists will add in their own sizes below.
2015
- memsize->memsize -= sizeof(pm_node_list_t) * 1;
2016
- memsize->memsize += pm_node_list_memsize(&cast->targets, memsize);
2021
+ memsize->memsize -= sizeof(pm_node_list_t) * 2;
2022
+ memsize->memsize += pm_node_list_memsize(&cast->lefts, memsize);
2023
+ if (cast->rest != NULL) {
2024
+ pm_node_memsize_node((pm_node_t *)cast->rest, memsize);
2025
+ }
2026
+ memsize->memsize += pm_node_list_memsize(&cast->rights, memsize);
2017
2027
  pm_node_memsize_node((pm_node_t *)cast->value, memsize);
2018
2028
  break;
2019
2029
  }
@@ -2163,15 +2173,6 @@ pm_node_memsize_node(pm_node_t *node, pm_memsize_t *memsize) {
2163
2173
  memsize->memsize += pm_string_memsize(&cast->unescaped);
2164
2174
  break;
2165
2175
  }
2166
- #line 102 "node.c.erb"
2167
- case PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE: {
2168
- pm_required_destructured_parameter_node_t *cast = (pm_required_destructured_parameter_node_t *) node;
2169
- memsize->memsize += sizeof(*cast);
2170
- // Node lists will add in their own sizes below.
2171
- memsize->memsize -= sizeof(pm_node_list_t) * 1;
2172
- memsize->memsize += pm_node_list_memsize(&cast->parameters, memsize);
2173
- break;
2174
- }
2175
2176
  #line 102 "node.c.erb"
2176
2177
  case PM_REQUIRED_PARAMETER_NODE: {
2177
2178
  pm_required_parameter_node_t *cast = (pm_required_parameter_node_t *) node;
@@ -2643,8 +2644,6 @@ pm_node_type_to_str(pm_node_type_t node_type)
2643
2644
  return "PM_REDO_NODE";
2644
2645
  case PM_REGULAR_EXPRESSION_NODE:
2645
2646
  return "PM_REGULAR_EXPRESSION_NODE";
2646
- case PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE:
2647
- return "PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE";
2648
2647
  case PM_REQUIRED_PARAMETER_NODE:
2649
2648
  return "PM_REQUIRED_PARAMETER_NODE";
2650
2649
  case PM_RESCUE_MODIFIER_NODE: