syntax_tree 2.4.1 → 2.7.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.
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rake"
4
+ require "rake/tasklib"
5
+
6
+ require "syntax_tree"
7
+ require "syntax_tree/cli"
8
+
9
+ module SyntaxTree
10
+ module Rake
11
+ # A Rake task that runs format on a set of source files.
12
+ #
13
+ # Example:
14
+ #
15
+ # require 'syntax_tree/rake/write_task'
16
+ #
17
+ # SyntaxTree::Rake::WriteTask.new do |t|
18
+ # t.source_files = '{app,config,lib}/**/*.rb'
19
+ # end
20
+ #
21
+ # This will create task that can be run with:
22
+ #
23
+ # rake stree_write
24
+ #
25
+ class WriteTask < ::Rake::TaskLib
26
+ # Name of the task.
27
+ # Defaults to :"stree:write".
28
+ attr_accessor :name
29
+
30
+ # Glob pattern to match source files.
31
+ # Defaults to 'lib/**/*.rb'.
32
+ attr_accessor :source_files
33
+
34
+ # The set of plugins to require.
35
+ # Defaults to [].
36
+ attr_accessor :plugins
37
+
38
+ def initialize(
39
+ name = :"stree:write",
40
+ source_files = ::Rake::FileList["lib/**/*.rb"],
41
+ plugins = []
42
+ )
43
+ @name = name
44
+ @source_files = source_files
45
+ @plugins = plugins
46
+
47
+ yield self if block_given?
48
+ define_task
49
+ end
50
+
51
+ private
52
+
53
+ def define_task
54
+ desc "Runs `stree write` over source files"
55
+ task(name) { run_task }
56
+ end
57
+
58
+ def run_task
59
+ arguments = ["write"]
60
+ arguments << "--plugins=#{plugins.join(",")}" if plugins.any?
61
+
62
+ SyntaxTree::CLI.run(arguments + Array(source_files))
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "rake/check_task"
4
+ require_relative "rake/write_task"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SyntaxTree
4
- VERSION = "2.4.1"
4
+ VERSION = "2.7.0"
5
5
  end
@@ -49,9 +49,7 @@ module SyntaxTree
49
49
  # of circumstances, like when visiting the list of optional parameters
50
50
  # defined on a method.
51
51
  #
52
- class FieldVisitor < Visitor
53
- attr_reader :q
54
-
52
+ class FieldVisitor < BasicVisitor
55
53
  def visit_aref(node)
56
54
  node(node, "aref") do
57
55
  field("collection", node.collection)
@@ -586,6 +584,14 @@ module SyntaxTree
586
584
  end
587
585
  end
588
586
 
587
+ def visit_lambda_var(node)
588
+ node(node, "lambda_var") do
589
+ field("params", node.params)
590
+ list("locals", node.locals) if node.locals.any?
591
+ comments(node)
592
+ end
593
+ end
594
+
589
595
  def visit_lbrace(node)
590
596
  visit_token(node, "lbrace")
591
597
  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
@@ -4,72 +4,7 @@ module SyntaxTree
4
4
  # Visitor is a parent class that provides the ability to walk down the tree
5
5
  # and handle a subset of nodes. By defining your own subclass, you can
6
6
  # explicitly handle a node type by defining a visit_* method.
