tree_stand 0.1.1 → 0.1.3

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: 70f39e746530204d0ac0304b61c77bc13e955c70691dfcadd3cc9c90a83f6240
4
- data.tar.gz: e4266bbbaa896b7562a3c94c9366456aa4422339cea3481671c7c3ce4a655cc2
3
+ metadata.gz: 0dec13e65fde2c739a206944e34805122f065982b6a87bf5720baca17f0fb8a5
4
+ data.tar.gz: b00f3d2b463196d0336ec45ca38294d5f41bab931f546ce5224e1f695268448b
5
5
  SHA512:
6
- metadata.gz: c9513cd144b7899a19938d742ad73efea3cd6ade65e0850d6c81f5a0c505929c31f56c1143ac18dd442cc208ef5ff91b1da2091258513cb22e8af3b476e1af1a
7
- data.tar.gz: 1034636108f5e4b265b77c82202c5a9c17b9104d840599f3a1bee16bdfdd10c135f19ac82f43702d2bf421e3c629050debf9ae16c85753eb774458d6ed0a0536
6
+ metadata.gz: e00d9f5b809a264bb19672dc0a0b28b58ea37944004fd2c63ca76042eed15f1c1b9f0d539f627d0565a16492522a51cd69e30574cc540c60d66c66fc1484bb3b
7
+ data.tar.gz: b28e29fd57802ef79b0a9e88ff2fdaa9f0e79e33ef49173c56f109cdaf2737438f6bb2c23aa5a75fc6af2b4b2c96831a973e921bbcbcfd2f11c2735b525b4085
data/Gemfile CHANGED
@@ -3,12 +3,3 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  gem 'tree_sitter', git: 'https://github.com/Faveod/ruby-tree-sitter'
6
-
7
- group :development do
8
- gem "yard"
9
- end
10
-
11
- group :test do
12
- gem "minitest-focus"
13
- gem "minitest-reporters"
14
- end
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2022 derekstride
3
+ Copyright (c) 2022-present, Shopify Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,7 @@
1
1
  module TreeStand
2
2
  # Wrapper around a TreeSitter capture.
3
3
  # @see TreeStand::Tree#query
4
+ # @see TreeStand::Node#query
4
5
  # @see TreeStand::Match
5
6
  class Capture
6
7
  # @return [TreeStand::Match]
@@ -1,6 +1,7 @@
1
1
  module TreeStand
2
2
  # Wrapper around a TreeSitter match.
3
3
  # @see TreeStand::Tree#query
4
+ # @see TreeStand::Node#query
4
5
  # @see TreeStand::Capture
5
6
  class Match
6
7
  # @return [TreeStand::Tree]
@@ -9,6 +10,8 @@ module TreeStand
9
10
  attr_reader :ts_query
10
11
  # @return [TreeSitter::Match]
11
12
  attr_reader :ts_match
13
+ # @return [Array<TreeStand::Capture>]
14
+ attr_reader :captures
12
15
 
13
16
  # @api private
14
17
  def initialize(tree, ts_query, ts_match)
@@ -16,9 +19,14 @@ module TreeStand
16
19
  @ts_query = ts_query
17
20
  @ts_match = ts_match
18
21
 
19
- # TODO: This is a hack to get the captures to be populated.
22
+ # It's important to load all of the captures when a Match is
23
+ # instantiated, otherwise the ts_match will be invalid after
24
+ # TreeSitter::Cursor#next_match is called.
25
+ #
20
26
  # See: https://github.com/Faveod/ruby-tree-sitter/pull/16
21
- captures
27
+ @captures = @ts_match.captures.map do |capture|
28
+ TreeStand::Capture.new(self, capture)
29
+ end
22
30
  end
23
31
 
24
32
  # Looks up a capture by name. TreeSitter strips the `@` from the capture name.
@@ -34,13 +42,6 @@ module TreeStand
34
42
  captures.find { |capture| capture.name == capture_name }
35
43
  end
36
44
 
37
- # @return [Array<TreeStand::Capture>]
38
- def captures
39
- @captures ||= @ts_match.captures.map do |capture|
40
- TreeStand::Capture.new(self, capture)
41
- end
42
- end
43
-
44
45
  # @param other [Object]
45
46
  # @return [bool]
46
47
  def ==(other)
@@ -9,6 +9,11 @@ module TreeStand
9
9
 
10
10
  def_delegators :@ts_node, :type, :start_byte, :end_byte, :start_point, :end_point
11
11
 
12
+ # @return [TreeStand::Tree]
13
+ attr_reader :tree
14
+ # @return [TreeSitter::Node]
15
+ attr_reader :ts_node
16
+
12
17
  # @api private
