syntax_tree 2.4.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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