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