7
- class Visitor
8
- # This is raised when you use the Visitor.visit_method method and it fails.
9
- # It is correctable to through DidYouMean.
10
- class VisitMethodError < StandardError
11
- attr_reader :visit_method
12
-
13
- def initialize(visit_method)
14
- @visit_method = visit_method
15
- super("Invalid visit method: #{visit_method}")
16
- end
17
- end
18
-
19
- # This class is used by DidYouMean to offer corrections to invalid visit
20
- # method names.
21
- class VisitMethodChecker
22
- attr_reader :visit_method
23
-
24
- def initialize(error)
25
- @visit_method = error.visit_method
26
- end
27
-
28
- def corrections
29
- @corrections ||=
30
- DidYouMean::SpellChecker.new(
31
- dictionary: Visitor.visit_methods
32
- ).correct(visit_method)
33
- end
34
-
35
- DidYouMean.correct_error(VisitMethodError, self)
36
- end
37
-
38
- class << self
39
- # This method is here to help folks write visitors.
40
- #
41
- # It's not always easy to ensure you're writing the correct method name in
42
- # the visitor since it's perfectly valid to define methods that don't
43
- # override these parent methods.
44
- #
45
- # If you use this method, you can ensure you're writing the correct method
46
- # name. It will raise an error if the visit method you're defining isn't
47
- # actually a method on the parent visitor.
48
- def visit_method(method_name)
49
- return if visit_methods.include?(method_name)
50
-
51
- raise VisitMethodError, method_name
52
- end
53
-
54
- # This is the list of all of the valid visit methods.
55
- def visit_methods
56
- @visit_methods ||=
57
- Visitor.instance_methods.grep(/^visit_(?!child_nodes)/)
58
- end
59
- end
60
-
61
- def visit(node)
62
- node&.accept(self)
63
- end
64
-
65
- def visit_all(nodes)
66
- nodes.map { |node| visit(node) }
67
- end
68
-
69
- def visit_child_nodes(node)
70
- visit_all(node.child_nodes)
71
- end
72
-
7
+ class Visitor < BasicVisitor
73
8
  # Visit an ARef node.
74
9
  alias visit_aref visit_child_nodes
75
10
 
@@ -301,6 +236,9 @@ module SyntaxTree
301
236
  # Visit a Lambda node.
302
237
  alias visit_lambda visit_child_nodes
303
238
 
239
+ # Visit a LambdaVar node.
240
+ alias visit_lambda_var visit_child_nodes
241
+
304
242
  # Visit a LBrace node.
305
243
  alias visit_lbrace visit_child_nodes
306
244
 
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
 
@@ -10,36 +10,14 @@ require_relative "syntax_tree/formatter"
10
10
  require_relative "syntax_tree/node"
11
11
  require_relative "syntax_tree/parser"
12
12
  require_relative "syntax_tree/version"
13
+
14
+ require_relative "syntax_tree/basic_visitor"
13
15
  require_relative "syntax_tree/visitor"
14
16
  require_relative "syntax_tree/visitor/field_visitor"
15
17
  require_relative "syntax_tree/visitor/json_visitor"
16
18
  require_relative "syntax_tree/visitor/match_visitor"
17
19
  require_relative "syntax_tree/visitor/pretty_print_visitor"
18
20
 
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
21
  # Syntax Tree is a suite of tools built on top of the internal CRuby parser. It
44
22
  # provides the ability to generate a syntax tree from source, as well as the
45
23
  # tools necessary to inspect and manipulate that syntax tree. It can be used to
@@ -64,8 +42,8 @@ module SyntaxTree
64
42
  end
65
43
 
66
44
  # Parses the given source and returns the formatted source.
67
- def self.format(source)
68
- formatter = Formatter.new(source, [])
45
+ def self.format(source, maxwidth = 80)
46
+ formatter = Formatter.new(source, [], maxwidth)
69
47
  parse(source).format(formatter)
70
48
 
71
49
  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.7.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-20 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
@@ -93,15 +121,20 @@ files:
93
121
  - doc/logo.svg
94
122
  - exe/stree
95
123
  - lib/syntax_tree.rb
124
+ - lib/syntax_tree/basic_visitor.rb
96
125
  - lib/syntax_tree/cli.rb
97
126
  - lib/syntax_tree/formatter.rb
98
127
  - lib/syntax_tree/formatter/single_quotes.rb
128
+ - lib/syntax_tree/formatter/trailing_comma.rb
99
129
  - lib/syntax_tree/language_server.rb
100
130
  - lib/syntax_tree/language_server/inlay_hints.rb
101
131
  - lib/syntax_tree/node.rb
102
132
  - lib/syntax_tree/parser.rb
103
133
  - lib/syntax_tree/plugin/single_quotes.rb
104
- - lib/syntax_tree/prettyprint.rb
134
+ - lib/syntax_tree/plugin/trailing_comma.rb
135
+ - lib/syntax_tree/rake/check_task.rb
136
+ - lib/syntax_tree/rake/write_task.rb
137
+ - lib/syntax_tree/rake_tasks.rb
105
138
  - lib/syntax_tree/version.rb
106
139
  - lib/syntax_tree/visitor.rb
107
140
  - lib/syntax_tree/visitor/field_visitor.rb