yoda-language-server 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.rspec +3 -0
- data/.travis.yml +8 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +78 -0
- data/LICENSE.txt +21 -0
- data/README.md +85 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/client/atom/main.js +27 -0
- data/client/vscode/.gitignore +4 -0
- data/client/vscode/.vscode/launch.json +28 -0
- data/client/vscode/.vscode/settings.json +9 -0
- data/client/vscode/.vscode/tasks.json +20 -0
- data/client/vscode/.vscodeignore +8 -0
- data/client/vscode/CHANGELOG.md +7 -0
- data/client/vscode/README.md +65 -0
- data/client/vscode/package-lock.json +2688 -0
- data/client/vscode/package.json +39 -0
- data/client/vscode/src/extension.ts +42 -0
- data/client/vscode/src/test/extension.test.ts +22 -0
- data/client/vscode/src/test/index.ts +22 -0
- data/client/vscode/tsconfig.json +16 -0
- data/client/vscode/vsc-extension-quickstart.md +33 -0
- data/exe/yoda +27 -0
- data/lib/yoda.rb +11 -0
- data/lib/yoda/evaluation.rb +9 -0
- data/lib/yoda/evaluation/code_completion.rb +65 -0
- data/lib/yoda/evaluation/code_completion/base_provider.rb +57 -0
- data/lib/yoda/evaluation/code_completion/const_provider.rb +90 -0
- data/lib/yoda/evaluation/code_completion/method_provider.rb +82 -0
- data/lib/yoda/evaluation/code_completion/variable_provider.rb +18 -0
- data/lib/yoda/evaluation/comment_completion.rb +70 -0
- data/lib/yoda/evaluation/comment_completion/base_provider.rb +64 -0
- data/lib/yoda/evaluation/comment_completion/param_provider.rb +18 -0
- data/lib/yoda/evaluation/comment_completion/tag_provider.rb +41 -0
- data/lib/yoda/evaluation/comment_completion/type_provider.rb +58 -0
- data/lib/yoda/evaluation/current_node_explain.rb +70 -0
- data/lib/yoda/evaluation/evaluator.rb +103 -0
- data/lib/yoda/evaluation/signature_discovery.rb +83 -0
- data/lib/yoda/model.rb +12 -0
- data/lib/yoda/model/completion_item.rb +56 -0
- data/lib/yoda/model/descriptions.rb +10 -0
- data/lib/yoda/model/descriptions/base.rb +26 -0
- data/lib/yoda/model/descriptions/function_description.rb +40 -0
- data/lib/yoda/model/descriptions/value_description.rb +33 -0
- data/lib/yoda/model/descriptions/word_description.rb +32 -0
- data/lib/yoda/model/function_signatures.rb +13 -0
- data/lib/yoda/model/function_signatures/base.rb +68 -0
- data/lib/yoda/model/function_signatures/constructor.rb +70 -0
- data/lib/yoda/model/function_signatures/formatter.rb +82 -0
- data/lib/yoda/model/function_signatures/method.rb +67 -0
- data/lib/yoda/model/function_signatures/overload.rb +79 -0
- data/lib/yoda/model/function_signatures/parameter_list.rb +108 -0
- data/lib/yoda/model/function_signatures/type_builder.rb +101 -0
- data/lib/yoda/model/node_signature.rb +28 -0
- data/lib/yoda/model/path.rb +96 -0
- data/lib/yoda/model/scoped_path.rb +44 -0
- data/lib/yoda/model/types.rb +84 -0
- data/lib/yoda/model/types/any_type.rb +32 -0
- data/lib/yoda/model/types/base.rb +37 -0
- data/lib/yoda/model/types/duck_type.rb +41 -0
- data/lib/yoda/model/types/function_type.rb +174 -0
- data/lib/yoda/model/types/generic_type.rb +66 -0
- data/lib/yoda/model/types/instance_type.rb +42 -0
- data/lib/yoda/model/types/module_type.rb +42 -0
- data/lib/yoda/model/types/sequence_type.rb +53 -0
- data/lib/yoda/model/types/union_type.rb +56 -0
- data/lib/yoda/model/types/unknown_type.rb +40 -0
- data/lib/yoda/model/types/value_type.rb +58 -0
- data/lib/yoda/model/values.rb +9 -0
- data/lib/yoda/model/values/base.rb +32 -0
- data/lib/yoda/model/values/instance_value.rb +65 -0
- data/lib/yoda/model/values/module_value.rb +72 -0
- data/lib/yoda/parsing.rb +15 -0
- data/lib/yoda/parsing/ast_traversable.rb +18 -0
- data/lib/yoda/parsing/comment_tokenizer.rb +59 -0
- data/lib/yoda/parsing/location.rb +101 -0
- data/lib/yoda/parsing/node_objects.rb +10 -0
- data/lib/yoda/parsing/node_objects/const_node.rb +52 -0
- data/lib/yoda/parsing/node_objects/method_definition.rb +46 -0
- data/lib/yoda/parsing/node_objects/namespace.rb +104 -0
- data/lib/yoda/parsing/node_objects/send_node.rb +72 -0
- data/lib/yoda/parsing/parser.rb +27 -0
- data/lib/yoda/parsing/query.rb +11 -0
- data/lib/yoda/parsing/query/current_comment_query.rb +80 -0
- data/lib/yoda/parsing/query/current_comment_token_query.rb +153 -0
- data/lib/yoda/parsing/query/current_commenting_node_query.rb +68 -0
- data/lib/yoda/parsing/query/current_location_node_query.rb +51 -0
- data/lib/yoda/parsing/query/current_node_comment_query.rb +40 -0
- data/lib/yoda/parsing/range.rb +41 -0
- data/lib/yoda/parsing/scopes.rb +15 -0
- data/lib/yoda/parsing/scopes/base.rb +78 -0
- data/lib/yoda/parsing/scopes/builder.rb +60 -0
- data/lib/yoda/parsing/scopes/class_definition.rb +47 -0
- data/lib/yoda/parsing/scopes/meta_class_definition.rb +44 -0
- data/lib/yoda/parsing/scopes/meta_method_definition.rb +70 -0
- data/lib/yoda/parsing/scopes/method_definition.rb +69 -0
- data/lib/yoda/parsing/scopes/module_definition.rb +36 -0
- data/lib/yoda/parsing/scopes/root.rb +25 -0
- data/lib/yoda/parsing/source_analyzer.rb +59 -0
- data/lib/yoda/parsing/source_cutter.rb +231 -0
- data/lib/yoda/parsing/type_parser.rb +141 -0
- data/lib/yoda/runner.rb +6 -0
- data/lib/yoda/runner/infer.rb +50 -0
- data/lib/yoda/runner/setup.rb +26 -0
- data/lib/yoda/server.rb +191 -0
- data/lib/yoda/server/client_info.rb +98 -0
- data/lib/yoda/server/completion_provider.rb +78 -0
- data/lib/yoda/server/definition_provider.rb +36 -0
- data/lib/yoda/server/deserializer.rb +27 -0
- data/lib/yoda/server/hover_provider.rb +38 -0
- data/lib/yoda/server/signature_provider.rb +46 -0
- data/lib/yoda/store.rb +13 -0
- data/lib/yoda/store/actions.rb +10 -0
- data/lib/yoda/store/actions/import_core_library.rb +30 -0
- data/lib/yoda/store/actions/import_gems.rb +91 -0
- data/lib/yoda/store/actions/read_file.rb +36 -0
- data/lib/yoda/store/actions/read_project_files.rb +29 -0
- data/lib/yoda/store/adapters.rb +14 -0
- data/lib/yoda/store/adapters/base.rb +58 -0
- data/lib/yoda/store/adapters/leveldb_adapter.rb +80 -0
- data/lib/yoda/store/adapters/lmdb_adapter.rb +113 -0
- data/lib/yoda/store/objects.rb +46 -0
- data/lib/yoda/store/objects/addressable.rb +25 -0
- data/lib/yoda/store/objects/base.rb +116 -0
- data/lib/yoda/store/objects/class_object.rb +51 -0
- data/lib/yoda/store/objects/merger.rb +94 -0
- data/lib/yoda/store/objects/meta_class_object.rb +41 -0
- data/lib/yoda/store/objects/method_object.rb +94 -0
- data/lib/yoda/store/objects/module_object.rb +11 -0
- data/lib/yoda/store/objects/namespace_object.rb +67 -0
- data/lib/yoda/store/objects/overload.rb +51 -0
- data/lib/yoda/store/objects/patch.rb +46 -0
- data/lib/yoda/store/objects/patch_set.rb +80 -0
- data/lib/yoda/store/objects/tag.rb +62 -0
- data/lib/yoda/store/objects/value_object.rb +45 -0
- data/lib/yoda/store/project.rb +159 -0
- data/lib/yoda/store/query.rb +12 -0
- data/lib/yoda/store/query/associators.rb +10 -0
- data/lib/yoda/store/query/associators/associate_ancestors.rb +103 -0
- data/lib/yoda/store/query/associators/associate_methods.rb +38 -0
- data/lib/yoda/store/query/base.rb +16 -0
- data/lib/yoda/store/query/find_constant.rb +150 -0
- data/lib/yoda/store/query/find_meta_class.rb +18 -0
- data/lib/yoda/store/query/find_method.rb +74 -0
- data/lib/yoda/store/query/find_signature.rb +43 -0
- data/lib/yoda/store/registry.rb +67 -0
- data/lib/yoda/store/yard_importer.rb +260 -0
- data/lib/yoda/typing.rb +10 -0
- data/lib/yoda/typing/context.rb +96 -0
- data/lib/yoda/typing/environment.rb +35 -0
- data/lib/yoda/typing/evaluator.rb +256 -0
- data/lib/yoda/typing/lexical_scope.rb +26 -0
- data/lib/yoda/typing/relation.rb +15 -0
- data/lib/yoda/typing/traces.rb +9 -0
- data/lib/yoda/typing/traces/base.rb +26 -0
- data/lib/yoda/typing/traces/normal.rb +22 -0
- data/lib/yoda/typing/traces/send.rb +26 -0
- data/lib/yoda/version.rb +3 -0
- data/lib/yoda/yard_extensions.rb +11 -0
- data/lib/yoda/yard_extensions/sig_directive.rb +40 -0
- data/lib/yoda/yard_extensions/type_tag.rb +10 -0
- data/package.json +76 -0
- data/scripts/benchmark.rb +6 -0
- data/scripts/build_core_index.sh +16 -0
- data/yarn.lock +13 -0
- data/yoda-language-server.gemspec +40 -0
- metadata +424 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Query
|
4
|
+
class CurrentNodeCommentQuery
|
5
|
+
attr_reader :ast, :comments, :location
|
6
|
+
|
7
|
+
# @param ast [::Parser::AST::Node]
|
8
|
+
# @param comments [Array<::Parser::Source::Comment>]
|
9
|
+
# @param location [Location]
|
10
|
+
def initialize(comments, location)
|
11
|
+
@ast = ast
|
12
|
+
@comments = comments
|
13
|
+
@location = location
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Array<::Parser::Source::Comment>]
|
17
|
+
def current_commenting_node
|
18
|
+
@current_commenting_node ||= inverse_association[current_comment_block]
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# @return [{::Parser::AST::Node => Array<::Parser::Source::Comment>}]
|
24
|
+
def association
|
25
|
+
@association ||= ::Parser::Source::Comment.associate(ast, comments)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [{Array<::Parser::Source::Comment> => ::Parser::AST::Node}]
|
29
|
+
def inverse_association
|
30
|
+
@inverse_association ||= association.invert
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [{::Parser::Source::Map => Array<::Parser::Source::Comment>]
|
34
|
+
def location_association
|
35
|
+
@location_association ||= ::Parser::Source::Comment.associate_with_location(ast, comments)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
class Range
|
4
|
+
attr_reader :begin_location, :end_location
|
5
|
+
# @param begin_location [Integer]
|
6
|
+
# @param end_location [Integer]
|
7
|
+
def initialize(begin_location, end_location)
|
8
|
+
@begin_location = begin_location
|
9
|
+
@end_location = end_location
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param ast_location [Parser::Source::Map, Parser::Source::Range]
|
13
|
+
# @return [Location, nil]
|
14
|
+
def self.of_ast_location(ast_location)
|
15
|
+
return nil unless Location.valid_location?(ast_location)
|
16
|
+
new(
|
17
|
+
Location.new(row: ast_location.line, column: ast_location.column),
|
18
|
+
Location.new(row: ast_location.last_line, column: ast_location.last_column),
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [{Symbol => { Symbol => Integer } }]
|
23
|
+
def to_language_server_protocol_range
|
24
|
+
{ start: begin_location.to_language_server_protocol_range, end: end_location.to_language_server_protocol_range }
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param row [Integer]
|
28
|
+
# @param column [Integer]
|
29
|
+
# @return [Range]
|
30
|
+
def move(row:, column:)
|
31
|
+
self.class.new(begin_location.move(row: row, column: column), end_location.move(row: row, column: column))
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param location [Location]
|
35
|
+
# @return [true, false]
|
36
|
+
def include?(location)
|
37
|
+
begin_location <= location && location <= end_location
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Scopes
|
4
|
+
require 'yoda/parsing/scopes/base'
|
5
|
+
require 'yoda/parsing/scopes/root'
|
6
|
+
require 'yoda/parsing/scopes/method_definition'
|
7
|
+
require 'yoda/parsing/scopes/module_definition'
|
8
|
+
require 'yoda/parsing/scopes/class_definition'
|
9
|
+
require 'yoda/parsing/scopes/meta_method_definition'
|
10
|
+
require 'yoda/parsing/scopes/meta_class_definition'
|
11
|
+
|
12
|
+
require 'yoda/parsing/scopes/builder'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Scopes
|
4
|
+
# Base class for wrapper classes of nodes which create lexical scopes.
|
5
|
+
# @abstract
|
6
|
+
class Base
|
7
|
+
# @return [::Parser::AST::Node]
|
8
|
+
attr_reader :node
|
9
|
+
|
10
|
+
# @return [Namespace, nil]
|
11
|
+
attr_reader :parent
|
12
|
+
|
13
|
+
# @return [Array<Base>]
|
14
|
+
attr_reader :child_scopes
|
15
|
+
|
16
|
+
# @return [Array<MethodDefinition>]
|
17
|
+
attr_reader :method_definitions
|
18
|
+
|
19
|
+
# @param node [::Parser::AST::Node]
|
20
|
+
# @param parent [Base, nil]
|
21
|
+
def initialize(node, parent = nil)
|
22
|
+
fail ArgumentError, node unless node.is_a?(::Parser::AST::Node)
|
23
|
+
fail ArgumentError, parent if parent && !parent.is_a?(Base)
|
24
|
+
@node = node
|
25
|
+
@parent = parent
|
26
|
+
@method_definitions = []
|
27
|
+
@child_scopes = []
|
28
|
+
end
|
29
|
+
|
30
|
+
# @abstract
|
31
|
+
# @return [Array<::Parser::AST::Node>]
|
32
|
+
def body_nodes
|
33
|
+
fail NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
# @abstract
|
37
|
+
# @return [::Parser::AST::Node]
|
38
|
+
def body_node
|
39
|
+
fail NotImplementedError
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param location [Location]
|
43
|
+
# @return [true, false]
|
44
|
+
def inner_location?(location)
|
45
|
+
location.included?(node.location)
|
46
|
+
end
|
47
|
+
|
48
|
+
# @abstract
|
49
|
+
# @return [Symbol]
|
50
|
+
def kind
|
51
|
+
fail NotImplementedError
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [true, false]
|
55
|
+
def method?
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param current_location [Location]
|
60
|
+
# @return [Namespace, nil]
|
61
|
+
def find_evaluation_root_scope(current_location)
|
62
|
+
return nil unless inner_location?(current_location)
|
63
|
+
[*child_scopes, *method_definitions].each do |s|
|
64
|
+
if scope = s.find_evaluation_root_scope(current_location)
|
65
|
+
return scope
|
66
|
+
end
|
67
|
+
end
|
68
|
+
return self
|
69
|
+
end
|
70
|
+
|
71
|
+
# @return [Array<String>]
|
72
|
+
def ancestor_scopes
|
73
|
+
[scope_name, *(parent ? parent.ancestor_scopes : [])]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Scopes
|
4
|
+
class Builder
|
5
|
+
# @return [AST::Node]
|
6
|
+
attr_reader :node
|
7
|
+
|
8
|
+
# @param node [AST::Node]
|
9
|
+
def initialize(node)
|
10
|
+
@node = node
|
11
|
+
@root_scope = Root.new(node)
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Scope]
|
15
|
+
def root_scope
|
16
|
+
unless @did_build
|
17
|
+
@did_build = true
|
18
|
+
build(node, @root_scope)
|
19
|
+
end
|
20
|
+
@root_scope
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param node [AST::Node]
|
24
|
+
# @param scope [Base]
|
25
|
+
# @return [void]
|
26
|
+
def build(node, scope)
|
27
|
+
return if !node || !node.is_a?(AST::Node)
|
28
|
+
case node.type
|
29
|
+
when :def
|
30
|
+
mscope = MethodDefinition.new(node, scope)
|
31
|
+
scope.method_definitions << mscope
|
32
|
+
mscope.body_nodes.each { |node| build(node, mscope)}
|
33
|
+
when :defs
|
34
|
+
mscope = SingletonMethodDefinition.new(node, scope)
|
35
|
+
scope.method_definitions << mscope
|
36
|
+
mscope.body_nodes.each { |node| build(node, mscope)}
|
37
|
+
when :class
|
38
|
+
cscope = ClassDefinition.new(node, scope)
|
39
|
+
scope.child_scopes << cscope
|
40
|
+
cscope.body_nodes.each { |node| build(node, cscope)}
|
41
|
+
when :sclass
|
42
|
+
cscope = SingletonClassDefinition.new(node, scope)
|
43
|
+
scope.child_scopes << cscope
|
44
|
+
cscope.body_nodes.each { |node| build(node, cscope)}
|
45
|
+
when :module
|
46
|
+
mscope = ModuleDefinition.new(node, scope)
|
47
|
+
scope.child_scopes << mscope
|
48
|
+
mscope.body_nodes.each { |node| build(node, mscope)}
|
49
|
+
when :begin, :kwbegin, :block
|
50
|
+
node.children.each { |node| build(node, scope) }
|
51
|
+
else
|
52
|
+
if node.respond_to?(:children)
|
53
|
+
node.children.map { |node| build(node, scope) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Scopes
|
4
|
+
# Wrapper class for class node.
|
5
|
+
# @see https://github.com/whitequark/parser/blob/2.2/doc/AST_FORMAT.md#class
|
6
|
+
# ```
|
7
|
+
# (class (const nil :Foo) (const nil :Bar) (nil))
|
8
|
+
# "class Foo < Bar; end"
|
9
|
+
# ~~~~~ keyword ~~~ end
|
10
|
+
# ~ operator
|
11
|
+
# ~~~~~~~~~~~~~~~~~~~~ expression
|
12
|
+
#
|
13
|
+
# (class (const nil :Foo) nil (nil))
|
14
|
+
# "class Foo; end"
|
15
|
+
# ~~~~~ keyword
|
16
|
+
# ~~~ end
|
17
|
+
# ~~~~~~~~~~~~~~ expression
|
18
|
+
# ```
|
19
|
+
class ClassDefinition < Base
|
20
|
+
def const_node
|
21
|
+
@const_node ||= NodeObjects::ConstNode.new(node.children[0])
|
22
|
+
end
|
23
|
+
|
24
|
+
def superclass_const_node
|
25
|
+
@superclass_const_node ||= node.children && NodeObjects::ConstNode.new(node.children[1])
|
26
|
+
end
|
27
|
+
|
28
|
+
def body_nodes
|
29
|
+
[body_node]
|
30
|
+
end
|
31
|
+
|
32
|
+
def body_node
|
33
|
+
node.children.last
|
34
|
+
end
|
35
|
+
|
36
|
+
def kind
|
37
|
+
:class
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [String]
|
41
|
+
def scope_name
|
42
|
+
const_node.to_s(parent.scope_name)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Scopes
|
4
|
+
# Wrapper class for singleton class node.
|
5
|
+
# @see https://github.com/whitequark/parser/blob/2.2/doc/AST_FORMAT.md#singleton-class
|
6
|
+
# ```
|
7
|
+
# (sclass (lvar :a) (nil))
|
8
|
+
# "class << a; end"
|
9
|
+
# ~~~~~ keyword
|
10
|
+
# ~~ operator
|
11
|
+
# ~~~ end
|
12
|
+
# ~~~~~~~~~~~~~~~ expression
|
13
|
+
# ```
|
14
|
+
class SingletonClassDefinition < Base
|
15
|
+
def instance_node
|
16
|
+
node.children[0]
|
17
|
+
end
|
18
|
+
|
19
|
+
def body_nodes
|
20
|
+
[body_node]
|
21
|
+
end
|
22
|
+
|
23
|
+
def body_node
|
24
|
+
node.children.last
|
25
|
+
end
|
26
|
+
|
27
|
+
def kind
|
28
|
+
:meta_class
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return [String]
|
32
|
+
def scope_name
|
33
|
+
const_node.to_s(parent.scope_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param current_location [Location]
|
37
|
+
# @return [Namespace, nil]
|
38
|
+
def find_evaluation_root_scope(current_location)
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Scopes
|
4
|
+
# Wrapper class for singleton method node.
|
5
|
+
# @see https://github.com/whitequark/parser/blob/2.2/doc/AST_FORMAT.md#singleton-methods
|
6
|
+
# ```
|
7
|
+
# (defs (self) :foo (args) nil)
|
8
|
+
# "def self.foo; end"
|
9
|
+
# ~~~ keyword
|
10
|
+
# ~~~ name
|
11
|
+
# ~~~ end
|
12
|
+
# ~~~~~~~~~~~~~~~~~ expression
|
13
|
+
# ```
|
14
|
+
class SingletonMethodDefinition < Base
|
15
|
+
# @return [Symbol]
|
16
|
+
def name
|
17
|
+
node.children[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Parser::AST::Node]
|
21
|
+
def arg_node
|
22
|
+
node.children[2]
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Parser::AST::Node]
|
26
|
+
def body_node
|
27
|
+
node.children[3]
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Array<Parser::AST::Node>]
|
31
|
+
def body_nodes
|
32
|
+
[body_node]
|
33
|
+
end
|
34
|
+
|
35
|
+
def body_node
|
36
|
+
node.children[3]
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [String]
|
40
|
+
def full_name
|
41
|
+
"#{namespace.full_name}##{name}"
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [String]
|
45
|
+
def namespace_name
|
46
|
+
namespace.full_name
|
47
|
+
end
|
48
|
+
|
49
|
+
def kind
|
50
|
+
:meta_method
|
51
|
+
end
|
52
|
+
|
53
|
+
def method?
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [String]
|
58
|
+
def scope_name
|
59
|
+
parent.scope_name
|
60
|
+
end
|
61
|
+
|
62
|
+
# @param current_location [Location]
|
63
|
+
# @return [Namespace, nil]
|
64
|
+
def find_evaluation_root_scope(current_location)
|
65
|
+
return nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Yoda
|
2
|
+
module Parsing
|
3
|
+
module Scopes
|
4
|
+
# Wrapper class for instance method node.
|
5
|
+
# @see https://github.com/whitequark/parser/blob/2.2/doc/AST_FORMAT.md#instance-methods
|
6
|
+
# ```
|
7
|
+
# (def :foo (args) nil)
|
8
|
+
# "def foo; end"
|
9
|
+
# ~~~ keyword
|
10
|
+
# ~~~ name
|
11
|
+
# ~~~ end
|
12
|
+
# ~~~~~~~~~~~~ expression
|
13
|
+
# ```
|
14
|
+
class MethodDefinition < Base
|
15
|
+
# @return [Symbol]
|
16
|
+
def name
|
17
|
+
node.children[0]
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Parser::AST::Node]
|
21
|
+
def arg_node
|
22
|
+
node.children[1]
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Parser::AST::Node]
|
26
|
+
def body_node
|
27
|
+
node.children[2]
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Array<Parser::AST::Node>]
|
31
|
+
def body_nodes
|
32
|
+
[body_node]
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [String]
|
36
|
+
def full_name
|
37
|
+
"#{namespace.full_name}##{name}"
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [String]
|
41
|
+
def namespace_name
|
42
|
+
namespace.full_name
|
43
|
+
end
|
44
|
+
|
45
|
+
def singleton?
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
def kind
|
50
|
+
:method
|
51
|
+
end
|
52
|
+
|
53
|
+
def method?
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [String]
|
58
|
+
def scope_name
|
59
|
+
parent.scope_name
|
60
|
+
end
|
61
|
+
|
62
|
+
# @return [Array<String>]
|
63
|
+
def ancestor_scopes
|
64
|
+
parent.ancestor_scopes
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|