yoda-language-server 0.4.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/.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
|