docrb-parser 0.1.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +75 -0
- data/Rakefile +12 -0
- data/docrb-parser.gemspec +38 -0
- data/lib/docrb/core_extensions.rb +60 -0
- data/lib/docrb/parser/attribute.rb +25 -0
- data/lib/docrb/parser/call.rb +27 -0
- data/lib/docrb/parser/class.rb +94 -0
- data/lib/docrb/parser/comment.rb +40 -0
- data/lib/docrb/parser/comment_parser.rb +290 -0
- data/lib/docrb/parser/computations.rb +471 -0
- data/lib/docrb/parser/constant.rb +19 -0
- data/lib/docrb/parser/container.rb +305 -0
- data/lib/docrb/parser/deferred_singleton_class.rb +17 -0
- data/lib/docrb/parser/location.rb +43 -0
- data/lib/docrb/parser/method.rb +62 -0
- data/lib/docrb/parser/method_parameters.rb +85 -0
- data/lib/docrb/parser/module.rb +50 -0
- data/lib/docrb/parser/node_array.rb +24 -0
- data/lib/docrb/parser/reference.rb +25 -0
- data/lib/docrb/parser/reloader.rb +19 -0
- data/lib/docrb/parser/resolved_reference.rb +26 -0
- data/lib/docrb/parser/version.rb +7 -0
- data/lib/docrb/parser/virtual_container.rb +21 -0
- data/lib/docrb/parser/virtual_location.rb +9 -0
- data/lib/docrb/parser/virtual_method.rb +19 -0
- data/lib/docrb/parser.rb +139 -0
- data/lib/docrb-parser.rb +3 -0
- data/sig/docrb/core_extensions.rbs +24 -0
- data/sig/docrb/parser/attribute.rbs +18 -0
- data/sig/docrb/parser/call.rbs +17 -0
- data/sig/docrb/parser/class.rbs +34 -0
- data/sig/docrb/parser/comment.rbs +14 -0
- data/sig/docrb/parser/comment_parser.rbs +79 -0
- data/sig/docrb/parser/constant.rbs +15 -0
- data/sig/docrb/parser/container.rbs +91 -0
- data/sig/docrb/parser/deferred_singleton_class.rbs +12 -0
- data/sig/docrb/parser/location.rbs +24 -0
- data/sig/docrb/parser/method.rbs +34 -0
- data/sig/docrb/parser/method_parameters.rbs +34 -0
- data/sig/docrb/parser/module.rbs +14 -0
- data/sig/docrb/parser/node_array.rbs +12 -0
- data/sig/docrb/parser/reference.rbs +19 -0
- data/sig/docrb/parser/reloader.rbs +7 -0
- data/sig/docrb/parser/resolved_reference.rbs +22 -0
- data/sig/docrb/parser/virtual_method.rbs +17 -0
- data/sig/docrb/parser.rbs +5 -0
- metadata +109 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Docrb
|
4
|
+
class Parser
|
5
|
+
class VirtualMethod
|
6
|
+
VirtualReceiver = Data.define(:type)
|
7
|
+
|
8
|
+
attr_accessor :name, :parameters, :receiver
|
9
|
+
|
10
|
+
def type = :def_node
|
11
|
+
|
12
|
+
def initialize(name, receiver, parameters = nil)
|
13
|
+
@name = name
|
14
|
+
@receiver = VirtualReceiver.new(type: receiver)
|
15
|
+
@parameters = parameters
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/docrb/parser.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "prism"
|
4
|
+
|
5
|
+
require_relative "parser/reloader"
|
6
|
+
|
7
|
+
require_relative "parser/version"
|
8
|
+
require_relative "core_extensions"
|
9
|
+
require_relative "parser/node_array"
|
10
|
+
|
11
|
+
require_relative "parser/method"
|
12
|
+
require_relative "parser/location"
|
13
|
+
require_relative "parser/method_parameters"
|
14
|
+
require_relative "parser/container"
|
15
|
+
require_relative "parser/class"
|
16
|
+
require_relative "parser/deferred_singleton_class"
|
17
|
+
require_relative "parser/module"
|
18
|
+
require_relative "parser/reference"
|
19
|
+
require_relative "parser/call"
|
20
|
+
require_relative "parser/attribute"
|
21
|
+
require_relative "parser/constant"
|
22
|
+
require_relative "parser/comment"
|
23
|
+
|
24
|
+
require_relative "parser/virtual_method"
|
25
|
+
require_relative "parser/virtual_location"
|
26
|
+
require_relative "parser/virtual_container"
|
27
|
+
|
28
|
+
require_relative "parser/resolved_reference"
|
29
|
+
require_relative "parser/computations"
|
30
|
+
require_relative "parser/comment_parser"
|
31
|
+
|
32
|
+
module Docrb
|
33
|
+
class Parser
|
34
|
+
attr_reader :current_file, :locations, :references, :nodes
|
35
|
+
attr_accessor :debug, :ast_lines
|
36
|
+
|
37
|
+
def initialize
|
38
|
+
@current_ast = nil
|
39
|
+
@current_file = nil
|
40
|
+
@locations = []
|
41
|
+
@references = []
|
42
|
+
@ast_lines = {}
|
43
|
+
@object_by_id = {}
|
44
|
+
@current_object_id = 1
|
45
|
+
@nodes = NodeArray.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def lines_for(file, ast)
|
49
|
+
return ast_lines[file] if ast_lines.key? file
|
50
|
+
|
51
|
+
ast.source.source.split("\n").tap { ast_lines[file] = _1 }
|
52
|
+
end
|
53
|
+
|
54
|
+
def all_objects = @object_by_id.values
|
55
|
+
def all_classes = all_objects.filter { _1.is_a? Class }
|
56
|
+
def all_modules = all_objects.filter { _1.is_a? Module }
|
57
|
+
def all_methods = all_objects.filter { _1.is_a? Method }
|
58
|
+
|
59
|
+
def finalize = Computations.new(self).tap(&:run)
|
60
|
+
|
61
|
+
docrb_inspect_attrs(:current_file, :locations, :references, :nodes)
|
62
|
+
|
63
|
+
def parse(file)
|
64
|
+
tap do
|
65
|
+
@current_file = file
|
66
|
+
@current_ast = Prism.parse_file(file)
|
67
|
+
@nodes.append(*@current_ast.value.statements.body.map { handle_node(_1) }.reject { _1.is_a? Call })
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def make_id(obj)
|
72
|
+
@current_object_id.tap do |id|
|
73
|
+
@object_by_id[id] = obj
|
74
|
+
@current_object_id += 1
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def object_by_id(id) = @object_by_id[id]
|
79
|
+
|
80
|
+
def handle_node(node, parent = nil)
|
81
|
+
case node.type
|
82
|
+
when :def_node then Method.new(self, parent, node)
|
83
|
+
when :class_node then Class.new(self, parent, node)
|
84
|
+
when :module_node then Module.new(self, parent, node)
|
85
|
+
when :singleton_class_node then handle_singleton_class(parent, node)
|
86
|
+
when :call_node then Call.new(self, parent, node)
|
87
|
+
when :constant_write_node then Constant.new(self, parent, node)
|
88
|
+
else unhandled_node!(node)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def unhandled_node!(node)
|
93
|
+
return unless debug
|
94
|
+
|
95
|
+
bs = caller_locations[1...].join("\n")
|
96
|
+
type = node.try(:type) || node.class.name
|
97
|
+
warn "Warning: Unhandled node type #{type}\n#{bs}\n#{node}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def location(loc)
|
101
|
+
return loc if loc.is_a? Location
|
102
|
+
|
103
|
+
Location.new(self, @current_ast, loc).tap { @locations << _1 }
|
104
|
+
end
|
105
|
+
|
106
|
+
def reference(parent, path)
|
107
|
+
raise ArgumentError, "Empty path" if path.nil? || path.empty?
|
108
|
+
|
109
|
+
Reference.new(self, parent, path).tap { @references << _1 }
|
110
|
+
end
|
111
|
+
|
112
|
+
def attach_sources!
|
113
|
+
@locations.each(&:load_source!)
|
114
|
+
end
|
115
|
+
|
116
|
+
def unfurl_constant_path(node)
|
117
|
+
return [] unless node
|
118
|
+
return [node.name] if node.type == :constant_read_node
|
119
|
+
|
120
|
+
[].tap do |segments|
|
121
|
+
while node&.type == :constant_path_node
|
122
|
+
segments << node.child.name
|
123
|
+
node = node.parent
|
124
|
+
end
|
125
|
+
segments << (node&.name || :root!)
|
126
|
+
segments.reverse!
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def handle_singleton_class(parent, node)
|
131
|
+
case node.expression.type
|
132
|
+
when :self_node
|
133
|
+
Class.new(self, parent, node).tap(&:singleton!)
|
134
|
+
else
|
135
|
+
DeferredSingletonClass.new(self, parent, node)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/lib/docrb-parser.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class Object
|
2
|
+
self.@__inspect_installed__: bool
|
3
|
+
|
4
|
+
def own_methods: -> Array[Symbol]
|
5
|
+
def object_id_hex: -> String
|
6
|
+
|
7
|
+
def self.docrb_inspect: { (void) -> String } -> String
|
8
|
+
def self.docrb_inspect_attrs: (*Symbol attrs) -> void
|
9
|
+
def self.visible_attr_reader: (*Symbol args) -> void
|
10
|
+
def self.visible_attr_Accessor: (*Symbol args) -> void
|
11
|
+
|
12
|
+
def try: (String | Symbol method, *untyped args, **untyped kwargs) ?{ (untyped) -> untyped } -> untyped
|
13
|
+
def attr_list: (*String names) -> String
|
14
|
+
end
|
15
|
+
|
16
|
+
class Array[unchecked out Elem] < Object
|
17
|
+
def first!: () -> Elem
|
18
|
+
|
19
|
+
alias old_first first
|
20
|
+
end
|
21
|
+
|
22
|
+
module Kernel
|
23
|
+
def then!: () { (self) -> untyped } -> (nil | untyped)
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class Attribute
|
4
|
+
type kind = :writer | :reader | :accessor
|
5
|
+
|
6
|
+
attr_reader name: Symbol
|
7
|
+
attr_reader location: Location
|
8
|
+
attr_accessor writer_visibility: Container::visibility
|
9
|
+
attr_accessor reader_visibility: Container::visibility
|
10
|
+
attr_accessor type: kind
|
11
|
+
attr_accessor parent: Container
|
12
|
+
|
13
|
+
def initialize: (Parser parser, Container parent, untyped node, Symbol name, kind `type`) -> void
|
14
|
+
|
15
|
+
def id: () -> Integer
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Docrb
|
3
|
+
class Parser
|
4
|
+
class Call
|
5
|
+
attr_reader name: String
|
6
|
+
attr_reader arguments: Array[untyped]
|
7
|
+
attr_reader parent: Container
|
8
|
+
attr_reader location: Location
|
9
|
+
|
10
|
+
@object_id: Integer
|
11
|
+
|
12
|
+
def initialize: (Parser parser, Container parent, untyped node) -> void
|
13
|
+
|
14
|
+
def id: () -> Integer
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Docrb
|
3
|
+
class Parser
|
4
|
+
class Class < Container
|
5
|
+
attr_accessor node: untyped
|
6
|
+
attr_accessor inherits: Reference?
|
7
|
+
attr_accessor singleton: bool
|
8
|
+
|
9
|
+
def kind: () -> :class
|
10
|
+
|
11
|
+
def initialize: (Parser parser, Container? parent, untyped node) -> void
|
12
|
+
|
13
|
+
def unowned_classes: () -> NodeArray[Class]
|
14
|
+
|
15
|
+
def unowned_modules: () -> NodeArray[Module]
|
16
|
+
|
17
|
+
def unowned_instance_methods: () -> NodeArray[Method]
|
18
|
+
|
19
|
+
def unowned_class_methods: () -> NodeArray[Method]
|
20
|
+
|
21
|
+
def unowned_class_attributes: () -> NodeArray[Attribute]
|
22
|
+
|
23
|
+
def unowned_instance_attributes: () -> NodeArray[Attribute]
|
24
|
+
|
25
|
+
def singleton!: () -> self
|
26
|
+
|
27
|
+
def singleton?: () -> bool
|
28
|
+
|
29
|
+
def handle_parsed_node: (Parser parser, untyped node) -> void
|
30
|
+
|
31
|
+
def merge_singleton_class: (Class other) -> void
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class Comment
|
4
|
+
@location: Location
|
5
|
+
@file_path: String
|
6
|
+
@parser: Parser
|
7
|
+
@comments: Array[String]?
|
8
|
+
|
9
|
+
def initialize: (Parser parser, Location location, String file_path) -> void
|
10
|
+
|
11
|
+
def locate: () -> void
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class CommentParser
|
4
|
+
type untyped_hash = Hash[untyped, untyped]
|
5
|
+
type replacement_object = { start_idx: Integer, end_idx: Integer, object: untyped_hash }
|
6
|
+
|
7
|
+
NEWLINE: "\n"
|
8
|
+
POUND: "#"
|
9
|
+
SPACE: ""
|
10
|
+
DASH: "-"
|
11
|
+
COLON: ":"
|
12
|
+
|
13
|
+
@data: Array[String]
|
14
|
+
|
15
|
+
@data_len: Integer
|
16
|
+
|
17
|
+
attr_accessor objects: Array[untyped_hash] | Array[String]
|
18
|
+
attr_accessor current_object: Array[String]
|
19
|
+
attr_accessor cursor: Integer
|
20
|
+
attr_accessor visibility: String?
|
21
|
+
|
22
|
+
def self.parse: (String data) -> untyped_hash
|
23
|
+
|
24
|
+
def initialize: (String data) -> void
|
25
|
+
|
26
|
+
def at_end?: () -> bool
|
27
|
+
def will_end?: () -> bool
|
28
|
+
def at_start?: () -> bool
|
29
|
+
def peek: () -> String?
|
30
|
+
def peek_next: () -> String?
|
31
|
+
def peek_prev: () -> String?
|
32
|
+
def advance: () -> String?
|
33
|
+
def match?: (*String args) -> bool
|
34
|
+
def consume_spaces: () -> nil
|
35
|
+
def extract_while: () { () -> bool } -> void
|
36
|
+
def extract_until: () { () -> bool } -> void
|
37
|
+
|
38
|
+
def parse: () -> true
|
39
|
+
|
40
|
+
def flush_current_object: () -> void
|
41
|
+
|
42
|
+
def parse_one: () -> void
|
43
|
+
|
44
|
+
FIELD_LIST_HEADING: ::Regexp
|
45
|
+
|
46
|
+
def detect_field_list: () -> void
|
47
|
+
|
48
|
+
def process_field_list: (String obj, Integer at) -> void
|
49
|
+
|
50
|
+
def process_text_blocks: () -> void
|
51
|
+
|
52
|
+
def span: (String text) -> { type: :span, value: String }
|
53
|
+
|
54
|
+
def process_text_block: (String text) -> void
|
55
|
+
|
56
|
+
COMMENT_METHOD_REF_REGEXP: ::Regexp
|
57
|
+
|
58
|
+
def extract_method_reference: (String text) ->replacement_object?
|
59
|
+
|
60
|
+
COMMENT_SYMBOL_REGEXP: ::Regexp
|
61
|
+
|
62
|
+
def extract_symbol: (untyped text) -> replacement_object?
|
63
|
+
|
64
|
+
CAMELCASE_IDENTIFIER_REGEXP: ::Regexp
|
65
|
+
|
66
|
+
def extract_camelcase_identifier: (untyped text) -> replacement_object?
|
67
|
+
|
68
|
+
VISIBILITY_INDICATOR_REGEXP: ::Regexp
|
69
|
+
|
70
|
+
def process_visibility: (?untyped? obj) -> void
|
71
|
+
|
72
|
+
def process_code_examples: () -> void
|
73
|
+
|
74
|
+
def join_code_example_lines: (Integer start_at, Integer end_at) -> void
|
75
|
+
|
76
|
+
def normalize_tree: () -> void
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class Constant
|
4
|
+
attr_reader name: String
|
5
|
+
attr_reader location: Location
|
6
|
+
attr_accessor parent: untyped
|
7
|
+
|
8
|
+
@object_id: Integer
|
9
|
+
|
10
|
+
def initialize: (Parser parser, Container parent, untyped node) -> void
|
11
|
+
|
12
|
+
def id: () -> Integer
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class Container
|
4
|
+
type visibility = :public | :protected | :private | :module_function
|
5
|
+
|
6
|
+
attr_accessor parent: Container?
|
7
|
+
attr_accessor parser: Parser
|
8
|
+
attr_accessor classes: NodeArray[Class]
|
9
|
+
attr_accessor modules: NodeArray[Module]
|
10
|
+
attr_accessor instance_methods: NodeArray[Method]
|
11
|
+
attr_accessor class_methods: NodeArray[Method]
|
12
|
+
attr_accessor extends: NodeArray[Reference]
|
13
|
+
attr_accessor includes: NodeArray[Reference]
|
14
|
+
attr_accessor name: String | Symbol
|
15
|
+
attr_accessor path_segments: Array[Symbol]?
|
16
|
+
attr_accessor instance_attributes: Array[Attribute]
|
17
|
+
attr_accessor class_attributes: Array[Attribute]
|
18
|
+
attr_accessor current_visibility_modifier: visibility
|
19
|
+
attr_accessor constants: NodeArray[Constant]
|
20
|
+
attr_accessor location: Location
|
21
|
+
|
22
|
+
@object_id: Integer
|
23
|
+
@node: untyped
|
24
|
+
@explicit_instance_visibility: Hash[Symbol, visibility]
|
25
|
+
@explicit_class_visibility: Hash[Symbol, visibility]
|
26
|
+
@defined_by: Array[Location]
|
27
|
+
@inside_module_function: bool
|
28
|
+
@default_constructor_visibility: visibility?
|
29
|
+
|
30
|
+
SINGLETON_CLASS_TYPES: ::Array[:singleton_class_node | :deferred_singleton_class_node]
|
31
|
+
|
32
|
+
def initialize: (Parser parser, Container? parent, untyped node) -> void
|
33
|
+
|
34
|
+
def extract_references: (NodeArray[untyped] from, Symbol attr) -> NodeArray[untyped]
|
35
|
+
|
36
|
+
def unowned_classes: () -> NodeArray[Class]
|
37
|
+
|
38
|
+
def all_classes: () -> NodeArray[Class]
|
39
|
+
|
40
|
+
def unowned_modules: () -> NodeArray[Module]
|
41
|
+
|
42
|
+
def all_modules: () -> NodeArray[Module]
|
43
|
+
|
44
|
+
def unowned_instance_methods: () -> NodeArray[Method]
|
45
|
+
|
46
|
+
def all_instance_methods: () -> NodeArray[Method]
|
47
|
+
|
48
|
+
def unowned_class_methods: () -> NodeArray[Method]
|
49
|
+
|
50
|
+
def all_class_methods: () -> NodeArray[Method]
|
51
|
+
|
52
|
+
def unowned_class_attributes: () -> NodeArray[Attribute]
|
53
|
+
|
54
|
+
def all_class_attributes: () -> NodeArray[Attribute]
|
55
|
+
|
56
|
+
def unowned_instance_attributes: () -> NodeArray[Attribute]
|
57
|
+
|
58
|
+
def all_instance_attributes: () -> NodeArray[Attribute]
|
59
|
+
|
60
|
+
def id: () -> Integer
|
61
|
+
|
62
|
+
def handle_parsed_node: (Parser parser, untyped node) -> nil
|
63
|
+
|
64
|
+
def instance_method_added: (Parser parser, untyped node, Method method) -> nil
|
65
|
+
|
66
|
+
def class_method_added: (Parser parser, untyped node, Method method) -> nil
|
67
|
+
|
68
|
+
def class_added: (Parser parser, untyped node, Method method) -> nil
|
69
|
+
|
70
|
+
def module_added: (Parser parser, untyped node, Method method) -> nil
|
71
|
+
|
72
|
+
def handle_call: (Call call) -> untyped
|
73
|
+
|
74
|
+
def handle_node: (untyped node) -> untyped
|
75
|
+
|
76
|
+
def parse_node: (untyped node) -> untyped
|
77
|
+
|
78
|
+
def reference: (Symbol | Array[Symbol] path) -> Reference
|
79
|
+
|
80
|
+
def add_attribute: (Parser parser, untyped node, Attribute::kind `type`) -> void
|
81
|
+
|
82
|
+
def adjust_split_attributes!: (Symbol scope) -> void
|
83
|
+
|
84
|
+
def handle_visibility_modifier: (Parser _parser, untyped node) -> void
|
85
|
+
|
86
|
+
def handle_singleton_visibility_modifier: (Parser _parser, untyped node) -> void
|
87
|
+
|
88
|
+
def update_constructor_visibility!: () -> void
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Docrb
|
3
|
+
class Parser
|
4
|
+
class DeferredSingletonClass < Class
|
5
|
+
attr_reader target: Array[Symbol]
|
6
|
+
|
7
|
+
def kind: () -> :deferred_singleton_class
|
8
|
+
|
9
|
+
def initialize: (Parser parser, Container? parent, untyped node) -> void
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class Location
|
4
|
+
|
5
|
+
|
6
|
+
@virtual: untyped
|
7
|
+
|
8
|
+
attr_reader line_start: Integer?
|
9
|
+
attr_reader line_end: Integer?
|
10
|
+
attr_reader source: String?
|
11
|
+
attr_reader offset_start: Integer?
|
12
|
+
attr_reader offset_end: Integer?
|
13
|
+
attr_reader parser: Parser
|
14
|
+
attr_reader file_path: String?
|
15
|
+
attr_reader ast: untyped
|
16
|
+
|
17
|
+
def virtual?: -> bool
|
18
|
+
|
19
|
+
def initialize: (Parser parser, untyped ast, untyped loc) -> void
|
20
|
+
|
21
|
+
def load_source!: () -> void
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class Method
|
4
|
+
type method_type = :instance | :class
|
5
|
+
|
6
|
+
attr_accessor name: Symbol
|
7
|
+
attr_accessor parameters: MethodParameters
|
8
|
+
attr_accessor visibility: Container::visibility
|
9
|
+
attr_accessor overriding: Integer?
|
10
|
+
attr_accessor overridden_by: ::Array[Integer]
|
11
|
+
attr_accessor type: method_type
|
12
|
+
attr_accessor external_receiver: Reference?
|
13
|
+
attr_accessor location: Location
|
14
|
+
attr_accessor parent: Container?
|
15
|
+
attr_accessor node: untyped
|
16
|
+
|
17
|
+
@object_id: Integer
|
18
|
+
|
19
|
+
def kind: () -> :method
|
20
|
+
|
21
|
+
def initialize: (Parser parser, Container? parent, untyped node) -> void
|
22
|
+
|
23
|
+
def id: () -> Integer
|
24
|
+
|
25
|
+
def class?: () -> bool
|
26
|
+
|
27
|
+
def instance?: () -> bool
|
28
|
+
|
29
|
+
def module_function?: () -> bool
|
30
|
+
|
31
|
+
def external?: () -> bool
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class MethodParameters < Array[Parameter]
|
4
|
+
def initialize: (Parser parser, Method parent, untyped node) -> void
|
5
|
+
|
6
|
+
def id: () -> Integer
|
7
|
+
|
8
|
+
class Parameter
|
9
|
+
attr_reader parser: Parser
|
10
|
+
type kind = :arg | :kw | :optarg | :optkw | :rest | :kwrest | :block
|
11
|
+
|
12
|
+
def initialize: (Parser parser, kind kind, Symbol name, ?untyped? value) -> void
|
13
|
+
|
14
|
+
def id: () -> Integer
|
15
|
+
|
16
|
+
def has_value?: () -> bool
|
17
|
+
|
18
|
+
def optional?: () -> bool
|
19
|
+
|
20
|
+
def positional?: () -> bool
|
21
|
+
|
22
|
+
def keyword?: () -> bool
|
23
|
+
|
24
|
+
def block?: () -> bool
|
25
|
+
|
26
|
+
def rest?: () -> bool
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def name_by_type: () -> Symbol
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Docrb
|
3
|
+
class Parser
|
4
|
+
class Module < Container
|
5
|
+
def kind: () -> :module
|
6
|
+
|
7
|
+
def initialize: (Parser parser, Container? parent, untyped node) -> void
|
8
|
+
|
9
|
+
def instance_method_added: (Parser parser, untyped node, Method method) -> void
|
10
|
+
|
11
|
+
def handle_parsed_node: (Parser parser, untyped node) -> void
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Docrb
|
3
|
+
class Parser
|
4
|
+
class NodeArray[unchecked out Elem] < Array[Elem]
|
5
|
+
def by_kind: (Symbol kind) -> ::Array[Elem]
|
6
|
+
|
7
|
+
def named: (Symbol name) -> ::Array[Elem]
|
8
|
+
|
9
|
+
def named!: (Symbol name) -> Elem
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class Reference
|
4
|
+
attr_accessor parent: untyped
|
5
|
+
attr_accessor path: Array[Symbol]
|
6
|
+
attr_accessor resolved: ResolvedReference
|
7
|
+
|
8
|
+
@parser: Parser
|
9
|
+
|
10
|
+
def initialize: (Parser parser, untyped parent, Array[Symbol] path) -> void
|
11
|
+
|
12
|
+
def resolved?: () -> bool
|
13
|
+
|
14
|
+
def fulfilled?: () -> bool
|
15
|
+
|
16
|
+
def dereference!: () -> untyped
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class ResolvedReference
|
4
|
+
type reference_status = :valid | :broken
|
5
|
+
|
6
|
+
attr_accessor status: reference_status
|
7
|
+
|
8
|
+
@parser: Parser
|
9
|
+
@object_id: Integer
|
10
|
+
|
11
|
+
def initialize: (Parser parser, reference_status status, Integer id) -> void
|
12
|
+
|
13
|
+
def id: () -> Integer
|
14
|
+
|
15
|
+
def broken?: () -> bool
|
16
|
+
|
17
|
+
def valid?: () -> bool
|
18
|
+
|
19
|
+
def dereference!: () -> untyped
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Docrb
|
2
|
+
class Parser
|
3
|
+
class VirtualMethod
|
4
|
+
VirtualReceiver: untyped
|
5
|
+
|
6
|
+
attr_accessor name: Symbol | String
|
7
|
+
|
8
|
+
attr_accessor parameters: ::Array[untyped]
|
9
|
+
|
10
|
+
attr_accessor receiver: untyped
|
11
|
+
|
12
|
+
def type: () -> :def_node
|
13
|
+
|
14
|
+
def initialize: (Symbol | String name, untyped receiver, ?::Array[untyped]? parameters) -> void
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|