syntax_tree 2.4.1 → 2.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e69df6c9df69726ed7040c1b47584e8f17d9f3cc45a7a72de308aa9db39b4b66
4
- data.tar.gz: 9dddf054616a7ca765dc7ebb7bbe98dbdaee8114a34043dd66390d9a6d576ea2
3
+ metadata.gz: 3b1505fca44f379d951132dafb8122a2591fe46607c8402d096bab67bd53d0a3
4
+ data.tar.gz: 0d58e60b6779ec1acd22ca776f3610f290c4b048cc1bf41b425f9c5a74e80db8
5
5
  SHA512:
6
- metadata.gz: cf759fc42716b42988156d84333ebe66baa87ad881b85e062e0942d285c8be25f074a894b329c6a69758c68655667c1972291f68339141592f4e01ce089a9a6c
7
- data.tar.gz: e5b5e3a6645fa340959458be14670784cba49f0d6436a518429ef8926581dea2169b03400f14916c8c9bbb66388d1116b8cdedac811e371a1ea37368bd5f3b42
6
+ metadata.gz: 42d4dea2571b21b3cf877a129f0a840f30125eb918c558b25b5bc303c915bb758b731151cdf2cfb6e70e92cbc4957d915095d1284312529675fec71f3a6af3a7
7
+ data.tar.gz: 5178b395ddcfdcf795c18f7c986e86a12f6ca2bdec871792de2c21220dffc7c2a2238a02926cece3021635f42859ab5084ba4dba21932ce7f1791c2a17a5bc49
data/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.5.0] - 2022-05-13
10
+
11
+ ### Added
12
+
13
+ - [#79](https://github.com/ruby-syntax-tree/syntax_tree/pull/79) - Support an optional `maxwidth` second argument to `SyntaxTree.format`.
14
+
15
+ ### Changed
16
+
17
+ - [#77](https://github.com/ruby-syntax-tree/syntax_tree/pull/77) - Correct the pattern for checking if a dynamic symbol can be converted into a label as a hash key.
18
+ - [#72](https://github.com/ruby-syntax-tree/syntax_tree/pull/72) - Disallow conditionals with `not` without parentheses in the predicate from turning into a ternary.
19
+
9
20
  ## [2.4.1] - 2022-05-10
10
21
 
11
22
  - [#73](https://github.com/ruby-syntax-tree/syntax_tree/pull/73) - Fix nested hash patterns from accidentally adding a `then` to their output.
@@ -213,7 +224,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
213
224
 
214
225
  - 🎉 Initial release! 🎉
215
226
 
216
- [unreleased]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v2.4.1...HEAD
227
+ [unreleased]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v2.5.0...HEAD
228
+ [2.5.0]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v2.4.1...v2.5.0
217
229
  [2.4.1]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v2.4.0...v2.4.1
218
230
  [2.4.0]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v2.3.1...v2.4.0
219
231
  [2.3.1]: https://github.com/ruby-syntax-tree/syntax_tree/compare/v2.3.0...v2.3.1
data/Gemfile CHANGED
@@ -3,5 +3,3 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
-
7
- gem "rubocop"
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- syntax_tree (2.4.1)
4
+ syntax_tree (2.5.0)
5
+ prettier_print
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -12,11 +13,12 @@ GEM
12
13
  parallel (1.22.1)
13
14
  parser (3.1.2.0)
14
15
  ast (~> 2.4.1)
16
+ prettier_print (0.1.0)
15
17
  rainbow (3.1.1)
16
18
  rake (13.0.6)
17
- regexp_parser (2.3.1)
19
+ regexp_parser (2.4.0)
18
20
  rexml (3.2.5)
19
- rubocop (1.29.0)
21
+ rubocop (1.29.1)
20
22
  parallel (~> 1.10)
21
23
  parser (>= 3.1.0.0)
22
24
  rainbow (>= 2.2.2, < 4.0)
@@ -3,7 +3,7 @@
3
3
  module SyntaxTree
4
4
  # A slightly enhanced PP that knows how to format recursively including
5
5
  # comments.
6
- class Formatter < PP
6
+ class Formatter < PrettierPrint
7
7
  COMMENT_PRIORITY = 1
8
8
  HEREDOC_PRIORITY = 2
9
9
 
@@ -123,7 +123,7 @@ module SyntaxTree
123
123
  end
124
124
 
125
125
  def construct_keys
126
- PP.format(+"") { |q| Visitor::MatchVisitor.new(q).visit(self) }
126
+ PrettierPrint.format(+"") { |q| Visitor::MatchVisitor.new(q).visit(self) }
127
127
  end
128
128
  end
129
129
 
@@ -1388,7 +1388,7 @@ module SyntaxTree
1388
1388
  module HashKeyFormatter
1389
1389
  # Formats the keys of a hash literal using labels.
1390
1390
  class Labels
1391
- LABEL = /^[@$_A-Za-z]([_A-Za-z0-9]*)?([!_=?A-Za-z0-9])?$/
1391
+ LABEL = /\A[A-Za-z_](\w*[\w!?])?\z/
1392
1392
 
1393
1393
  def format_key(q, key)
1394
1394
  case key
@@ -1666,52 +1666,6 @@ module SyntaxTree
1666
1666
  end
1667
1667
  end
1668
1668
 
1669
- # This module will remove any breakables from the list of contents so that no
1670
- # newlines are present in the output.
1671
- module RemoveBreaks
1672
- class << self
1673
- def call(doc)
1674
- marker = Object.new
1675
- stack = [doc]
1676
-
1677
- while stack.any?
1678
- doc = stack.pop
1679
-
1680
- if doc == marker
1681
- stack.pop
1682
- next
1683
- end
1684
-
1685
- stack += [doc, marker]
1686
-
1687
- case doc
1688
- when PrettyPrint::Align, PrettyPrint::Indent, PrettyPrint::Group
1689
- doc.contents.map! { |child| remove_breaks(child) }
1690
- stack += doc.contents.reverse
1691
- when PrettyPrint::IfBreak
1692
- doc.flat_contents.map! { |child| remove_breaks(child) }
1693
- stack += doc.flat_contents.reverse
1694
- end
1695
- end
1696
- end
1697
-
1698
- private
1699
-
1700
- def remove_breaks(doc)
1701
- case doc
1702
- when PrettyPrint::Breakable
1703
- text = PrettyPrint::Text.new
1704
- text.add(object: doc.force? ? "; " : doc.separator, width: doc.width)
1705
- text
1706
- when PrettyPrint::IfBreak
1707
- PrettyPrint::Align.new(indent: 0, contents: doc.flat_contents)
1708
- else
1709
- doc
1710
- end
1711
- end
1712
- end
1713
- end
1714
-
1715
1669
  # BlockVar represents the parameters being declared for a block. Effectively
1716
1670
  # this node is everything contained within the pipes. This includes all of the
1717
1671
  # various parameter types, as well as block-local variable declarations.
@@ -1752,8 +1706,7 @@ module SyntaxTree
1752
1706
 
1753
1707
  def format(q)
1754
1708
  q.group(0, "|", "|") do
1755
- doc = q.format(params)
1756
- RemoveBreaks.call(doc)
1709
+ q.remove_breaks(q.format(params))
1757
1710
 
1758
1711
  if locals.any?
1759
1712
  q.text("; ")
@@ -3096,31 +3049,6 @@ module SyntaxTree
3096
3049
 
3097
3050
  private
3098
3051
 
3099
- # This is a somewhat naive method that is attempting to sum up the width of
3100
- # the doc nodes that make up the given doc node. This is used to align
3101
- # content.
3102
- def doc_width(parent)
3103
- queue = [parent]
3104
- width = 0
3105
-
3106
- until queue.empty?
3107
- doc = queue.shift
3108
-
3109
- case doc
3110
- when PrettyPrint::Text
3111
- width += doc.width
3112
- when PrettyPrint::Indent, PrettyPrint::Align, PrettyPrint::Group
3113
- queue = doc.contents + queue
3114
- when PrettyPrint::IfBreak
3115
- queue = doc.break_contents + queue
3116
- when PrettyPrint::Breakable
3117
- width = 0
3118
- end
3119
- end
3120
-
3121
- width
3122
- end
3123
-
3124
3052
  def argument_alignment(q, doc)
3125
3053
  # Very special handling case for rspec matchers. In general with rspec
3126
3054
  # matchers you expect to see something like:
@@ -3138,7 +3066,7 @@ module SyntaxTree
3138
3066
  if %w[to not_to to_not].include?(message.value)
3139
3067
  0
3140
3068
  else
3141
- width = doc_width(doc) + 1
3069
+ width = q.last_position(doc) + 1
3142
3070
  width > (q.maxwidth / 2) ? 0 : width
3143
3071
  end
3144
3072
  end
@@ -4891,17 +4819,9 @@ module SyntaxTree
4891
4819
  end
4892
4820
 
4893
4821
  def format(q)
4894
- # This is a very specific behavior that should probably be included in the
4895
- # prettyprint module. It's when you want to force a newline, but don't
4896
- # want to force the break parent.
4897
- breakable = -> do
4898
- q.target << PrettyPrint::Breakable.new(
4899
- " ",
4900
- 1,
4901
- indent: false,
4902
- force: true
4903
- )
4904
- end
4822
+ # This is a very specific behavior where you want to force a newline, but
4823
+ # don't want to force the break parent.
4824
+ breakable = -> { q.breakable(indent: false, force: :skip_break_parent) }
4905
4825
 
4906
4826
  q.group do
4907
4827
  q.format(beginning)
@@ -5197,6 +5117,8 @@ module SyntaxTree
5197
5117
  case node
5198
5118
  in predicate: Assign | Command | CommandCall | MAssign | OpAssign
5199
5119
  false
5120
+ in predicate: Not[parentheses: false]
5121
+ false
5200
5122
  in {
5201
5123
  statements: { body: [truthy] },
5202
5124
  consequent: Else[statements: { body: [falsy] }]
@@ -5325,9 +5247,8 @@ module SyntaxTree
5325
5247
  # force it into the output but we _don't_ want to explicitly
5326
5248
  # break the parent. If a break-parent shows up in the tree, then
5327
5249
  # it's going to force it all the way up to the tree, which is
5328
- # going to negate the ternary. Maybe this should be an option in
5329
- # prettyprint? As in force: :no_break_parent or something.
5330
- q.target << PrettyPrint::Breakable.new(" ", 1, force: true)
5250
+ # going to negate the ternary.
5251
+ q.breakable(force: :skip_break_parent)
5331
5252
  q.format(node.consequent.statements)
5332
5253
  end
5333
5254
  end
@@ -8314,8 +8235,7 @@ module SyntaxTree
8314
8235
  # same line in the source, then we're going to leave them in place and
8315
8236
  # assume that's the way the developer wanted this expression
8316
8237
  # represented.
8317
- doc = q.group(0, '#{', "}") { q.format(statements) }
8318
- RemoveBreaks.call(doc)
8238
+ q.remove_breaks(q.group(0, '#{', "}") { q.format(statements) })
8319
8239
  else
8320
8240
  q.group do
8321
8241
  q.text('#{')
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SyntaxTree
4
- VERSION = "2.4.1"
4
+ VERSION = "2.5.0"
5
5
  end
@@ -22,7 +22,7 @@ module SyntaxTree
22
22
  # entire value into the output buffer.
23
23
  q.text(node.inspect)
24
24
  else
25
- q.pp(node)
25
+ node.pretty_print(q)
26
26
  end
27
27
  end
28
28
 
@@ -114,7 +114,7 @@ module SyntaxTree
114
114
  q.nest(0) do
115
115
  q.text(name)
116
116
  q.text(": ")
117
- q.pp(value)
117
+ value.pretty_print(q)
118
118
  end
119
119
  end
120
120
  end
data/lib/syntax_tree.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "json"
4
4
  require "pp"
5
- require "prettyprint"
5
+ require "prettier_print"
6
6
  require "ripper"
7
7
  require "stringio"
8
8
 
@@ -16,30 +16,6 @@ require_relative "syntax_tree/visitor/json_visitor"
16
16
  require_relative "syntax_tree/visitor/match_visitor"
17
17
  require_relative "syntax_tree/visitor/pretty_print_visitor"
18
18
 
19
- # If PrettyPrint::Align isn't defined, then we haven't gotten the updated
20
- # version of prettyprint. In that case we'll define our own. This is going to
21
- # overwrite a bunch of methods, so silencing them as well.
22
- unless PrettyPrint.const_defined?(:Align)
23
- verbose = $VERBOSE
24
- $VERBOSE = nil
25
-
26
- begin
27
- require_relative "syntax_tree/prettyprint"
28
- ensure
29
- $VERBOSE = verbose
30
- end
31
- end
32
-
33
- # When PP is running, it expects that everything that interacts with it is going
34
- # to flow through PP.pp, since that's the main entry into the module from the
35
- # perspective of its uses in core Ruby. In doing so, it calls guard_inspect_key
36
- # at the top of the PP.pp method, which establishes some thread-local hashes to
37
- # check for cycles in the pretty printed tree. This means that if you want to
38
- # manually call pp on some object _before_ you have established these hashes,
39
- # you're going to break everything. So this call ensures that those hashes have
40
- # been set up before anything uses pp manually.
41
- PP.new(+"", 0).guard_inspect_key {}
42
-
43
19
  # Syntax Tree is a suite of tools built on top of the internal CRuby parser. It
44
20
  # provides the ability to generate a syntax tree from source, as well as the
45
21
  # tools necessary to inspect and manipulate that syntax tree. It can be used to
@@ -64,8 +40,8 @@ module SyntaxTree
64
40
  end
65
41
 
66
42
  # Parses the given source and returns the formatted source.
67
- def self.format(source)
68
- formatter = Formatter.new(source, [])
43
+ def self.format(source, maxwidth = 80)
44
+ formatter = Formatter.new(source, [], maxwidth)
69
45
  parse(source).format(formatter)
70
46
 
71
47
  formatter.flush
data/syntax_tree.gemspec CHANGED
@@ -25,8 +25,11 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = %w[lib]
27
27
 
28
+ spec.add_dependency "prettier_print"
29
+
28
30
  spec.add_development_dependency "bundler"
29
31
  spec.add_development_dependency "minitest"
30
32
  spec.add_development_dependency "rake"
33
+ spec.add_development_dependency "rubocop"
31
34
  spec.add_development_dependency "simplecov"
32
35
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syntax_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Newton
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-10 00:00:00.000000000 Z
11
+ date: 2022-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: prettier_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: simplecov
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +129,6 @@ files:
101
129
  - lib/syntax_tree/node.rb
102
130
  - lib/syntax_tree/parser.rb
103
131
  - lib/syntax_tree/plugin/single_quotes.rb
104
- - lib/syntax_tree/prettyprint.rb
105
132
  - lib/syntax_tree/version.rb
106
133
  - lib/syntax_tree/visitor.rb
107
134
  - lib/syntax_tree/visitor/field_visitor.rb
@@ -129,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
156
  - !ruby/object:Gem::Version
130
157
  version: '0'
131
158
  requirements: []
132
- rubygems_version: 3.4.0.dev
159
+ rubygems_version: 3.3.3
133
160
  signing_key:
134
161
  specification_version: 4
135
162
  summary: A parser based on ripper