13
18
  def initialize(tree, ts_node)
14
19
  @tree = tree
@@ -16,6 +21,38 @@ module TreeStand
16
21
  @fields = @ts_node.each_field.to_a.map(&:first)
17
22
  end
18
23
 
24
+ # TreeSitter uses a `TreeSitter::Cursor` to iterate over matches by calling
25
+ # `curser#next_match` repeatedly until it returns `nil`.
26
+ #
27
+ # This method does all of that for you and collects all of the
28
+ # {TreeStand::Match matches} into an array.
29
+ #
30
+ # @example
31
+ # # This will return a match for each identifier nodes in the tree.
32
+ # tree_matches = tree.query(<<~QUERY)
33
+ # (identifier) @identifier
34
+ # QUERY
35
+ #
36
+ # # It is equivalent to:
37
+ # tree.root_node.query(<<~QUERY)
38
+ # (identifier) @identifier
39
+ # QUERY
40
+ #
41
+ # @see TreeStand::Match
42
+ # @see TreeStand::Capture
43
+ #
44
+ # @param query_string [String]
45
+ # @return [Array<TreeStand::Match>]
46
+ def query(query_string)
47
+ ts_query = TreeSitter::Query.new(@tree.parser.ts_language, query_string)
48
+ ts_cursor = TreeSitter::QueryCursor.exec(ts_query, ts_node)
49
+ matches = []
50
+ while match = ts_cursor.next_match
51
+ matches << TreeStand::Match.new(@tree, ts_query, match)
52
+ end
53
+ matches
54
+ end
55
+
19
56
  # @return [TreeStand::Range]
20
57
  def range
21
58
  TreeStand::Range.new(
@@ -26,6 +26,8 @@ module TreeStand
26
26
  attr_reader :document
27
27
  # @return [TreeSitter::Tree]
28
28
  attr_reader :ts_tree
29
+ # @return [TreeStand::Parser]
30
+ attr_reader :parser
29
31
 
30
32
  # @api private
31
33
  def initialize(parser, tree, document)
@@ -39,24 +41,12 @@ module TreeStand
39
41
  TreeStand::Node.new(self, @ts_tree.root_node)
40
42
  end
41
43
 
42
- # TreeSitter uses a `TreeSitter::Cursor` to iterate over matches by calling
43
- # `curser#next_match` repeatedly until it returns `nil`.
44
- #
45
- # This method does all of that for you and collects them into an array.
46
- #
47
- # @see TreeStand::Match
48
- # @see TreeStand::Capture
49
- #
50
- # @param query_string [String]
51
- # @return [Array<TreeStand::Match>]
44
+ # (see TreeStand::Node#query)
45
+ # @note This is a convenience method that calls {TreeStand::Node#query} on
46
+ # {#root_node}.
47
+ # @see TreeStand::Node#query
52
48
  def query(query_string)
53
- ts_query = TreeSitter::Query.new(@parser.ts_language, query_string)
54
- ts_cursor = TreeSitter::QueryCursor.exec(ts_query, @ts_tree.root_node)
55
- matches = []
56
- while match = ts_cursor.next_match
57
- matches << TreeStand::Match.new(self, ts_query, match)
58
- end
59
- matches
49
+ root_node.query(query_string)
60
50
  end
61
51
 
62
52
  # This method replaces the section of the document specified by range and
@@ -1,4 +1,4 @@
1
1
  module TreeStand
2
2
  # The current version of the gem.
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.3"
4
4
  end
data/tree_stand.gemspec CHANGED
@@ -31,8 +31,11 @@ Gem::Specification.new do |spec|
31
31
 
32
32
  spec.add_dependency "zeitwerk"
33
33
 
34
- spec.add_development_dependency "bundler", "~> 2.3"
35
- spec.add_development_dependency "rake", "~> 10.0"
34
+ spec.add_development_dependency "bundler"
35
+ spec.add_development_dependency "rake"
36
36
  spec.add_development_dependency "minitest"
37
+ spec.add_development_dependency "minitest-reporters"
38
+ spec.add_development_dependency "minitest-focus"
37
39
  spec.add_development_dependency "pry-byebug"
40
+ spec.add_development_dependency "yard"
38
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tree_stand
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - derekstride
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-13 00:00:00.000000000 Z
11
+ date: 2022-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -28,30 +28,30 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '2.3'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '2.3'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-reporters
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'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-focus
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: pry-byebug
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +108,20 @@ dependencies:
80
108
  - - ">="
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description:
84
126
  email:
85
127
  - derek@stride.host