solargraph 0.44.2 → 0.46.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 +4 -4
- data/.github/workflows/rspec.yml +41 -0
- data/.gitignore +9 -9
- data/.rspec +2 -2
- data/.travis.yml +19 -19
- data/CHANGELOG.md +1115 -1088
- data/Gemfile +0 -0
- data/LICENSE +0 -0
- data/README.md +128 -120
- data/Rakefile +0 -0
- data/SPONSORS.md +18 -15
- data/bin/solargraph +0 -0
- data/lib/solargraph/api_map/bundler_methods.rb +22 -22
- data/lib/solargraph/api_map/cache.rb +70 -70
- data/lib/solargraph/api_map/source_to_yard.rb +81 -81
- data/lib/solargraph/api_map/store.rb +256 -256
- data/lib/solargraph/api_map.rb +686 -681
- data/lib/solargraph/bench.rb +27 -27
- data/lib/solargraph/compat.rb +37 -37
- data/lib/solargraph/complex_type/type_methods.rb +130 -130
- data/lib/solargraph/complex_type/unique_type.rb +75 -75
- data/lib/solargraph/complex_type.rb +221 -221
- data/lib/solargraph/convention/base.rb +33 -33
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +22 -22
- data/lib/solargraph/convention/rspec.rb +30 -21
- data/lib/solargraph/convention.rb +47 -47
- data/lib/solargraph/converters/dd.rb +12 -12
- data/lib/solargraph/converters/dl.rb +12 -12
- data/lib/solargraph/converters/dt.rb +12 -12
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/base.rb +29 -29
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
- data/lib/solargraph/diagnostics/rubocop.rb +98 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
- data/lib/solargraph/diagnostics/severities.rb +15 -15
- data/lib/solargraph/diagnostics/type_check.rb +54 -54
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/documentor.rb +76 -76
- data/lib/solargraph/environ.rb +45 -45
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/cataloger.rb +56 -56
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +111 -111
- data/lib/solargraph/language_server/host/message_worker.rb +59 -59
- data/lib/solargraph/language_server/host/sources.rb +156 -156
- data/lib/solargraph/language_server/host.rb +865 -865
- data/lib/solargraph/language_server/message/base.rb +89 -89
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/client.rb +11 -11
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
- data/lib/solargraph/language_server/message/completion_item.rb +11 -11
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
- data/lib/solargraph/language_server/message/extended/document.rb +20 -20
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/extended.rb +21 -21
- data/lib/solargraph/language_server/message/initialize.rb +162 -162
- data/lib/solargraph/language_server/message/initialized.rb +27 -27
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
- data/lib/solargraph/language_server/message/shutdown.rb +13 -13
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
- data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/workspace.rb +14 -14
- data/lib/solargraph/language_server/message.rb +93 -93
- data/lib/solargraph/language_server/message_types.rb +14 -14
- data/lib/solargraph/language_server/request.rb +24 -24
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
- data/lib/solargraph/language_server/transport/adapter.rb +53 -53
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
- data/lib/solargraph/language_server/transport.rb +13 -13
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/language_server.rb +19 -19
- data/lib/solargraph/library.rb +546 -546
- data/lib/solargraph/location.rb +37 -37
- data/lib/solargraph/logging.rb +27 -27
- data/lib/solargraph/page.rb +83 -83
- data/lib/solargraph/parser/comment_ripper.rb +52 -52
- data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
- data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
- data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
- data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
- data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
- data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
- data/lib/solargraph/parser/legacy.rb +12 -12
- data/lib/solargraph/parser/node_methods.rb +43 -43
- data/lib/solargraph/parser/node_processor/base.rb +77 -77
- data/lib/solargraph/parser/node_processor.rb +43 -43
- data/lib/solargraph/parser/region.rb +66 -66
- data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
- data/lib/solargraph/parser/rubyvm.rb +40 -40
- data/lib/solargraph/parser/snippet.rb +13 -13
- data/lib/solargraph/parser.rb +26 -26
- data/lib/solargraph/pin/base.rb +296 -296
- data/lib/solargraph/pin/base_variable.rb +84 -84
- data/lib/solargraph/pin/block.rb +72 -72
- data/lib/solargraph/pin/class_variable.rb +8 -8
- data/lib/solargraph/pin/closure.rb +37 -37
- data/lib/solargraph/pin/common.rb +70 -70
- data/lib/solargraph/pin/constant.rb +43 -43
- data/lib/solargraph/pin/conversions.rb +96 -96
- data/lib/solargraph/pin/documenting.rb +105 -105
- data/lib/solargraph/pin/duck_method.rb +16 -16
- data/lib/solargraph/pin/global_variable.rb +8 -8
- data/lib/solargraph/pin/instance_variable.rb +30 -30
- data/lib/solargraph/pin/keyword.rb +15 -15
- data/lib/solargraph/pin/keyword_param.rb +8 -8
- data/lib/solargraph/pin/local_variable.rb +55 -55
- data/lib/solargraph/pin/method.rb +245 -245
- data/lib/solargraph/pin/method_alias.rb +31 -31
- data/lib/solargraph/pin/namespace.rb +91 -91
- data/lib/solargraph/pin/parameter.rb +201 -206
- data/lib/solargraph/pin/proxy_type.rb +29 -29
- data/lib/solargraph/pin/reference/extend.rb +10 -10
- data/lib/solargraph/pin/reference/include.rb +10 -10
- data/lib/solargraph/pin/reference/override.rb +29 -29
- data/lib/solargraph/pin/reference/prepend.rb +10 -10
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +10 -10
- data/lib/solargraph/pin/reference.rb +14 -14
- data/lib/solargraph/pin/search.rb +56 -0
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +47 -47
- data/lib/solargraph/pin.rb +37 -36
- data/lib/solargraph/position.rb +100 -100
- data/lib/solargraph/range.rb +95 -95
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +226 -226
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +204 -204
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +75 -75
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +28 -28
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +71 -71
- data/lib/solargraph/source/chain/literal.rb +23 -23
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +164 -164
- data/lib/solargraph/source/change.rb +79 -79
- data/lib/solargraph/source/cursor.rb +164 -164
- data/lib/solargraph/source/source_chainer.rb +191 -191
- data/lib/solargraph/source/updater.rb +54 -54
- data/lib/solargraph/source.rb +522 -522
- data/lib/solargraph/source_map/clip.rb +224 -224
- data/lib/solargraph/source_map/completion.rb +23 -23
- data/lib/solargraph/source_map/mapper.rb +212 -212
- data/lib/solargraph/source_map.rb +180 -189
- data/lib/solargraph/type_checker/checks.rb +99 -99
- data/lib/solargraph/type_checker/param_def.rb +35 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +57 -57
- data/lib/solargraph/type_checker.rb +543 -510
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/environment.erb +58 -58
- data/lib/solargraph/workspace/config.rb +231 -231
- data/lib/solargraph/workspace.rb +215 -214
- data/lib/solargraph/yard_map/cache.rb +19 -19
- data/lib/solargraph/yard_map/core_docs.rb +170 -170
- data/lib/solargraph/yard_map/core_fills.rb +208 -203
- data/lib/solargraph/yard_map/core_gen.rb +76 -76
- data/lib/solargraph/yard_map/helpers.rb +16 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
- data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
- data/lib/solargraph/yard_map/mapper.rb +77 -77
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
- data/lib/solargraph/yard_map/to_method.rb +79 -79
- data/lib/solargraph/yard_map.rb +460 -443
- data/lib/solargraph.rb +69 -69
- data/lib/yard-solargraph.rb +33 -33
- data/solargraph.gemspec +0 -0
- metadata +14 -12
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Diagnostics
|
|
5
|
-
# These severity constants match the DiagnosticSeverity constants in the
|
|
6
|
-
# language server protocol.
|
|
7
|
-
#
|
|
8
|
-
module Severities
|
|
9
|
-
ERROR = 1
|
|
10
|
-
WARNING = 2
|
|
11
|
-
INFORMATION = 3
|
|
12
|
-
HINT = 4
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Diagnostics
|
|
5
|
+
# These severity constants match the DiagnosticSeverity constants in the
|
|
6
|
+
# language server protocol.
|
|
7
|
+
#
|
|
8
|
+
module Severities
|
|
9
|
+
ERROR = 1
|
|
10
|
+
WARNING = 2
|
|
11
|
+
INFORMATION = 3
|
|
12
|
+
HINT = 4
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Diagnostics
|
|
5
|
-
# TypeCheck reports methods with undefined return types, untagged
|
|
6
|
-
# parameters, and invalid param tags.
|
|
7
|
-
#
|
|
8
|
-
class TypeCheck < Base
|
|
9
|
-
def diagnose source, api_map
|
|
10
|
-
# return [] unless args.include?('always') || api_map.workspaced?(source.filename)
|
|
11
|
-
severity = Diagnostics::Severities::ERROR
|
|
12
|
-
level = (args.reverse.find { |a| ['normal', 'typed', 'strict', 'strong'].include?(a) }) || :normal
|
|
13
|
-
checker = Solargraph::TypeChecker.new(source.filename, api_map: api_map, level: level.to_sym)
|
|
14
|
-
checker.problems
|
|
15
|
-
.sort { |a, b| a.location.range.start.line <=> b.location.range.start.line }
|
|
16
|
-
.map do |problem|
|
|
17
|
-
{
|
|
18
|
-
range: extract_first_line(problem.location, source),
|
|
19
|
-
severity: severity,
|
|
20
|
-
source: 'Typecheck',
|
|
21
|
-
message: problem.message
|
|
22
|
-
}
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
# @param location [Location]
|
|
29
|
-
# @param source [Source]
|
|
30
|
-
# @return [Hash]
|
|
31
|
-
def extract_first_line location, source
|
|
32
|
-
return location.range.to_hash if location.range.start.line == location.range.ending.line
|
|
33
|
-
{
|
|
34
|
-
start: {
|
|
35
|
-
line: location.range.start.line,
|
|
36
|
-
character: location.range.start.character
|
|
37
|
-
},
|
|
38
|
-
end: {
|
|
39
|
-
line: location.range.start.line,
|
|
40
|
-
character: last_character(location.range.start, source)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# @param position [Solargraph::Position]
|
|
46
|
-
# @param source [Solargraph::Source]
|
|
47
|
-
# @return [Integer]
|
|
48
|
-
def last_character position, source
|
|
49
|
-
cursor = Position.to_offset(source.code, position)
|
|
50
|
-
source.code.index(/[\r\n]/, cursor) || source.code.length
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Diagnostics
|
|
5
|
+
# TypeCheck reports methods with undefined return types, untagged
|
|
6
|
+
# parameters, and invalid param tags.
|
|
7
|
+
#
|
|
8
|
+
class TypeCheck < Base
|
|
9
|
+
def diagnose source, api_map
|
|
10
|
+
# return [] unless args.include?('always') || api_map.workspaced?(source.filename)
|
|
11
|
+
severity = Diagnostics::Severities::ERROR
|
|
12
|
+
level = (args.reverse.find { |a| ['normal', 'typed', 'strict', 'strong'].include?(a) }) || :normal
|
|
13
|
+
checker = Solargraph::TypeChecker.new(source.filename, api_map: api_map, level: level.to_sym)
|
|
14
|
+
checker.problems
|
|
15
|
+
.sort { |a, b| a.location.range.start.line <=> b.location.range.start.line }
|
|
16
|
+
.map do |problem|
|
|
17
|
+
{
|
|
18
|
+
range: extract_first_line(problem.location, source),
|
|
19
|
+
severity: severity,
|
|
20
|
+
source: 'Typecheck',
|
|
21
|
+
message: problem.message
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# @param location [Location]
|
|
29
|
+
# @param source [Source]
|
|
30
|
+
# @return [Hash]
|
|
31
|
+
def extract_first_line location, source
|
|
32
|
+
return location.range.to_hash if location.range.start.line == location.range.ending.line
|
|
33
|
+
{
|
|
34
|
+
start: {
|
|
35
|
+
line: location.range.start.line,
|
|
36
|
+
character: location.range.start.character
|
|
37
|
+
},
|
|
38
|
+
end: {
|
|
39
|
+
line: location.range.start.line,
|
|
40
|
+
character: last_character(location.range.start, source)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @param position [Solargraph::Position]
|
|
46
|
+
# @param source [Solargraph::Source]
|
|
47
|
+
# @return [Integer]
|
|
48
|
+
def last_character position, source
|
|
49
|
+
cursor = Position.to_offset(source.code, position)
|
|
50
|
+
source.code.index(/[\r\n]/, cursor) || source.code.length
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Diagnostics
|
|
5
|
-
class UpdateErrors < Base
|
|
6
|
-
def diagnose source, api_map
|
|
7
|
-
result = []
|
|
8
|
-
combine_ranges(source.code, source.error_ranges).each do |range|
|
|
9
|
-
result.push(
|
|
10
|
-
range: range.to_hash,
|
|
11
|
-
severity: Diagnostics::Severities::ERROR,
|
|
12
|
-
source: 'Solargraph',
|
|
13
|
-
message: 'Syntax error'
|
|
14
|
-
)
|
|
15
|
-
end
|
|
16
|
-
result
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
# Combine an array of ranges by their starting lines.
|
|
22
|
-
#
|
|
23
|
-
# @param code [String]
|
|
24
|
-
# @param ranges [Array<Range>]
|
|
25
|
-
# @return [Array<Range>]
|
|
26
|
-
def combine_ranges code, ranges
|
|
27
|
-
result = []
|
|
28
|
-
lines = []
|
|
29
|
-
ranges.sort{|a, b| a.start.line <=> b.start.line}.each do |rng|
|
|
30
|
-
next if rng.nil? || lines.include?(rng.start.line)
|
|
31
|
-
lines.push rng.start.line
|
|
32
|
-
next if rng.start.line >= code.lines.length
|
|
33
|
-
scol = code.lines[rng.start.line].index(/[^\s]/) || 0
|
|
34
|
-
ecol = code.lines[rng.start.line].length
|
|
35
|
-
result.push Range.from_to(rng.start.line, scol, rng.start.line, ecol)
|
|
36
|
-
end
|
|
37
|
-
result
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Diagnostics
|
|
5
|
+
class UpdateErrors < Base
|
|
6
|
+
def diagnose source, api_map
|
|
7
|
+
result = []
|
|
8
|
+
combine_ranges(source.code, source.error_ranges).each do |range|
|
|
9
|
+
result.push(
|
|
10
|
+
range: range.to_hash,
|
|
11
|
+
severity: Diagnostics::Severities::ERROR,
|
|
12
|
+
source: 'Solargraph',
|
|
13
|
+
message: 'Syntax error'
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
result
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
# Combine an array of ranges by their starting lines.
|
|
22
|
+
#
|
|
23
|
+
# @param code [String]
|
|
24
|
+
# @param ranges [Array<Range>]
|
|
25
|
+
# @return [Array<Range>]
|
|
26
|
+
def combine_ranges code, ranges
|
|
27
|
+
result = []
|
|
28
|
+
lines = []
|
|
29
|
+
ranges.sort{|a, b| a.start.line <=> b.start.line}.each do |rng|
|
|
30
|
+
next if rng.nil? || lines.include?(rng.start.line)
|
|
31
|
+
lines.push rng.start.line
|
|
32
|
+
next if rng.start.line >= code.lines.length
|
|
33
|
+
scol = code.lines[rng.start.line].index(/[^\s]/) || 0
|
|
34
|
+
ecol = code.lines[rng.start.line].length
|
|
35
|
+
result.push Range.from_to(rng.start.line, scol, rng.start.line, ecol)
|
|
36
|
+
end
|
|
37
|
+
result
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
# The Diagnostics library provides reporters for analyzing problems in code
|
|
5
|
-
# and providing the results to language server clients.
|
|
6
|
-
#
|
|
7
|
-
module Diagnostics
|
|
8
|
-
autoload :Base, 'solargraph/diagnostics/base'
|
|
9
|
-
autoload :Severities, 'solargraph/diagnostics/severities'
|
|
10
|
-
autoload :Rubocop, 'solargraph/diagnostics/rubocop'
|
|
11
|
-
autoload :RubocopHelpers, 'solargraph/diagnostics/rubocop_helpers'
|
|
12
|
-
autoload :RequireNotFound, 'solargraph/diagnostics/require_not_found'
|
|
13
|
-
autoload :UpdateErrors, 'solargraph/diagnostics/update_errors'
|
|
14
|
-
autoload :TypeCheck, 'solargraph/diagnostics/type_check'
|
|
15
|
-
|
|
16
|
-
class << self
|
|
17
|
-
# Add a reporter with a name to identify it in .solargraph.yml files.
|
|
18
|
-
#
|
|
19
|
-
# @param name [String] The name
|
|
20
|
-
# @param klass [Class<Solargraph::Diagnostics::Base>] The class implementation
|
|
21
|
-
# @return [void]
|
|
22
|
-
def register name, klass
|
|
23
|
-
reporter_hash[name] = klass
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# Get an array of reporter names.
|
|
27
|
-
#
|
|
28
|
-
# @return [Array<String>]
|
|
29
|
-
def reporters
|
|
30
|
-
reporter_hash.keys - ['type_not_defined'] # @todo Hide type_not_defined for now
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Find a reporter by name.
|
|
34
|
-
#
|
|
35
|
-
# @param name [String] The name with which the reporter was registered
|
|
36
|
-
# @return [Class<Solargraph::Diagnostics::Base>]
|
|
37
|
-
def reporter name
|
|
38
|
-
reporter_hash[name]
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
private
|
|
42
|
-
|
|
43
|
-
# @return [Hash]
|
|
44
|
-
def reporter_hash
|
|
45
|
-
@reporter_hash ||= {}
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
register 'rubocop', Rubocop
|
|
50
|
-
register 'require_not_found', RequireNotFound
|
|
51
|
-
register 'typecheck', TypeCheck
|
|
52
|
-
register 'update_errors', UpdateErrors
|
|
53
|
-
register 'type_not_defined', TypeCheck # @todo Retained for backwards compatibility
|
|
54
|
-
end
|
|
55
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
# The Diagnostics library provides reporters for analyzing problems in code
|
|
5
|
+
# and providing the results to language server clients.
|
|
6
|
+
#
|
|
7
|
+
module Diagnostics
|
|
8
|
+
autoload :Base, 'solargraph/diagnostics/base'
|
|
9
|
+
autoload :Severities, 'solargraph/diagnostics/severities'
|
|
10
|
+
autoload :Rubocop, 'solargraph/diagnostics/rubocop'
|
|
11
|
+
autoload :RubocopHelpers, 'solargraph/diagnostics/rubocop_helpers'
|
|
12
|
+
autoload :RequireNotFound, 'solargraph/diagnostics/require_not_found'
|
|
13
|
+
autoload :UpdateErrors, 'solargraph/diagnostics/update_errors'
|
|
14
|
+
autoload :TypeCheck, 'solargraph/diagnostics/type_check'
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
# Add a reporter with a name to identify it in .solargraph.yml files.
|
|
18
|
+
#
|
|
19
|
+
# @param name [String] The name
|
|
20
|
+
# @param klass [Class<Solargraph::Diagnostics::Base>] The class implementation
|
|
21
|
+
# @return [void]
|
|
22
|
+
def register name, klass
|
|
23
|
+
reporter_hash[name] = klass
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Get an array of reporter names.
|
|
27
|
+
#
|
|
28
|
+
# @return [Array<String>]
|
|
29
|
+
def reporters
|
|
30
|
+
reporter_hash.keys - ['type_not_defined'] # @todo Hide type_not_defined for now
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Find a reporter by name.
|
|
34
|
+
#
|
|
35
|
+
# @param name [String] The name with which the reporter was registered
|
|
36
|
+
# @return [Class<Solargraph::Diagnostics::Base>]
|
|
37
|
+
def reporter name
|
|
38
|
+
reporter_hash[name]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
# @return [Hash]
|
|
44
|
+
def reporter_hash
|
|
45
|
+
@reporter_hash ||= {}
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
register 'rubocop', Rubocop
|
|
50
|
+
register 'require_not_found', RequireNotFound
|
|
51
|
+
register 'typecheck', TypeCheck
|
|
52
|
+
register 'update_errors', UpdateErrors
|
|
53
|
+
register 'type_not_defined', TypeCheck # @todo Retained for backwards compatibility
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'bundler'
|
|
4
|
-
require 'json'
|
|
5
|
-
require 'open3'
|
|
6
|
-
require 'shellwords'
|
|
7
|
-
require 'yard'
|
|
8
|
-
require 'fileutils'
|
|
9
|
-
|
|
10
|
-
module Solargraph
|
|
11
|
-
class Documentor
|
|
12
|
-
RDOC_GEMS = %w[
|
|
13
|
-
actioncable actionmailbox actionmailer actionpack actiontext actionview
|
|
14
|
-
activejob activemodel activerecord activestorage activesupport railties
|
|
15
|
-
]
|
|
16
|
-
|
|
17
|
-
def initialize directory, rebuild: false, out: File.new(File::NULL, 'w')
|
|
18
|
-
@directory = directory
|
|
19
|
-
@rebuild = rebuild
|
|
20
|
-
@out = out
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# @return [Boolean] True if all specs were found and documented.
|
|
24
|
-
def document
|
|
25
|
-
failures = 0
|
|
26
|
-
Documentor.specs_from_bundle(@directory).each_pair do |name, version|
|
|
27
|
-
yd = YARD::Registry.yardoc_file_for_gem(name, "= #{version}")
|
|
28
|
-
if !yd || @rebuild
|
|
29
|
-
FileUtils.safe_unlink File.join(YardMap::CoreDocs.cache_dir, 'gems', "#{name}-#{version}.ser")
|
|
30
|
-
@out.puts "Documenting #{name} #{version}"
|
|
31
|
-
`yard gems #{name} #{version} #{@rebuild ? '--rebuild' : ''}`
|
|
32
|
-
yd = YARD::Registry.yardoc_file_for_gem(name, "= #{version}")
|
|
33
|
-
# HACK: Ignore errors documenting bundler
|
|
34
|
-
if !yd && name != 'bundler'
|
|
35
|
-
@out.puts "#{name} #{version} YARD documentation failed"
|
|
36
|
-
failures += 1
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
if yd && RDOC_GEMS.include?(name)
|
|
40
|
-
cache = File.join(Solargraph::YardMap::CoreDocs.cache_dir, 'gems', "#{name}-#{version}", 'yardoc')
|
|
41
|
-
if !File.exist?(cache) || @rebuild
|
|
42
|
-
@out.puts "Caching custom documentation for #{name} #{version}"
|
|
43
|
-
spec = Gem::Specification.find_by_name(name, "= #{version}")
|
|
44
|
-
Solargraph::YardMap::RdocToYard.run(spec)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
if failures > 0
|
|
49
|
-
@out.puts "#{failures} gem#{failures == 1 ? '' : 's'} could not be documented. You might need to run `bundle install`."
|
|
50
|
-
end
|
|
51
|
-
failures == 0
|
|
52
|
-
rescue Solargraph::BundleNotFoundError => e
|
|
53
|
-
@out.puts "[#{e.class}] #{e.message}"
|
|
54
|
-
@out.puts "No bundled gems are available in #{@directory}"
|
|
55
|
-
false
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# @param directory [String]
|
|
59
|
-
# @return [Hash]
|
|
60
|
-
def self.specs_from_bundle directory
|
|
61
|
-
Solargraph.with_clean_env do
|
|
62
|
-
cmd = [
|
|
63
|
-
'ruby', '-e',
|
|
64
|
-
"require 'bundler'; require 'json'; Dir.chdir('#{directory}') { puts Bundler.definition.specs_for([:default]).map { |spec| [spec.name, spec.version] }.to_h.to_json }"
|
|
65
|
-
]
|
|
66
|
-
o, e, s = Open3.capture3(*cmd)
|
|
67
|
-
if s.success?
|
|
68
|
-
o && !o.empty? ? JSON.parse(o.split("\n").last) : {}
|
|
69
|
-
else
|
|
70
|
-
Solargraph.logger.warn e
|
|
71
|
-
raise BundleNotFoundError, "Failed to load gems from bundle at #{directory}"
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
require 'json'
|
|
5
|
+
require 'open3'
|
|
6
|
+
require 'shellwords'
|
|
7
|
+
require 'yard'
|
|
8
|
+
require 'fileutils'
|
|
9
|
+
|
|
10
|
+
module Solargraph
|
|
11
|
+
class Documentor
|
|
12
|
+
RDOC_GEMS = %w[
|
|
13
|
+
actioncable actionmailbox actionmailer actionpack actiontext actionview
|
|
14
|
+
activejob activemodel activerecord activestorage activesupport railties
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
def initialize directory, rebuild: false, out: File.new(File::NULL, 'w')
|
|
18
|
+
@directory = directory
|
|
19
|
+
@rebuild = rebuild
|
|
20
|
+
@out = out
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Boolean] True if all specs were found and documented.
|
|
24
|
+
def document
|
|
25
|
+
failures = 0
|
|
26
|
+
Documentor.specs_from_bundle(@directory).each_pair do |name, version|
|
|
27
|
+
yd = YARD::Registry.yardoc_file_for_gem(name, "= #{version}")
|
|
28
|
+
if !yd || @rebuild
|
|
29
|
+
FileUtils.safe_unlink File.join(YardMap::CoreDocs.cache_dir, 'gems', "#{name}-#{version}.ser")
|
|
30
|
+
@out.puts "Documenting #{name} #{version}"
|
|
31
|
+
`yard gems #{name} #{version} #{@rebuild ? '--rebuild' : ''}`
|
|
32
|
+
yd = YARD::Registry.yardoc_file_for_gem(name, "= #{version}")
|
|
33
|
+
# HACK: Ignore errors documenting bundler
|
|
34
|
+
if !yd && name != 'bundler'
|
|
35
|
+
@out.puts "#{name} #{version} YARD documentation failed"
|
|
36
|
+
failures += 1
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
if yd && RDOC_GEMS.include?(name)
|
|
40
|
+
cache = File.join(Solargraph::YardMap::CoreDocs.cache_dir, 'gems', "#{name}-#{version}", 'yardoc')
|
|
41
|
+
if !File.exist?(cache) || @rebuild
|
|
42
|
+
@out.puts "Caching custom documentation for #{name} #{version}"
|
|
43
|
+
spec = Gem::Specification.find_by_name(name, "= #{version}")
|
|
44
|
+
Solargraph::YardMap::RdocToYard.run(spec)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
if failures > 0
|
|
49
|
+
@out.puts "#{failures} gem#{failures == 1 ? '' : 's'} could not be documented. You might need to run `bundle install`."
|
|
50
|
+
end
|
|
51
|
+
failures == 0
|
|
52
|
+
rescue Solargraph::BundleNotFoundError => e
|
|
53
|
+
@out.puts "[#{e.class}] #{e.message}"
|
|
54
|
+
@out.puts "No bundled gems are available in #{@directory}"
|
|
55
|
+
false
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @param directory [String]
|
|
59
|
+
# @return [Hash]
|
|
60
|
+
def self.specs_from_bundle directory
|
|
61
|
+
Solargraph.with_clean_env do
|
|
62
|
+
cmd = [
|
|
63
|
+
'ruby', '-e',
|
|
64
|
+
"require 'bundler'; require 'json'; Dir.chdir('#{directory}') { puts Bundler.definition.specs_for([:default]).map { |spec| [spec.name, spec.version] }.to_h.to_json }"
|
|
65
|
+
]
|
|
66
|
+
o, e, s = Open3.capture3(*cmd)
|
|
67
|
+
if s.success?
|
|
68
|
+
o && !o.empty? ? JSON.parse(o.split("\n").last) : {}
|
|
69
|
+
else
|
|
70
|
+
Solargraph.logger.warn e
|
|
71
|
+
raise BundleNotFoundError, "Failed to load gems from bundle at #{directory}"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
data/lib/solargraph/environ.rb
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
# A collection of additional data, such as map pins and required paths, that
|
|
5
|
-
# can be added to an ApiMap.
|
|
6
|
-
#
|
|
7
|
-
# Conventions are used to add Environs.
|
|
8
|
-
#
|
|
9
|
-
class Environ
|
|
10
|
-
# @return [Array<String>]
|
|
11
|
-
attr_reader :requires
|
|
12
|
-
|
|
13
|
-
# @return [Array<String>]
|
|
14
|
-
attr_reader :domains
|
|
15
|
-
|
|
16
|
-
# @return [Array<Pin::Reference::Override>]
|
|
17
|
-
attr_reader :pins
|
|
18
|
-
|
|
19
|
-
# @param requires [Array<String>]
|
|
20
|
-
# @param domains [Array<String>]
|
|
21
|
-
# @param pins [Array<Pin::Base>]
|
|
22
|
-
def initialize requires: [], domains: [], pins: []
|
|
23
|
-
@requires = requires
|
|
24
|
-
@domains = domains
|
|
25
|
-
@pins = pins
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# @return [self]
|
|
29
|
-
def clear
|
|
30
|
-
domains.clear
|
|
31
|
-
requires.clear
|
|
32
|
-
pins.clear
|
|
33
|
-
self
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# @param other [Environ]
|
|
37
|
-
# @return [self]
|
|
38
|
-
def merge other
|
|
39
|
-
domains.concat other.domains
|
|
40
|
-
requires.concat other.requires
|
|
41
|
-
pins.concat other.pins
|
|
42
|
-
self
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
# A collection of additional data, such as map pins and required paths, that
|
|
5
|
+
# can be added to an ApiMap.
|
|
6
|
+
#
|
|
7
|
+
# Conventions are used to add Environs.
|
|
8
|
+
#
|
|
9
|
+
class Environ
|
|
10
|
+
# @return [Array<String>]
|
|
11
|
+
attr_reader :requires
|
|
12
|
+
|
|
13
|
+
# @return [Array<String>]
|
|
14
|
+
attr_reader :domains
|
|
15
|
+
|
|
16
|
+
# @return [Array<Pin::Reference::Override>]
|
|
17
|
+
attr_reader :pins
|
|
18
|
+
|
|
19
|
+
# @param requires [Array<String>]
|
|
20
|
+
# @param domains [Array<String>]
|
|
21
|
+
# @param pins [Array<Pin::Base>]
|
|
22
|
+
def initialize requires: [], domains: [], pins: []
|
|
23
|
+
@requires = requires
|
|
24
|
+
@domains = domains
|
|
25
|
+
@pins = pins
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [self]
|
|
29
|
+
def clear
|
|
30
|
+
domains.clear
|
|
31
|
+
requires.clear
|
|
32
|
+
pins.clear
|
|
33
|
+
self
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param other [Environ]
|
|
37
|
+
# @return [self]
|
|
38
|
+
def merge other
|
|
39
|
+
domains.concat other.domains
|
|
40
|
+
requires.concat other.requires
|
|
41
|
+
pins.concat other.pins
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
# The CompletionItemKind constants for the language server protocol.
|
|
6
|
-
#
|
|
7
|
-
module CompletionItemKinds
|
|
8
|
-
TEXT = 1
|
|
9
|
-
METHOD = 2
|
|
10
|
-
FUNCTION = 3
|
|
11
|
-
CONSTRUCTOR = 4
|
|
12
|
-
FIELD = 5
|
|
13
|
-
VARIABLE = 6
|
|
14
|
-
CLASS = 7
|
|
15
|
-
INTERFACE = 8
|
|
16
|
-
MODULE = 9
|
|
17
|
-
PROPERTY = 10
|
|
18
|
-
UNIT = 11
|
|
19
|
-
VALUE = 12
|
|
20
|
-
ENUM = 13
|
|
21
|
-
KEYWORD = 14
|
|
22
|
-
SNIPPET = 15
|
|
23
|
-
COLOR = 16
|
|
24
|
-
FILE = 17
|
|
25
|
-
REFERENCE = 18
|
|
26
|
-
FOLDER = 19
|
|
27
|
-
ENUM_MEMBER = 20
|
|
28
|
-
CONSTANT = 21
|
|
29
|
-
STRUCT = 22
|
|
30
|
-
EVENT = 23
|
|
31
|
-
OPERATOR = 24
|
|
32
|
-
TYPE_PARAMETER = 25
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
# The CompletionItemKind constants for the language server protocol.
|
|
6
|
+
#
|
|
7
|
+
module CompletionItemKinds
|
|
8
|
+
TEXT = 1
|
|
9
|
+
METHOD = 2
|
|
10
|
+
FUNCTION = 3
|
|
11
|
+
CONSTRUCTOR = 4
|
|
12
|
+
FIELD = 5
|
|
13
|
+
VARIABLE = 6
|
|
14
|
+
CLASS = 7
|
|
15
|
+
INTERFACE = 8
|
|
16
|
+
MODULE = 9
|
|
17
|
+
PROPERTY = 10
|
|
18
|
+
UNIT = 11
|
|
19
|
+
VALUE = 12
|
|
20
|
+
ENUM = 13
|
|
21
|
+
KEYWORD = 14
|
|
22
|
+
SNIPPET = 15
|
|
23
|
+
COLOR = 16
|
|
24
|
+
FILE = 17
|
|
25
|
+
REFERENCE = 18
|
|
26
|
+
FOLDER = 19
|
|
27
|
+
ENUM_MEMBER = 20
|
|
28
|
+
CONSTANT = 21
|
|
29
|
+
STRUCT = 22
|
|
30
|
+
EVENT = 23
|
|
31
|
+
OPERATOR = 24
|
|
32
|
+
TYPE_PARAMETER = 25
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|