decode 0.4.0 → 0.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 +4 -4
- data/lib/decode/definition.rb +69 -0
- data/lib/decode/language/ruby/class.rb +63 -0
- data/lib/decode/language/ruby/constant.rb +45 -0
- data/lib/decode/language/ruby/definition.rb +41 -0
- data/lib/decode/language/ruby/function.rb +37 -0
- data/lib/decode/language/ruby/method.rb +51 -0
- data/lib/decode/language/ruby/module.rb +39 -0
- data/lib/decode/language/ruby/parser.rb +143 -0
- data/lib/decode/language/ruby/reference.rb +76 -0
- data/lib/decode/language/ruby.rb +8 -154
- data/lib/decode/source.rb +1 -1
- data/lib/decode/symbol.rb +0 -22
- data/lib/decode/version.rb +1 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0f1e26c4b0aad982ae69ec4240f058d101c92f15b125f12e17b0a59e7f1a8f2
|
4
|
+
data.tar.gz: 552744c2f9ab8477a01eafd7042f5332325a779d94a29d8a4ec03df387a9174b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe2a85001a162ca96082bd05788d7b57bae41af6aed065c72db26ef2c1d10d0b7c7e76836cf236a640bb7fdba84c66977e387e0fab449536c6915e3ec2413262
|
7
|
+
data.tar.gz: a55480e4354fd41c4bb6e5197180289ab1b29671f65988b67935f001016fd731d083adfbd9edcd079fb2a50894ed2a5ba0b728722c54f66f378609009e20033a
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative 'symbol'
|
22
|
+
|
23
|
+
module Decode
|
24
|
+
class Definition < Symbol
|
25
|
+
def initialize(kind, name, comments, **options)
|
26
|
+
super(kind, name, **options)
|
27
|
+
|
28
|
+
@comments = comments
|
29
|
+
@documentation = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
attr :comments
|
33
|
+
|
34
|
+
# A short form of the definition, e.g. `def short_form`.
|
35
|
+
# @return [String | nil]
|
36
|
+
def short_form
|
37
|
+
end
|
38
|
+
|
39
|
+
# A long form of the definition, e.g. `def initialize(kind, name, comments, **options)`.
|
40
|
+
# @return [String | nil]
|
41
|
+
def long_form
|
42
|
+
end
|
43
|
+
|
44
|
+
# The full text of the definition.
|
45
|
+
# @return [String | nil]
|
46
|
+
def text
|
47
|
+
end
|
48
|
+
|
49
|
+
# Whether this definition can contain nested definitions.
|
50
|
+
# @return [Boolean]
|
51
|
+
def container?
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
# Whether this represents a single entity to be documented (along with it's contents).
|
56
|
+
# @return [Boolean]
|
57
|
+
def nested?
|
58
|
+
container?
|
59
|
+
end
|
60
|
+
|
61
|
+
# An interface for accsssing the documentation of the definition.
|
62
|
+
# @return [Documentation | nil] A `Documentation` if this definition has comments.
|
63
|
+
def documentation
|
64
|
+
if @comments&.any?
|
65
|
+
@documentation ||= Documentation.new(@comments)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative 'definition'
|
22
|
+
|
23
|
+
module Decode
|
24
|
+
module Language
|
25
|
+
module Ruby
|
26
|
+
class Class < Definition
|
27
|
+
def container?
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
def short_form
|
32
|
+
"class #{@name}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def long_form
|
36
|
+
if super_node = @node.children[1]
|
37
|
+
@node.location.keyword.join(
|
38
|
+
super_node.location.name
|
39
|
+
).source
|
40
|
+
else
|
41
|
+
self.short_form
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class Singleton < Definition
|
47
|
+
def container?
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
def nested?
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
def short_form
|
56
|
+
"class << #{@name}"
|
57
|
+
end
|
58
|
+
|
59
|
+
alias long_form short_form
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative 'definition'
|
22
|
+
|
23
|
+
module Decode
|
24
|
+
module Language
|
25
|
+
module Ruby
|
26
|
+
class Constant < Definition
|
27
|
+
def short_form
|
28
|
+
@node.location.name.source
|
29
|
+
end
|
30
|
+
|
31
|
+
def long_form
|
32
|
+
if @node.location.line == @node.location.last_line
|
33
|
+
@node.location.expression.source
|
34
|
+
elsif @node.children[2].type == :array
|
35
|
+
"#{@name} = [...]"
|
36
|
+
elsif @node.children[2].type == :hash
|
37
|
+
"#{@name} = {...}"
|
38
|
+
else
|
39
|
+
self.short_form
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative '../../definition'
|
22
|
+
|
23
|
+
module Decode
|
24
|
+
module Language
|
25
|
+
module Ruby
|
26
|
+
class Definition < Decode::Definition
|
27
|
+
def initialize(kind, name, comments, node, **options)
|
28
|
+
super(kind, name, comments, **options)
|
29
|
+
|
30
|
+
@node = node
|
31
|
+
end
|
32
|
+
|
33
|
+
attr :node
|
34
|
+
|
35
|
+
def text
|
36
|
+
@node.location.expression.source
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative 'method'
|
22
|
+
|
23
|
+
module Decode
|
24
|
+
module Language
|
25
|
+
module Ruby
|
26
|
+
class Function < Method
|
27
|
+
def arguments_node
|
28
|
+
if node = @node.children[2]
|
29
|
+
if node.location.expression
|
30
|
+
return node
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative 'definition'
|
22
|
+
|
23
|
+
module Decode
|
24
|
+
module Language
|
25
|
+
module Ruby
|
26
|
+
class Method < Definition
|
27
|
+
def short_form
|
28
|
+
@node.location.keyword.join(@node.location.name).source
|
29
|
+
end
|
30
|
+
|
31
|
+
def arguments_node
|
32
|
+
if node = @node.children[1]
|
33
|
+
if node.location.expression
|
34
|
+
return node
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def long_form
|
40
|
+
if arguments_node = self.arguments_node
|
41
|
+
@node.location.keyword.join(
|
42
|
+
arguments_node.location.expression
|
43
|
+
).source
|
44
|
+
else
|
45
|
+
self.short_form
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require_relative 'definition'
|
22
|
+
|
23
|
+
module Decode
|
24
|
+
module Language
|
25
|
+
module Ruby
|
26
|
+
class Module < Definition
|
27
|
+
def container?
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
def short_form
|
32
|
+
"module #{@name}"
|
33
|
+
end
|
34
|
+
|
35
|
+
alias long_form short_form
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require 'parser/current'
|
22
|
+
|
23
|
+
require_relative 'class'
|
24
|
+
require_relative 'constant'
|
25
|
+
require_relative 'function'
|
26
|
+
require_relative 'method'
|
27
|
+
require_relative 'module'
|
28
|
+
|
29
|
+
module Decode
|
30
|
+
module Language
|
31
|
+
module Ruby
|
32
|
+
class Parser
|
33
|
+
def initialize(parser = ::Parser::CurrentRuby.new)
|
34
|
+
@parser = parser
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse(input, &block)
|
38
|
+
buffer = ::Parser::Source::Buffer.new('(input)')
|
39
|
+
buffer.source = input.read
|
40
|
+
|
41
|
+
top, comments = @parser.parse_with_comments(buffer)
|
42
|
+
|
43
|
+
walk(top, comments, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def extract_comments_for(node, comments)
|
47
|
+
prefix = []
|
48
|
+
|
49
|
+
while comment = comments.first
|
50
|
+
break if comment.location.line >= node.location.line
|
51
|
+
|
52
|
+
if last_comment = prefix.last
|
53
|
+
if last_comment.location.line != (comment.location.line - 1)
|
54
|
+
prefix.clear
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
prefix << comments.shift
|
59
|
+
end
|
60
|
+
|
61
|
+
# The last comment must butt up against the node:
|
62
|
+
if comment = prefix.last
|
63
|
+
if comment.location.line == (node.location.line - 1)
|
64
|
+
return prefix.map do |comment|
|
65
|
+
comment.text.sub(/\A\#\s?/, '')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Walk over the syntax tree and extract relevant definitions with their associated comments.
|
72
|
+
def walk(node, comments, parent = nil, &block)
|
73
|
+
case node.type
|
74
|
+
when :begin
|
75
|
+
node.children.each do |child|
|
76
|
+
walk(child, comments, parent, &block)
|
77
|
+
end
|
78
|
+
when :module
|
79
|
+
definition = Module.new(
|
80
|
+
:module, node.children[0].children[1],
|
81
|
+
extract_comments_for(node, comments), node,
|
82
|
+
parent: parent, language: Ruby
|
83
|
+
)
|
84
|
+
|
85
|
+
yield definition
|
86
|
+
|
87
|
+
if children = node.children[1]
|
88
|
+
walk(children, comments, definition, &block)
|
89
|
+
end
|
90
|
+
when :class
|
91
|
+
definition = Class.new(
|
92
|
+
:class, node.children[0].children[1],
|
93
|
+
extract_comments_for(node, comments), node,
|
94
|
+
parent: parent, language: Ruby
|
95
|
+
)
|
96
|
+
|
97
|
+
yield definition
|
98
|
+
|
99
|
+
if children = node.children[2]
|
100
|
+
walk(children, comments, definition, &block)
|
101
|
+
end
|
102
|
+
when :sclass
|
103
|
+
definition = Singleton.new(
|
104
|
+
:class, node.children[0],
|
105
|
+
extract_comments_for(node, comments), node,
|
106
|
+
parent: parent, language: Ruby
|
107
|
+
)
|
108
|
+
|
109
|
+
yield definition
|
110
|
+
|
111
|
+
if children = node.children[1]
|
112
|
+
walk(children, comments, definition, &block)
|
113
|
+
end
|
114
|
+
when :def
|
115
|
+
definition = Method.new(
|
116
|
+
:def, node.children[0],
|
117
|
+
extract_comments_for(node, comments), node,
|
118
|
+
parent: parent, language: Ruby
|
119
|
+
)
|
120
|
+
|
121
|
+
yield definition
|
122
|
+
when :defs
|
123
|
+
definition = Function.new(
|
124
|
+
:defs, node.children[1],
|
125
|
+
extract_comments_for(node, comments), node,
|
126
|
+
parent: parent, language: Ruby
|
127
|
+
)
|
128
|
+
|
129
|
+
yield definition
|
130
|
+
when :casgn
|
131
|
+
definition = Constant.new(
|
132
|
+
:constant, node.children[1],
|
133
|
+
extract_comments_for(node, comments), node,
|
134
|
+
parent: parent, language: Ruby
|
135
|
+
)
|
136
|
+
|
137
|
+
yield definition
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
module Decode
|
22
|
+
module Language
|
23
|
+
module Ruby
|
24
|
+
class Reference
|
25
|
+
KIND = {
|
26
|
+
':' => :def,
|
27
|
+
'.' => :defs,
|
28
|
+
}.freeze
|
29
|
+
|
30
|
+
def initialize(value)
|
31
|
+
@value = value
|
32
|
+
|
33
|
+
@path = nil
|
34
|
+
@kind = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def absolute?
|
38
|
+
@value.start_with?('::')
|
39
|
+
end
|
40
|
+
|
41
|
+
METHOD = /\A(?<scope>.*?)?(?<kind>:|\.)(?<name>.+?)\z/
|
42
|
+
|
43
|
+
def path
|
44
|
+
if @path.nil?
|
45
|
+
@path = @value.split(/::/)
|
46
|
+
|
47
|
+
if last = @path.pop
|
48
|
+
if match = last.match(METHOD)
|
49
|
+
@kind = KIND[match[:kind]]
|
50
|
+
|
51
|
+
if scope = match[:scope]
|
52
|
+
@path << scope
|
53
|
+
end
|
54
|
+
|
55
|
+
@path << match[:name]
|
56
|
+
else
|
57
|
+
@path << last
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
@path = @path.map(&:to_sym)
|
62
|
+
@path.freeze
|
63
|
+
end
|
64
|
+
|
65
|
+
return @path
|
66
|
+
end
|
67
|
+
|
68
|
+
def kind
|
69
|
+
self.path
|
70
|
+
|
71
|
+
return @kind
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/decode/language/ruby.rb
CHANGED
@@ -18,13 +18,16 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
require_relative '
|
22
|
-
|
23
|
-
require 'parser/current'
|
21
|
+
require_relative 'ruby/reference'
|
22
|
+
require_relative 'ruby/parser'
|
24
23
|
|
25
24
|
module Decode
|
26
25
|
module Language
|
27
|
-
|
26
|
+
module Ruby
|
27
|
+
def self.parse(input, &block)
|
28
|
+
Parser.new.parse(input, &block)
|
29
|
+
end
|
30
|
+
|
28
31
|
# The symbol which is used to separate the specified definition from the parent scope.
|
29
32
|
PREFIX = {
|
30
33
|
class: '::',
|
@@ -34,58 +37,7 @@ module Decode
|
|
34
37
|
defs: '.',
|
35
38
|
}.freeze
|
36
39
|
|
37
|
-
|
38
|
-
':' => :def,
|
39
|
-
'.' => :defs,
|
40
|
-
}.freeze
|
41
|
-
|
42
|
-
class Reference
|
43
|
-
def initialize(value)
|
44
|
-
@value = value
|
45
|
-
|
46
|
-
@path = nil
|
47
|
-
@kind = nil
|
48
|
-
end
|
49
|
-
|
50
|
-
def absolute?
|
51
|
-
@value.start_with?('::')
|
52
|
-
end
|
53
|
-
|
54
|
-
METHOD = /\A(?<scope>.*?)?(?<kind>:|\.)(?<name>.+?)\z/
|
55
|
-
|
56
|
-
def path
|
57
|
-
if @path.nil?
|
58
|
-
@path = @value.split(/::/)
|
59
|
-
|
60
|
-
if last = @path.pop
|
61
|
-
if match = last.match(METHOD)
|
62
|
-
@kind = KIND[match[:kind]]
|
63
|
-
|
64
|
-
if scope = match[:scope]
|
65
|
-
@path << scope
|
66
|
-
end
|
67
|
-
|
68
|
-
@path << match[:name]
|
69
|
-
else
|
70
|
-
@path << last
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
@path = @path.map(&:to_sym)
|
75
|
-
@path.freeze
|
76
|
-
end
|
77
|
-
|
78
|
-
return @path
|
79
|
-
end
|
80
|
-
|
81
|
-
def kind
|
82
|
-
self.path
|
83
|
-
|
84
|
-
return @kind
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def join(symbols, absolute = true)
|
40
|
+
def self.join(symbols, absolute = true)
|
89
41
|
buffer = String.new
|
90
42
|
|
91
43
|
symbols.each do |symbol|
|
@@ -100,104 +52,6 @@ module Decode
|
|
100
52
|
|
101
53
|
return buffer
|
102
54
|
end
|
103
|
-
|
104
|
-
def parse(input, &block)
|
105
|
-
parser = ::Parser::CurrentRuby.new
|
106
|
-
|
107
|
-
buffer = ::Parser::Source::Buffer.new('(input)')
|
108
|
-
buffer.source = input.read
|
109
|
-
|
110
|
-
top, comments = parser.parse_with_comments(buffer)
|
111
|
-
|
112
|
-
walk(top, comments, &block)
|
113
|
-
end
|
114
|
-
|
115
|
-
def extract_comments_for(node, comments)
|
116
|
-
prefix = []
|
117
|
-
|
118
|
-
while comment = comments.first
|
119
|
-
break if comment.location.line >= node.location.line
|
120
|
-
|
121
|
-
if last_comment = prefix.last
|
122
|
-
if last_comment.location.line != (comment.location.line - 1)
|
123
|
-
prefix.clear
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
prefix << comments.shift
|
128
|
-
end
|
129
|
-
|
130
|
-
# The last comment must butt up against the node:
|
131
|
-
if comment = prefix.last
|
132
|
-
if comment.location.line == (node.location.line - 1)
|
133
|
-
return prefix.map do |comment|
|
134
|
-
comment.text.sub(/\A\#\s?/, '')
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
# Walk over the syntax tree and extract relevant definitions with their associated comments.
|
141
|
-
def walk(node, comments, parent = nil, &block)
|
142
|
-
case node.type
|
143
|
-
when :begin
|
144
|
-
node.children.each do |child|
|
145
|
-
walk(child, comments, parent, &block)
|
146
|
-
end
|
147
|
-
when :class
|
148
|
-
definition = Definition.new(
|
149
|
-
:class, node.children[0].children[1],
|
150
|
-
node, extract_comments_for(node, comments),
|
151
|
-
parent: parent, language: self
|
152
|
-
)
|
153
|
-
|
154
|
-
yield definition
|
155
|
-
|
156
|
-
walk(node.children[2], comments, definition, &block)
|
157
|
-
when :module
|
158
|
-
definition = Definition.new(
|
159
|
-
:module, node.children[0].children[1],
|
160
|
-
node, extract_comments_for(node, comments),
|
161
|
-
parent: parent, language: self
|
162
|
-
)
|
163
|
-
|
164
|
-
yield definition
|
165
|
-
|
166
|
-
walk(node.children[1], comments, definition, &block)
|
167
|
-
when :def
|
168
|
-
definition = Definition.new(
|
169
|
-
:def, node.children[0],
|
170
|
-
node, extract_comments_for(node, comments),
|
171
|
-
parent: parent, language: self
|
172
|
-
)
|
173
|
-
|
174
|
-
yield definition
|
175
|
-
|
176
|
-
# if body = node.children[2]
|
177
|
-
# walk(body, comments, definition, &block)
|
178
|
-
# end
|
179
|
-
when :defs
|
180
|
-
definition = Definition.new(
|
181
|
-
:defs, node.children[1],
|
182
|
-
node, extract_comments_for(node, comments),
|
183
|
-
parent: parent, language: self
|
184
|
-
)
|
185
|
-
|
186
|
-
yield definition
|
187
|
-
|
188
|
-
# if body = node.children[2]
|
189
|
-
# walk(body, comments, definition, &block)
|
190
|
-
# end
|
191
|
-
when :casgn
|
192
|
-
definition = Definition.new(
|
193
|
-
:constant, node.children[1],
|
194
|
-
node, extract_comments_for(node, comments),
|
195
|
-
parent: parent, language: self
|
196
|
-
)
|
197
|
-
|
198
|
-
yield definition
|
199
|
-
end
|
200
|
-
end
|
201
55
|
end
|
202
56
|
end
|
203
57
|
end
|
data/lib/decode/source.rb
CHANGED
data/lib/decode/symbol.rb
CHANGED
@@ -65,26 +65,4 @@ module Decode
|
|
65
65
|
self.path.map(&:name)
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
69
|
-
class Definition < Symbol
|
70
|
-
def initialize(kind, name, node, comments, **options)
|
71
|
-
super(kind, name, **options)
|
72
|
-
|
73
|
-
@node = node
|
74
|
-
@comments = comments
|
75
|
-
@documentation = nil
|
76
|
-
end
|
77
|
-
|
78
|
-
def text
|
79
|
-
@node.location.expression.source
|
80
|
-
end
|
81
|
-
|
82
|
-
attr :comments
|
83
|
-
|
84
|
-
def documentation
|
85
|
-
if @comments&.any?
|
86
|
-
@documentation ||= Documentation.new(@comments)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
68
|
end
|
data/lib/decode/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: decode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -122,10 +122,19 @@ files:
|
|
122
122
|
- decode.gemspec
|
123
123
|
- gems.rb
|
124
124
|
- lib/decode.rb
|
125
|
+
- lib/decode/definition.rb
|
125
126
|
- lib/decode/documentation.rb
|
126
127
|
- lib/decode/index.rb
|
127
128
|
- lib/decode/language.rb
|
128
129
|
- lib/decode/language/ruby.rb
|
130
|
+
- lib/decode/language/ruby/class.rb
|
131
|
+
- lib/decode/language/ruby/constant.rb
|
132
|
+
- lib/decode/language/ruby/definition.rb
|
133
|
+
- lib/decode/language/ruby/function.rb
|
134
|
+
- lib/decode/language/ruby/method.rb
|
135
|
+
- lib/decode/language/ruby/module.rb
|
136
|
+
- lib/decode/language/ruby/parser.rb
|
137
|
+
- lib/decode/language/ruby/reference.rb
|
129
138
|
- lib/decode/source.rb
|
130
139
|
- lib/decode/symbol.rb
|
131
140
|
- lib/decode/trie.rb
|