ruby_mod_kit 0.0.2 → 0.0.3
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/ruby_mod_kit/core_ext/eval.rb +6 -0
- data/lib/ruby_mod_kit/core_ext/load.rb +12 -4
- data/lib/ruby_mod_kit/core_ext.rb +2 -2
- data/lib/ruby_mod_kit/corrector.rb +22 -0
- data/lib/ruby_mod_kit/corrector_manager.rb +68 -0
- data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +42 -0
- data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +49 -0
- data/lib/ruby_mod_kit/feature/instance_variable_parameter.rb +27 -0
- data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +80 -0
- data/lib/ruby_mod_kit/feature/overload.rb +19 -0
- data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +49 -0
- data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +90 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +41 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +31 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +43 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +38 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +32 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +29 -0
- data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +45 -0
- data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +67 -0
- data/lib/ruby_mod_kit/feature/type.rb +31 -0
- data/lib/ruby_mod_kit/feature.rb +24 -0
- data/lib/ruby_mod_kit/generation.rb +60 -22
- data/lib/ruby_mod_kit/memo/def_parent_memo.rb +36 -0
- data/lib/ruby_mod_kit/memo/{ivar.rb → ivar_memo.rb} +17 -3
- data/lib/ruby_mod_kit/memo/{method.rb → method_memo.rb} +7 -7
- data/lib/ruby_mod_kit/memo/offset_memo.rb +1 -1
- data/lib/ruby_mod_kit/memo/overload_memo.rb +46 -0
- data/lib/ruby_mod_kit/memo/{parameter.rb → parameter_memo.rb} +3 -3
- data/lib/ruby_mod_kit/memo.rb +7 -64
- data/lib/ruby_mod_kit/memo_pad.rb +69 -0
- data/lib/ruby_mod_kit/mission.rb +5 -24
- data/lib/ruby_mod_kit/node/base_node.rb +137 -0
- data/lib/ruby_mod_kit/node/call_node.rb +10 -6
- data/lib/ruby_mod_kit/node/def_node.rb +10 -6
- data/lib/ruby_mod_kit/node/def_parent_node.rb +17 -13
- data/lib/ruby_mod_kit/node/parameter_node.rb +12 -8
- data/lib/ruby_mod_kit/node/program_node.rb +2 -2
- data/lib/ruby_mod_kit/node/statements_node.rb +10 -6
- data/lib/ruby_mod_kit/node/symbol_node.rb +10 -6
- data/lib/ruby_mod_kit/node/untyped_node.rb +10 -6
- data/lib/ruby_mod_kit/node/wrap.rb +43 -0
- data/lib/ruby_mod_kit/node.rb +4 -148
- data/lib/ruby_mod_kit/version.rb +1 -1
- data/lib/ruby_mod_kit.rb +17 -3
- data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +3 -0
- data/sig/generated/ruby_mod_kit/core_ext/load.rbs +7 -4
- data/sig/generated/ruby_mod_kit/corrector.rbs +16 -0
- data/sig/generated/ruby_mod_kit/corrector_manager.rbs +26 -0
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +20 -0
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +21 -0
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter.rbs +14 -0
- data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +24 -0
- data/sig/generated/ruby_mod_kit/feature/overload.rbs +11 -0
- data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +20 -0
- data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +39 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +19 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +19 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +19 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +19 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +19 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline.rbs +13 -0
- data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +20 -0
- data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +20 -0
- data/sig/generated/ruby_mod_kit/feature/type.rbs +14 -0
- data/sig/generated/ruby_mod_kit/feature.rbs +16 -0
- data/sig/generated/ruby_mod_kit/generation.rbs +25 -10
- data/sig/generated/ruby_mod_kit/memo/def_parent_memo.rbs +24 -0
- data/sig/generated/ruby_mod_kit/memo/{ivar.rbs → ivar_memo.rbs} +15 -3
- data/sig/generated/ruby_mod_kit/memo/{method.rbs → method_memo.rbs} +8 -8
- data/sig/generated/ruby_mod_kit/memo/offset_memo.rbs +1 -1
- data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +32 -0
- data/sig/generated/ruby_mod_kit/memo/{parameter.rbs → parameter_memo.rbs} +3 -3
- data/sig/generated/ruby_mod_kit/memo.rbs +2 -36
- data/sig/generated/ruby_mod_kit/memo_pad.rbs +46 -0
- data/sig/generated/ruby_mod_kit/mission.rbs +4 -12
- data/sig/generated/ruby_mod_kit/node/base_node.rbs +65 -0
- data/sig/generated/ruby_mod_kit/node/call_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/def_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +12 -10
- data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +13 -8
- data/sig/generated/ruby_mod_kit/node/program_node.rbs +2 -2
- data/sig/generated/ruby_mod_kit/node/statements_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/untyped_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/wrap.rbs +12 -0
- data/sig/generated/ruby_mod_kit/node.rbs +2 -58
- data/sig/generated/ruby_mod_kit.rbs +4 -0
- metadata +56 -27
- data/lib/ruby_mod_kit/memo/def_parent.rb +0 -27
- data/lib/ruby_mod_kit/mission/fix_parse_error.rb +0 -216
- data/lib/ruby_mod_kit/mission/ivar_arg.rb +0 -42
- data/lib/ruby_mod_kit/mission/overload.rb +0 -73
- data/lib/ruby_mod_kit/mission/type_attr.rb +0 -75
- data/lib/ruby_mod_kit/mission/type_parameter.rb +0 -39
- data/lib/ruby_mod_kit/mission/type_return.rb +0 -33
- data/lib/ruby_mod_kit/transpiler.rb +0 -20
- data/sig/generated/examples/user.rbs +0 -60
- data/sig/generated/ruby_mod_kit/memo/def_parent.rbs +0 -20
- data/sig/generated/ruby_mod_kit/memo/located.rbs +0 -14
- data/sig/generated/ruby_mod_kit/memo/parameter_type.rbs +0 -14
- data/sig/generated/ruby_mod_kit/mission/fix_parse_error.rbs +0 -73
- data/sig/generated/ruby_mod_kit/mission/ivar_arg.rbs +0 -19
- data/sig/generated/ruby_mod_kit/mission/overload.rbs +0 -20
- data/sig/generated/ruby_mod_kit/mission/type_attr.rbs +0 -18
- data/sig/generated/ruby_mod_kit/mission/type_parameter.rbs +0 -18
- data/sig/generated/ruby_mod_kit/mission/type_return.rbs +0 -18
- data/sig/generated/ruby_mod_kit/transpiler.rbs +0 -11
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
class Feature
|
|
7
|
+
class Type
|
|
8
|
+
class RbsInline
|
|
9
|
+
# The mission for parameter types
|
|
10
|
+
class TypeParameterMission < Mission
|
|
11
|
+
# @rbs generation: Generation
|
|
12
|
+
# @rbs root_node: Node::ProgramNode
|
|
13
|
+
# @rbs parse_result: Prism::ParseResult
|
|
14
|
+
# @rbs memo_pad: MemoPad
|
|
15
|
+
# @rbs return: bool
|
|
16
|
+
def perform(generation, root_node, parse_result, memo_pad)
|
|
17
|
+
memo_pad.parameters_memo.each do |offset, parameter_memo|
|
|
18
|
+
next if parameter_memo.untyped?
|
|
19
|
+
|
|
20
|
+
def_node = root_node.def_node_at(offset)
|
|
21
|
+
raise RubyModKit::Error, "DefNode not found" if !def_node || !def_node.is_a?(Node::DefNode)
|
|
22
|
+
|
|
23
|
+
parameter_node = root_node.parameter_node_at(offset)
|
|
24
|
+
raise RubyModKit::Error, "ParameterNode not found" unless parameter_node
|
|
25
|
+
|
|
26
|
+
type = parameter_memo.type
|
|
27
|
+
src_offset = parse_result.source.offsets[def_node.location.start_line - 1]
|
|
28
|
+
indent = def_node.offset - src_offset
|
|
29
|
+
qualified_name = "#{parameter_memo.qualifier}#{parameter_node.name}"
|
|
30
|
+
generation[src_offset, 0] = "#{" " * indent}# @rbs #{qualified_name}: #{type}\n"
|
|
31
|
+
end
|
|
32
|
+
true
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
class Feature
|
|
7
|
+
class Type
|
|
8
|
+
class RbsInline
|
|
9
|
+
# The mission for parameter types
|
|
10
|
+
class TypeReturnMission < Mission
|
|
11
|
+
# @rbs generation: Generation
|
|
12
|
+
# @rbs root_node: Node::ProgramNode
|
|
13
|
+
# @rbs parse_result: Prism::ParseResult
|
|
14
|
+
# @rbs memo_pad: MemoPad
|
|
15
|
+
# @rbs return: bool
|
|
16
|
+
def perform(generation, root_node, parse_result, memo_pad)
|
|
17
|
+
memo_pad.methods_memo.each do |offset, method_memo|
|
|
18
|
+
def_node = root_node.def_node_at(offset)
|
|
19
|
+
raise RubyModKit::Error, "DefNode not found" if !def_node || !def_node.is_a?(Node::DefNode)
|
|
20
|
+
next if method_memo.untyped?
|
|
21
|
+
|
|
22
|
+
src_offset = parse_result.source.offsets[def_node.location.start_line - 1]
|
|
23
|
+
indent = offset - src_offset
|
|
24
|
+
generation[src_offset, 0] = "#{" " * indent}# @rbs return: #{method_memo.type}\n"
|
|
25
|
+
end
|
|
26
|
+
true
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
class Feature
|
|
7
|
+
class Type
|
|
8
|
+
# namespace for type with rbs-line feature
|
|
9
|
+
class RbsInline < Feature
|
|
10
|
+
# @rbs return: Array[Mission]
|
|
11
|
+
def create_missions
|
|
12
|
+
[
|
|
13
|
+
TypeInstanceVariableMission.new,
|
|
14
|
+
TypeAttrMission.new,
|
|
15
|
+
TypeOverloadMission.new,
|
|
16
|
+
TypeParameterMission.new,
|
|
17
|
+
TypeReturnMission.new,
|
|
18
|
+
]
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
require_relative "rbs_inline/type_attr_mission"
|
|
26
|
+
require_relative "rbs_inline/type_instance_variable_mission"
|
|
27
|
+
require_relative "rbs_inline/type_overload_mission"
|
|
28
|
+
require_relative "rbs_inline/type_parameter_mission"
|
|
29
|
+
require_relative "rbs_inline/type_return_mission"
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
class Feature
|
|
7
|
+
class Type
|
|
8
|
+
# the class to correct `def foo: Some ...` -> `def foo ...`
|
|
9
|
+
class ReturnValueColonCorrector < Corrector
|
|
10
|
+
# @rbs return: Array[Symbol]
|
|
11
|
+
def correctable_error_types
|
|
12
|
+
%i[unexpected_token_ignore]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @rbs parse_error: Prism::ParseError
|
|
16
|
+
# @rbs generation: Generation
|
|
17
|
+
# @rbs root_node: Node::ProgramNode
|
|
18
|
+
# @rbs memo_pad: MemoPad
|
|
19
|
+
# @rbs return: void
|
|
20
|
+
def correct(parse_error, generation, root_node, memo_pad)
|
|
21
|
+
return if parse_error.location.slice != ":"
|
|
22
|
+
|
|
23
|
+
def_node = root_node.statements_node_at(parse_error.location.start_offset)&.parent
|
|
24
|
+
return unless def_node.is_a?(Node::DefNode)
|
|
25
|
+
|
|
26
|
+
lparen_loc = def_node.lparen_loc
|
|
27
|
+
rparen_loc = def_node.rparen_loc
|
|
28
|
+
if !lparen_loc && !rparen_loc
|
|
29
|
+
src_offset = def_node.name_loc.end_offset
|
|
30
|
+
elsif lparen_loc && rparen_loc && lparen_loc.slice == "(" && rparen_loc.slice == ")"
|
|
31
|
+
src_offset = rparen_loc.end_offset
|
|
32
|
+
else
|
|
33
|
+
return
|
|
34
|
+
end
|
|
35
|
+
return if generation[src_offset...parse_error.location.start_offset] !~ /\A\s*\z/
|
|
36
|
+
|
|
37
|
+
right_node = root_node.node_at(parse_error.location.end_offset + 1)
|
|
38
|
+
return_type_location = right_node&.location || return_type_location
|
|
39
|
+
generation[src_offset, return_type_location.end_offset - src_offset] = ""
|
|
40
|
+
memo_pad.method_memo(def_node).type = return_type_location.slice
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
class Feature
|
|
7
|
+
class Type
|
|
8
|
+
# The mission for parameter attributes
|
|
9
|
+
class TypeAttrMission < Mission
|
|
10
|
+
# @rbs return: void
|
|
11
|
+
def initialize
|
|
12
|
+
super
|
|
13
|
+
@modified = false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @rbs generation: Generation
|
|
17
|
+
# @rbs root_node: Node::ProgramNode
|
|
18
|
+
# @rbs _parse_result: Prism::ParseResult
|
|
19
|
+
# @rbs memo_pad: MemoPad
|
|
20
|
+
# @rbs return: bool
|
|
21
|
+
def perform(generation, root_node, _parse_result, memo_pad)
|
|
22
|
+
return true if @modified
|
|
23
|
+
|
|
24
|
+
memo_pad.def_parents_memo.each_value do |def_parent_memo|
|
|
25
|
+
ivars_memo = def_parent_memo.ivars_memo.dup
|
|
26
|
+
def_parent_node = root_node.def_parent_node_at(def_parent_memo.offset) || raise(RubyModKit::Error)
|
|
27
|
+
attr_adding_line = 0
|
|
28
|
+
|
|
29
|
+
ivars_memo.keep_if { |_, ivar_memo| ivar_memo.attr_kind }
|
|
30
|
+
next if ivars_memo.empty?
|
|
31
|
+
|
|
32
|
+
add_first_separator_line = false
|
|
33
|
+
if attr_adding_line == 0
|
|
34
|
+
attr_adding_line = def_parent_node.location.start_line
|
|
35
|
+
prev_line = nil
|
|
36
|
+
while generation.line(attr_adding_line) =~ /\A\s*#.*|\A$/
|
|
37
|
+
prev_line = ::Regexp.last_match(0)
|
|
38
|
+
attr_adding_line += 1
|
|
39
|
+
end
|
|
40
|
+
add_first_separator_line = prev_line != ""
|
|
41
|
+
end
|
|
42
|
+
line = generation.line(attr_adding_line) || next
|
|
43
|
+
add_separator_line = line != "\n" && line !~ /\A\s*end$/
|
|
44
|
+
offset = generation.src_offset(attr_adding_line) || next
|
|
45
|
+
|
|
46
|
+
body_node = def_parent_node.body_node
|
|
47
|
+
if body_node
|
|
48
|
+
first_line = generation.line(body_node)
|
|
49
|
+
indent = first_line[/\A\s*/] || raise(RubyModKit::Error)
|
|
50
|
+
else
|
|
51
|
+
def_parent_line = generation.line(def_parent_node)
|
|
52
|
+
indent = " #{def_parent_line[/\A\s*/]}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
generation[offset, 0] = "\n" if add_first_separator_line
|
|
56
|
+
ivars_memo.each do |name, ivar_memo|
|
|
57
|
+
generation[offset, 0] = "#{indent}#{ivar_memo.attr_kind} :#{name}\n"
|
|
58
|
+
end
|
|
59
|
+
@modified = true
|
|
60
|
+
generation[offset, 0] = "\n" if add_separator_line
|
|
61
|
+
end
|
|
62
|
+
!@modified
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
class Feature
|
|
7
|
+
# namespace for type feature
|
|
8
|
+
class Type < Feature
|
|
9
|
+
# @rbs return: Array[Corrector]
|
|
10
|
+
def create_correctors
|
|
11
|
+
[
|
|
12
|
+
InstanceVariableColonCorrector.new,
|
|
13
|
+
ParameterArrowCorrector.new,
|
|
14
|
+
ReturnValueColonCorrector.new,
|
|
15
|
+
]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @rbs return: Array[Mission]
|
|
19
|
+
def create_missions
|
|
20
|
+
[
|
|
21
|
+
TypeAttrMission.new,
|
|
22
|
+
]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
require_relative "type/instance_variable_colon_corrector"
|
|
29
|
+
require_relative "type/parameter_arrow_corrector"
|
|
30
|
+
require_relative "type/return_value_colon_corrector"
|
|
31
|
+
require_relative "type/type_attr_mission"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
# the base class of feature
|
|
7
|
+
class Feature
|
|
8
|
+
# @rbs other: Feature
|
|
9
|
+
# @rbs return: -1 | 0 | 1 | nil
|
|
10
|
+
def <=>(other)
|
|
11
|
+
self.class.name <=> other.class.name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# @rbs return: Array[Corrector]
|
|
15
|
+
def create_correctors
|
|
16
|
+
[]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @rbs return: Array[Mission]
|
|
20
|
+
def create_missions
|
|
21
|
+
[]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -8,27 +8,40 @@ module RubyModKit
|
|
|
8
8
|
# @rbs @parse_result: Prism::ParseResult
|
|
9
9
|
# @rbs @script: String
|
|
10
10
|
# @rbs @missions: Array[Mission]
|
|
11
|
-
# @rbs @
|
|
11
|
+
# @rbs @memo_pad: MemoPad
|
|
12
12
|
# @rbs @root_node: Node::ProgramNode
|
|
13
13
|
# @rbs @offset_diff: OffsetDiff
|
|
14
14
|
# @rbs @generation_num: Integer
|
|
15
15
|
# @rbs @filename: String | nil
|
|
16
|
+
# @rbs @corrector_manager: CorrectorManager
|
|
17
|
+
# @rbs @features: Array[Feature]
|
|
16
18
|
|
|
17
19
|
attr_reader :parse_result #: Prism::ParseResult
|
|
18
20
|
attr_reader :script #: String
|
|
19
21
|
|
|
20
22
|
# @rbs script: String
|
|
21
23
|
# @rbs missions: Array[Mission]
|
|
22
|
-
# @rbs
|
|
24
|
+
# @rbs memo_pad: MemoPad | nil
|
|
23
25
|
# @rbs generation_num: Integer
|
|
24
26
|
# @rbs filename: String | nil
|
|
27
|
+
# @rbs corrector_manager: CorrectorManager | nil
|
|
28
|
+
# @rbs features: Array[Feature] | nil
|
|
25
29
|
# @rbs return: void
|
|
26
|
-
def initialize(script, missions: [],
|
|
30
|
+
def initialize(script, missions: [], memo_pad: nil, generation_num: 0,
|
|
31
|
+
filename: nil, corrector_manager: nil, features: nil)
|
|
27
32
|
@script = script
|
|
28
33
|
@missions = missions
|
|
29
|
-
@memo = memo
|
|
30
34
|
@generation_num = generation_num
|
|
31
35
|
@filename = filename
|
|
36
|
+
@features = features || [
|
|
37
|
+
Feature::InstanceVariableParameter.new,
|
|
38
|
+
Feature::Overload.new,
|
|
39
|
+
Feature::Type.new,
|
|
40
|
+
Feature::Type::RbsInline.new,
|
|
41
|
+
].sort
|
|
42
|
+
|
|
43
|
+
@memo_pad = memo_pad || MemoPad.new
|
|
44
|
+
@corrector_manager = corrector_manager || CorrectorManager.new(@features)
|
|
32
45
|
@offset_diff = OffsetDiff.new
|
|
33
46
|
@parse_result = Prism.parse(@script)
|
|
34
47
|
@root_node = Node::ProgramNode.new(@parse_result.value)
|
|
@@ -39,11 +52,11 @@ module RubyModKit
|
|
|
39
52
|
def init_missions
|
|
40
53
|
return unless first_generation?
|
|
41
54
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
@features.each do |feature|
|
|
56
|
+
feature.create_missions.each do |mission|
|
|
57
|
+
add_mission(mission)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
47
60
|
end
|
|
48
61
|
|
|
49
62
|
# @rbs return: bool
|
|
@@ -53,16 +66,24 @@ module RubyModKit
|
|
|
53
66
|
|
|
54
67
|
# @rbs return: Generation
|
|
55
68
|
def succ
|
|
69
|
+
if @parse_result.errors.empty?
|
|
70
|
+
perform_missions
|
|
71
|
+
else
|
|
72
|
+
perform_corrector
|
|
73
|
+
end
|
|
56
74
|
@missions.each do |mission|
|
|
57
75
|
mission.succ(@offset_diff)
|
|
58
76
|
end
|
|
59
|
-
@
|
|
77
|
+
@memo_pad.succ(@offset_diff)
|
|
78
|
+
|
|
60
79
|
Generation.new(
|
|
61
80
|
@script,
|
|
62
81
|
missions: @missions,
|
|
63
|
-
|
|
82
|
+
memo_pad: @memo_pad,
|
|
64
83
|
generation_num: @generation_num + 1,
|
|
65
84
|
filename: @filename,
|
|
85
|
+
corrector_manager: @corrector_manager,
|
|
86
|
+
features: @features,
|
|
66
87
|
)
|
|
67
88
|
end
|
|
68
89
|
|
|
@@ -71,11 +92,6 @@ module RubyModKit
|
|
|
71
92
|
"#{@filename || "(eval)"}[gen #{@generation_num}]"
|
|
72
93
|
end
|
|
73
94
|
|
|
74
|
-
# @rbs return: void
|
|
75
|
-
def resolve
|
|
76
|
-
perform_missions
|
|
77
|
-
end
|
|
78
|
-
|
|
79
95
|
# @rbs return: bool
|
|
80
96
|
def completed?
|
|
81
97
|
@parse_result.errors.empty? && @missions.empty?
|
|
@@ -98,14 +114,21 @@ module RubyModKit
|
|
|
98
114
|
@script[dst_range] || raise(RubyModKit::Error, "Invalid range")
|
|
99
115
|
end
|
|
100
116
|
|
|
117
|
+
# @rbs offset: Integer
|
|
118
|
+
# @rbs return: String
|
|
119
|
+
def line_by_offset(offset)
|
|
120
|
+
offset = @offset_diff[offset]
|
|
121
|
+
(@script.match(/.*\n?/, offset) && Regexp.last_match(0)) || raise(RubyModKit::Error)
|
|
122
|
+
end
|
|
123
|
+
|
|
101
124
|
# @rbs (Integer) -> String
|
|
102
|
-
# | (Node) -> String
|
|
125
|
+
# | (Node::BaseNode) -> String
|
|
103
126
|
# | (Prism::ParseError) -> String
|
|
104
127
|
def line(*args)
|
|
105
128
|
case args
|
|
106
129
|
in [Integer]
|
|
107
130
|
line__overload0(*args)
|
|
108
|
-
in [Node]
|
|
131
|
+
in [Node::BaseNode]
|
|
109
132
|
line__overload1(*args)
|
|
110
133
|
in [Prism::ParseError]
|
|
111
134
|
line__overload2(*args)
|
|
@@ -115,11 +138,10 @@ module RubyModKit
|
|
|
115
138
|
# @rbs line_num: Integer
|
|
116
139
|
# @rbs return: String
|
|
117
140
|
def line__overload0(line_num)
|
|
118
|
-
|
|
119
|
-
(@script.match(/.*\n?/, offset) && Regexp.last_match(0)) || raise(RubyModKit::Error)
|
|
141
|
+
line_by_offset(@parse_result.source.offsets[line_num])
|
|
120
142
|
end
|
|
121
143
|
|
|
122
|
-
# @rbs node: Node
|
|
144
|
+
# @rbs node: Node::BaseNode
|
|
123
145
|
# @rbs return: String
|
|
124
146
|
def line__overload1(node)
|
|
125
147
|
line(node.prism_node.location.start_line - 1)
|
|
@@ -154,10 +176,15 @@ module RubyModKit
|
|
|
154
176
|
src_offset(parse_error.location.start_line - 1)
|
|
155
177
|
end
|
|
156
178
|
|
|
179
|
+
# @rbs return: void
|
|
180
|
+
def perform_corrector
|
|
181
|
+
@corrector_manager.perform(self, @root_node, @parse_result, @memo_pad)
|
|
182
|
+
end
|
|
183
|
+
|
|
157
184
|
# @rbs return: void
|
|
158
185
|
def perform_missions
|
|
159
186
|
@missions.delete_if do |mission|
|
|
160
|
-
mission.perform(self, @root_node, @parse_result, @
|
|
187
|
+
mission.perform(self, @root_node, @parse_result, @memo_pad) || break
|
|
161
188
|
end
|
|
162
189
|
end
|
|
163
190
|
|
|
@@ -166,5 +193,16 @@ module RubyModKit
|
|
|
166
193
|
def add_mission(mission)
|
|
167
194
|
@missions << mission
|
|
168
195
|
end
|
|
196
|
+
|
|
197
|
+
class << self
|
|
198
|
+
# @rbs src: String
|
|
199
|
+
# @rbs filename: String | nil
|
|
200
|
+
# @rbs return: Generation
|
|
201
|
+
def resolve(src, filename: nil)
|
|
202
|
+
generation = Generation.new(src.dup, filename: filename)
|
|
203
|
+
generation = generation.succ until generation.completed?
|
|
204
|
+
generation
|
|
205
|
+
end
|
|
206
|
+
end
|
|
169
207
|
end
|
|
170
208
|
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
module Memo
|
|
7
|
+
# The memo for def parent (class, module)
|
|
8
|
+
class DefParentMemo < OffsetMemo
|
|
9
|
+
# @rbs @ivars_memo: Hash[Symbol, Memo::IvarMemo]
|
|
10
|
+
|
|
11
|
+
attr_reader :ivars_memo #: Hash[Symbol, Memo::IvarMemo]
|
|
12
|
+
|
|
13
|
+
# @rbs def_parent_node: Node::DefParentNode
|
|
14
|
+
# @rbs return: void
|
|
15
|
+
def initialize(def_parent_node)
|
|
16
|
+
@ivars_memo = {}
|
|
17
|
+
super(def_parent_node.offset)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @rbs name: Symbol
|
|
21
|
+
# @rbs return: Memo::IvarMemo
|
|
22
|
+
def ivar_memo(name)
|
|
23
|
+
@ivars_memo[name] ||= Memo::IvarMemo.new(name)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @rbs offset_diff: OffsetDiff
|
|
27
|
+
# @rbs return: void
|
|
28
|
+
def succ(offset_diff)
|
|
29
|
+
@ivars_memo.each_value do |ivar_memo|
|
|
30
|
+
ivar_memo.succ(offset_diff)
|
|
31
|
+
end
|
|
32
|
+
super
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -3,26 +3,31 @@
|
|
|
3
3
|
# rbs_inline: enabled
|
|
4
4
|
|
|
5
5
|
module RubyModKit
|
|
6
|
-
|
|
6
|
+
module Memo
|
|
7
7
|
# The memo for parameter type
|
|
8
|
-
class
|
|
8
|
+
class IvarMemo
|
|
9
9
|
# @rbs @type: nil | String
|
|
10
10
|
# @rbs @attr_kind: nil | Symbol
|
|
11
|
+
# @rbs @offset: nil | Integer
|
|
12
|
+
# @rbs @indent: String
|
|
11
13
|
# @rbs @name: Symbol
|
|
12
14
|
|
|
13
15
|
attr_reader :type #: nil | String
|
|
14
16
|
attr_reader :attr_kind #: nil | Symbol
|
|
17
|
+
attr_accessor :offset #: nil | Integer
|
|
18
|
+
attr_accessor :indent #: String
|
|
15
19
|
|
|
16
20
|
# @rbs name: Symbol
|
|
17
21
|
# @rbs return: void
|
|
18
22
|
def initialize(name)
|
|
19
23
|
@name = name
|
|
24
|
+
@indent = ""
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
# @rbs type: String
|
|
23
28
|
# @rbs return: void
|
|
24
29
|
def type=(type)
|
|
25
|
-
@type =
|
|
30
|
+
@type = RubyModKit.unify_type(type)
|
|
26
31
|
end
|
|
27
32
|
|
|
28
33
|
# @rbs kind: Symbol | String
|
|
@@ -37,6 +42,15 @@ module RubyModKit
|
|
|
37
42
|
@attr_kind = :attr_accessor
|
|
38
43
|
end
|
|
39
44
|
end
|
|
45
|
+
|
|
46
|
+
# @rbs offset_diff: OffsetDiff
|
|
47
|
+
# @rbs return: void
|
|
48
|
+
def succ(offset_diff)
|
|
49
|
+
offset = @offset
|
|
50
|
+
return unless offset
|
|
51
|
+
|
|
52
|
+
@offset = offset_diff[offset]
|
|
53
|
+
end
|
|
40
54
|
end
|
|
41
55
|
end
|
|
42
56
|
end
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
# rbs_inline: enabled
|
|
4
4
|
|
|
5
5
|
module RubyModKit
|
|
6
|
-
|
|
6
|
+
module Memo
|
|
7
7
|
# The memo for parameter type
|
|
8
|
-
class
|
|
8
|
+
class MethodMemo < OffsetMemo
|
|
9
9
|
# @rbs @name: Symbol
|
|
10
|
-
# @rbs @parameters: Set[Memo::
|
|
10
|
+
# @rbs @parameters: Set[Memo::ParameterMemo]
|
|
11
11
|
# @rbs @type: String
|
|
12
12
|
|
|
13
13
|
attr_reader :name #: Symbol
|
|
14
|
-
attr_reader :parameters #: Set[Memo::
|
|
14
|
+
attr_reader :parameters #: Set[Memo::ParameterMemo]
|
|
15
15
|
attr_reader :type #: String
|
|
16
16
|
|
|
17
17
|
UNTYPED = "untyped"
|
|
@@ -27,8 +27,8 @@ module RubyModKit
|
|
|
27
27
|
super(node.offset)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
# @rbs parameter_memo: Memo::
|
|
31
|
-
# @rbs return: Memo::
|
|
30
|
+
# @rbs parameter_memo: Memo::ParameterMemo
|
|
31
|
+
# @rbs return: Memo::ParameterMemo
|
|
32
32
|
def add_parameter(parameter_memo)
|
|
33
33
|
@parameters << parameter_memo
|
|
34
34
|
parameter_memo
|
|
@@ -42,7 +42,7 @@ module RubyModKit
|
|
|
42
42
|
# @rbs type: String
|
|
43
43
|
# @rbs return: void
|
|
44
44
|
def type=(type)
|
|
45
|
-
@type =
|
|
45
|
+
@type = RubyModKit.unify_type(type)
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module RubyModKit
|
|
6
|
+
module Memo
|
|
7
|
+
# The memo for parameter type
|
|
8
|
+
class OverloadMemo < OffsetMemo
|
|
9
|
+
# @rbs @name: Symbol
|
|
10
|
+
# @rbs @overload_types: [[Array[String], String]]
|
|
11
|
+
# @rbs @offset_corrected: bool
|
|
12
|
+
|
|
13
|
+
attr_reader :name #: Symbol
|
|
14
|
+
attr_reader :overload_types #: [[Array[String], String]]
|
|
15
|
+
|
|
16
|
+
# @rbs offset: Integer
|
|
17
|
+
# @rbs name: Symbol
|
|
18
|
+
# @rbs return: void
|
|
19
|
+
def initialize(offset, name)
|
|
20
|
+
@name = name
|
|
21
|
+
@overload_types = []
|
|
22
|
+
@offset_corrected = false
|
|
23
|
+
super(offset)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @rbs root_node: Node::ProgramNode
|
|
27
|
+
# @rbs return: Integer
|
|
28
|
+
def correct_offset(root_node)
|
|
29
|
+
return @offset if @offset_corrected
|
|
30
|
+
|
|
31
|
+
node = root_node.def_node_at(@offset)&.prev
|
|
32
|
+
raise RubyModKit::Error unless node.is_a?(Node::DefNode)
|
|
33
|
+
|
|
34
|
+
@offset_corrected = true
|
|
35
|
+
@offset = node.offset
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @rbs parameter_types: Array[String]
|
|
39
|
+
# @rbs return_value_type: String
|
|
40
|
+
# @rbs return: void
|
|
41
|
+
def add_overload_type(parameter_types, return_value_type)
|
|
42
|
+
@overload_types << [parameter_types, return_value_type]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
# rbs_inline: enabled
|
|
4
4
|
|
|
5
5
|
module RubyModKit
|
|
6
|
-
|
|
6
|
+
module Memo
|
|
7
7
|
# The memo for parameter type
|
|
8
|
-
class
|
|
8
|
+
class ParameterMemo < OffsetMemo
|
|
9
9
|
# @rbs @type: String
|
|
10
10
|
# @rbs @ivar_parameter: bool
|
|
11
11
|
# @rbs @qualifier: String
|
|
@@ -32,7 +32,7 @@ module RubyModKit
|
|
|
32
32
|
# @rbs type: String
|
|
33
33
|
# @rbs return: void
|
|
34
34
|
def type=(type)
|
|
35
|
-
@type =
|
|
35
|
+
@type = RubyModKit.unify_type(type)
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
end
|