ruby-lsp 0.0.1 → 0.0.4

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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +7 -16
  3. data/.github/pull_request_template.md +15 -0
  4. data/.github/workflows/ci.yml +31 -0
  5. data/.github/workflows/publish_docs.yml +32 -0
  6. data/.gitignore +9 -12
  7. data/.rubocop.yml +20 -2
  8. data/.vscode/settings.json +5 -0
  9. data/CHANGELOG.md +29 -0
  10. data/Gemfile +8 -4
  11. data/Gemfile.lock +76 -14
  12. data/README.md +69 -2
  13. data/Rakefile +5 -0
  14. data/VERSION +1 -1
  15. data/bin/tapioca +29 -0
  16. data/bin/test +7 -1
  17. data/dev.yml +7 -7
  18. data/exe/ruby-lsp +19 -2
  19. data/lib/internal.rb +7 -0
  20. data/lib/ruby-lsp.rb +4 -1
  21. data/lib/ruby_lsp/cli.rb +88 -0
  22. data/lib/ruby_lsp/document.rb +113 -0
  23. data/lib/ruby_lsp/handler.rb +236 -0
  24. data/lib/ruby_lsp/requests/base_request.rb +33 -0
  25. data/lib/ruby_lsp/requests/code_actions.rb +37 -0
  26. data/lib/ruby_lsp/requests/diagnostics.rb +37 -0
  27. data/lib/ruby_lsp/requests/document_highlight.rb +96 -0
  28. data/lib/ruby_lsp/requests/document_symbol.rb +216 -0
  29. data/lib/ruby_lsp/requests/folding_ranges.rb +213 -0
  30. data/lib/ruby_lsp/requests/formatting.rb +52 -0
  31. data/lib/ruby_lsp/requests/rubocop_request.rb +50 -0
  32. data/lib/ruby_lsp/requests/selection_ranges.rb +103 -0
  33. data/lib/ruby_lsp/requests/semantic_highlighting.rb +112 -0
  34. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +88 -0
  35. data/lib/ruby_lsp/requests/support/selection_range.rb +17 -0
  36. data/lib/ruby_lsp/requests/support/semantic_token_encoder.rb +60 -0
  37. data/lib/ruby_lsp/requests/support/syntax_error_diagnostic.rb +27 -0
  38. data/lib/ruby_lsp/requests.rb +24 -0
  39. data/lib/ruby_lsp/store.rb +59 -0
  40. data/rakelib/check_docs.rake +56 -0
  41. data/ruby-lsp.gemspec +5 -1
  42. data/{shipit.yml → shipit.production.yml} +0 -0
  43. data/sorbet/config +4 -0
  44. data/sorbet/rbi/.rubocop.yml +8 -0
  45. data/sorbet/rbi/gems/ansi@1.5.0.rbi +338 -0
  46. data/sorbet/rbi/gems/ast@2.4.2.rbi +522 -0
  47. data/sorbet/rbi/gems/builder@3.2.4.rbi +418 -0
  48. data/sorbet/rbi/gems/coderay@1.1.3.rbi +8 -0
  49. data/sorbet/rbi/gems/debug@1.5.0.rbi +1273 -0
  50. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +867 -0
  51. data/sorbet/rbi/gems/io-console@0.5.11.rbi +8 -0
  52. data/sorbet/rbi/gems/irb@1.4.1.rbi +376 -0
  53. data/sorbet/rbi/gems/language_server-protocol@3.16.0.3.rbi +7325 -0
  54. data/sorbet/rbi/gems/method_source@1.0.0.rbi +8 -0
  55. data/sorbet/rbi/gems/minitest-reporters@1.5.0.rbi +612 -0
  56. data/sorbet/rbi/gems/minitest@5.15.0.rbi +994 -0
  57. data/sorbet/rbi/gems/parallel@1.22.1.rbi +163 -0
  58. data/sorbet/rbi/gems/parser@3.1.2.0.rbi +3968 -0
  59. data/sorbet/rbi/gems/prettier_print@0.1.0.rbi +734 -0
  60. data/sorbet/rbi/gems/pry@0.14.1.rbi +8 -0
  61. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +227 -0
  62. data/sorbet/rbi/gems/rake@13.0.6.rbi +1853 -0
  63. data/sorbet/rbi/gems/rbi@0.0.14.rbi +2337 -0
  64. data/sorbet/rbi/gems/regexp_parser@2.5.0.rbi +1854 -0
  65. data/sorbet/rbi/gems/reline@0.3.1.rbi +1274 -0
  66. data/sorbet/rbi/gems/rexml@3.2.5.rbi +3852 -0
  67. data/sorbet/rbi/gems/rubocop-ast@1.18.0.rbi +4180 -0
  68. data/sorbet/rbi/gems/rubocop-minitest@0.20.0.rbi +1369 -0
  69. data/sorbet/rbi/gems/rubocop-rake@0.6.0.rbi +246 -0
  70. data/sorbet/rbi/gems/rubocop-shopify@2.6.0.rbi +8 -0
  71. data/sorbet/rbi/gems/rubocop-sorbet@0.6.8.rbi +652 -0
  72. data/sorbet/rbi/gems/rubocop@1.30.0.rbi +36729 -0
  73. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +732 -0
  74. data/sorbet/rbi/gems/spoom@1.1.11.rbi +1600 -0
  75. data/sorbet/rbi/gems/syntax_tree@2.7.1.rbi +6777 -0
  76. data/sorbet/rbi/gems/tapioca@0.8.1.rbi +1972 -0
  77. data/sorbet/rbi/gems/thor@1.2.1.rbi +2921 -0
  78. data/sorbet/rbi/gems/unicode-display_width@2.1.0.rbi +27 -0
  79. data/sorbet/rbi/gems/unparser@0.6.5.rbi +2789 -0
  80. data/sorbet/rbi/gems/webrick@1.7.0.rbi +1779 -0
  81. data/sorbet/rbi/gems/yard-sorbet@0.6.1.rbi +289 -0
  82. data/sorbet/rbi/gems/yard@0.9.27.rbi +13048 -0
  83. data/sorbet/rbi/shims/fiddle.rbi +4 -0
  84. data/sorbet/rbi/shims/hash.rbi +6 -0
  85. data/sorbet/rbi/shims/rdoc.rbi +4 -0
  86. data/sorbet/tapioca/config.yml +13 -0
  87. data/sorbet/tapioca/require.rb +7 -0
  88. metadata +119 -9
  89. data/.vscode/launch.json +0 -19
  90. data/bin/package_extension +0 -5
  91. data/bin/style +0 -10
  92. data/lib/ruby/lsp/cli.rb +0 -37
  93. data/lib/ruby/lsp.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cacbd0ac625037e2671811471792d7f4557bfd71e8ee1259c306ecd81b71974b
4
- data.tar.gz: 58442bd37eaf5954d486556bc0a2a94a093471627791e55c66701fcad3a7ebd4
3
+ metadata.gz: ab0e94532c080cf6e443c95d9ca7ccb16f548ec45768dc58e95fd691c907a965
4
+ data.tar.gz: 856df7b413ef111e100ee42da541856843d966184f9dbe1dfe2ee5a50da1e802
5
5
  SHA512:
6
- metadata.gz: bb55d15c4be207b39516891c9e0fc3f82e1412e57e9712932e3c73b354a7b95cf35f3df15990a097d146b849ab3309490236f8ad72b2a678fb142a99a3246372
7
- data.tar.gz: 86269ca803e98331eec3e432f75049ffdf9250439b675a1e3bf335e4ce429f7fdb20ca67a6b0daff2afda8f6a69dbfded2178c9e2e5ed687b000d0ca82b7e08c
6
+ metadata.gz: fde4cd9c5e556ff926b22d316d1bfcc5d31c089850d4558ac7d954fe33df4c8d2b8f8c14e55d1dcc2898087d0d29e8b12fc2f768e2b14935fa727f9620ff5c9e
7
+ data.tar.gz: 24fb12213f36edcee13fe65d53a94977737b251566d2503dc857dc276192d6f570f93147f57fc5e3b23c8d90b2c1f96f4cc7e308d5b969a02705d39444676f95
@@ -1,20 +1,11 @@
1
1
  version: 2
2
- registries:
3
- rubygems-server-pkgs-shopify-io:
4
- type: rubygems-server
5
- url: https://pkgs.shopify.io
6
- username: ${{secrets.RUBYGEMS_SERVER_PKGS_SHOPIFY_IO_USERNAME}}
7
- password: ${{secrets.RUBYGEMS_SERVER_PKGS_SHOPIFY_IO_PASSWORD}}
8
- github-com:
9
- type: git
10
- url: https://github.com
11
- username: ${{secrets.DEPENDENCIES_GITHUB_USER}}
12
- password: ${{secrets.DEPENDENCIES_GITHUB_TOKEN}}
13
2
  updates:
14
- - package-ecosystem: bundler
3
+ - package-ecosystem: "bundler"
15
4
  directory: "/"
16
5
  schedule:
17
- interval: daily
18
- open-pull-requests-limit: 100
19
- insecure-external-code-execution: allow
20
- registries: '*'
6
+ interval: "weekly"
7
+ reviewers:
8
+ - "Shopify/sorbet"
9
+ labels:
10
+ - "dependencies"
11
+ - "ruby"
@@ -0,0 +1,15 @@
1
+ ### Motivation
2
+
3
+ <!-- Explain why you are making this change. Include links to issues or describe the problem being solved, not the solution. -->
4
+
5
+ ### Implementation
6
+
7
+ <!-- How did you implement your changes? Explain your solution, design decisions, things reviewers should watch out for. -->
8
+
9
+ ### Automated Tests
10
+
11
+ <!-- We hope you added unit tests as part of your changes, just state that you have. If you haven't, state why. -->
12
+
13
+ ### Manual Tests
14
+
15
+ <!-- Explain how we can test these changes in our own instance of VS Code. Provide the step by step instructions. -->
@@ -0,0 +1,31 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ fail-fast: false
10
+ matrix:
11
+ ruby: [ "2.7", "3.0", "3.1" ]
12
+ name: Ruby ${{ matrix.ruby }}
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - name: Set up Ruby
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ ruby-version: ${{ matrix.ruby }}
19
+ bundler-cache: true
20
+
21
+ - name: Check if documentation is up to date
22
+ run: bundle exec rake check_docs
23
+
24
+ - name: Typecheck
25
+ run: bundle exec srb tc
26
+
27
+ - name: Lint Ruby files
28
+ run: bin/rubocop
29
+
30
+ - name: Run tests
31
+ run: bin/test
@@ -0,0 +1,32 @@
1
+ name: Publish docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+ name: Publish documentation website
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+
14
+ - name: Set up Ruby
15
+ uses: ruby/setup-ruby@v1
16
+ with:
17
+ ruby-version: 3.1.1
18
+ bundler-cache: true
19
+
20
+ - name: Configure git
21
+ run: |
22
+ git config user.name github-actions
23
+ git config user.email github-actions@github.com
24
+
25
+ - name: Generate documentation
26
+ run: bundle exec rake yard
27
+
28
+ - name: Commit to gh-pages
29
+ run: |
30
+ git add docs
31
+ git commit -m "Publish website $(git log --format=format:%h -1)"
32
+ git push --force origin main:gh-pages
data/.gitignore CHANGED
@@ -1,12 +1,9 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
9
- /.dev/
10
- /**/node_modules/
11
- /**/out/
12
- /**/*.vsix
1
+ /**/.bundle/
2
+ /**/.yardoc
3
+ /**/_yardoc/
4
+ /**/coverage/
5
+ /**/doc/
6
+ /**/pkg/
7
+ /**/spec/reports/
8
+ /**/tmp/
9
+ /**/.dev/
data/.rubocop.yml CHANGED
@@ -1,12 +1,30 @@
1
1
  inherit_gem:
2
2
  rubocop-shopify: rubocop.yml
3
3
 
4
+ require:
5
+ - rubocop-sorbet
6
+ - rubocop-minitest
7
+ - rubocop-rake
8
+
4
9
  AllCops:
5
- TargetRubyVersion: 3.1
10
+ NewCops: disable
11
+ SuggestExtensions: false
12
+ TargetRubyVersion: 2.7
6
13
  Exclude:
7
14
  - "vendor/**/*"
8
15
  - "features/**/*"
16
+ - "test/fixtures/**/*"
9
17
 
10
18
  Naming/FileName:
11
19
  Exclude:
12
- - "lib/ruby-lsp.rb"
20
+ - "lib/ruby-lsp.rb"
21
+
22
+ Sorbet/FalseSigil:
23
+ Enabled: false
24
+
25
+ Sorbet/TrueSigil:
26
+ Enabled: true
27
+ Include:
28
+ - "**/*.rb"
29
+ Exclude:
30
+ - "**/*.rake"
@@ -0,0 +1,5 @@
1
+ {
2
+ // Set this value to `verbose` to see the full JSON content of LSP requests and responses
3
+ "ruby lsp.trace.server": "messages",
4
+ "editor.defaultFormatter": "Shopify.ruby-lsp",
5
+ }
data/CHANGELOG.md ADDED
@@ -0,0 +1,29 @@
1
+ # Change Log
2
+
3
+ All notable changes to the "ruby-lsp" extension will be documented in this file.
4
+
5
+ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.0.4]
10
+
11
+ - Add basic document highlight (https://github.com/Shopify/ruby-lsp/pull/91)
12
+ - Add error telemetry (https://github.com/Shopify/ruby-lsp/pull/100)
13
+ - Always push telemetry events from the server (https://github.com/Shopify/ruby-lsp/pull/109)
14
+ - Fix multibyte character handling (https://github.com/Shopify/ruby-lsp/pull/122)
15
+ - Add Sorbet to the Ruby LSP (https://github.com/Shopify/ruby-lsp/pull/119, https://github.com/Shopify/ruby-lsp/pull/123)
16
+
17
+ ## [0.0.3]
18
+
19
+ - Fixed code actions return hanging
20
+ - Moved to incremental text synchronization
21
+ - Added syntax error resiliency
22
+
23
+ ## [0.0.2]
24
+
25
+ - Alpha release including
26
+ - RuboCop formatting, diagnostics and quick fixes
27
+ - Folding ranges
28
+ - Initial semantic highlighting
29
+ - Document symbols
data/Gemfile CHANGED
@@ -4,10 +4,14 @@ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
+ gem "debug", "~> 1.5", require: false
7
8
  gem "minitest", "~> 5.15"
8
9
  gem "minitest-reporters", "~> 1.5"
9
10
  gem "rake", "~> 13.0"
10
- gem "rubocop", "~> 1.25"
11
- gem "rubocop-shopify", "~> 2.4"
12
- gem "rubocop-minitest", "~> 0.17.2"
13
- gem "rubocop-rake", "~> 0.6.0"
11
+ gem "rubocop-shopify", "~> 2.7", require: false
12
+ gem "rubocop-minitest", "~> 0.20.0", require: false
13
+ gem "rubocop-rake", "~> 0.6.0", require: false
14
+ gem "rubocop-sorbet", "~> 0.6", require: false
15
+ gem "sorbet-static-and-runtime"
16
+ gem "tapioca", "~> 0.8", require: false
17
+ gem "yard", "~> 0.9", require: false
data/Gemfile.lock CHANGED
@@ -1,8 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-lsp (0.0.1)
4
+ ruby-lsp (0.0.4)
5
5
  language_server-protocol
6
+ rubocop (>= 1.0)
7
+ sorbet-runtime
8
+ syntax_tree (>= 2.3)
6
9
 
7
10
  GEM
8
11
  remote: https://rubygems.org/
@@ -10,53 +13,112 @@ GEM
10
13
  ansi (1.5.0)
11
14
  ast (2.4.2)
12
15
  builder (3.2.4)
16
+ coderay (1.1.3)
17
+ debug (1.5.0)
18
+ irb (>= 1.3.6)
19
+ reline (>= 0.2.7)
20
+ diff-lcs (1.5.0)
21
+ io-console (0.5.11)
22
+ irb (1.4.1)
23
+ reline (>= 0.3.0)
13
24
  language_server-protocol (3.16.0.3)
25
+ method_source (1.0.0)
14
26
  minitest (5.15.0)
15
27
  minitest-reporters (1.5.0)
16
28
  ansi
17
29
  builder
18
30
  minitest (>= 5.0)
19
31
  ruby-progressbar
20
- parallel (1.21.0)
21
- parser (3.1.1.0)
32
+ parallel (1.22.1)
33
+ parser (3.1.2.0)
22
34
  ast (~> 2.4.1)
35
+ prettier_print (0.1.0)
36
+ pry (0.14.1)
37
+ coderay (~> 1.1)
38
+ method_source (~> 1.0)
23
39
  rainbow (3.1.1)
24
40
  rake (13.0.6)
25
- regexp_parser (2.2.1)
41
+ rbi (0.0.14)
42
+ ast
43
+ parser (>= 2.6.4.0)
44
+ sorbet-runtime (>= 0.5.9204)
45
+ unparser
46
+ regexp_parser (2.5.0)
47
+ reline (0.3.1)
48
+ io-console (~> 0.5)
26
49
  rexml (3.2.5)
27
- rubocop (1.25.1)
50
+ rubocop (1.30.0)
28
51
  parallel (~> 1.10)
29
52
  parser (>= 3.1.0.0)
30
53
  rainbow (>= 2.2.2, < 4.0)
31
54
  regexp_parser (>= 1.8, < 3.0)
32
- rexml
33
- rubocop-ast (>= 1.15.1, < 2.0)
55
+ rexml (>= 3.2.5, < 4.0)
56
+ rubocop-ast (>= 1.18.0, < 2.0)
34
57
  ruby-progressbar (~> 1.7)
35
58
  unicode-display_width (>= 1.4.0, < 3.0)
36
- rubocop-ast (1.16.0)
59
+ rubocop-ast (1.18.0)
37
60
  parser (>= 3.1.1.0)
38
- rubocop-minitest (0.17.2)
61
+ rubocop-minitest (0.20.0)
39
62
  rubocop (>= 0.90, < 2.0)
40
63
  rubocop-rake (0.6.0)
41
64
  rubocop (~> 1.0)
42
- rubocop-shopify (2.4.0)
43
- rubocop (~> 1.24)
65
+ rubocop-shopify (2.7.0)
66
+ rubocop (~> 1.30)
67
+ rubocop-sorbet (0.6.8)
68
+ rubocop (>= 0.90.0)
44
69
  ruby-progressbar (1.11.0)
70
+ sorbet (0.5.10073)
71
+ sorbet-static (= 0.5.10073)
72
+ sorbet-runtime (0.5.10073)
73
+ sorbet-static (0.5.10073-universal-darwin-21)
74
+ sorbet-static (0.5.10073-x86_64-linux)
75
+ sorbet-static-and-runtime (0.5.10073)
76
+ sorbet (= 0.5.10073)
77
+ sorbet-runtime (= 0.5.10073)
78
+ spoom (1.1.11)
79
+ sorbet (>= 0.5.9204)
80
+ sorbet-runtime (>= 0.5.9204)
81
+ thor (>= 0.19.2)
82
+ syntax_tree (2.7.1)
83
+ prettier_print
84
+ tapioca (0.8.1)
85
+ bundler (>= 1.17.3)
86
+ parallel (>= 1.21.0)
87
+ pry (>= 0.12.2)
88
+ rbi (~> 0.0.0, >= 0.0.14)
89
+ sorbet-static-and-runtime (>= 0.5.9204)
90
+ spoom (~> 1.1.0, >= 1.1.11)
91
+ thor (>= 1.2.0)
92
+ yard-sorbet
93
+ thor (1.2.1)
45
94
  unicode-display_width (2.1.0)
95
+ unparser (0.6.5)
96
+ diff-lcs (~> 1.3)
97
+ parser (>= 3.1.0)
98
+ webrick (1.7.0)
99
+ yard (0.9.28)
100
+ webrick (~> 1.7.0)
101
+ yard-sorbet (0.6.1)
102
+ sorbet-runtime (>= 0.5)
103
+ yard (>= 0.9)
46
104
 
47
105
  PLATFORMS
48
106
  arm64-darwin-21
49
107
  x86_64-linux
50
108
 
51
109
  DEPENDENCIES
110
+ debug (~> 1.5)
52
111
  minitest (~> 5.15)
53
112
  minitest-reporters (~> 1.5)
54
113
  rake (~> 13.0)
55
- rubocop (~> 1.25)
56
- rubocop-minitest (~> 0.17.2)
114
+ rubocop-minitest (~> 0.20.0)
57
115
  rubocop-rake (~> 0.6.0)
58
- rubocop-shopify (~> 2.4)
116
+ rubocop-shopify (~> 2.7)
117
+ rubocop-sorbet (~> 0.6)
59
118
  ruby-lsp!
119
+ sorbet-static-and-runtime
120
+ tapioca (~> 0.8)
121
+ yard (~> 0.9)
60
122
 
61
123
  BUNDLED WITH
62
124
  2.3.7
data/README.md CHANGED
@@ -1,6 +1,23 @@
1
- # ruby-lsp
1
+ ![Build Status](https://github.com/Shopify/ruby-lsp/workflows/CI/badge.svg)
2
2
 
3
- Future home of monorepo for `ruby-lsp` Gem and VSCode extension
3
+ # Ruby LSP
4
+
5
+ This gem is an implementation of the language server protocol specification for Ruby, used to improve editor features.
6
+
7
+ ## Usage
8
+
9
+ Install the gem. There's no need to require it, since the server is used as a standalone executable.
10
+
11
+ ```ruby
12
+ group :development do
13
+ gem "ruby-lsp", require: false
14
+ end
15
+ ```
16
+
17
+ If using VS Code, install the [Ruby LSP plugin](https://github.com/Shopify/vscode-ruby-lsp) to get the extra features in
18
+ the editor.
19
+
20
+ See the [documentation](https://shopify.github.io/ruby-lsp) for supported features.
4
21
 
5
22
  ## Contributing
6
23
 
@@ -10,6 +27,56 @@ are expected to adhere to the
10
27
  [Contributor Covenant](https://github.com/Shopify/ruby-lsp/blob/main/CODE_OF_CONDUCT.md)
11
28
  code of conduct.
12
29
 
30
+ ### Expectation testing
31
+
32
+ To simplify the way we run tests over different pieces of Ruby code, we use a custom expectations test framework against a set of Ruby fixtures.
33
+
34
+ To add a new fixture to the expectations test suite:
35
+
36
+ 1. Add a new fixture `my_fixture.rb` file under `test/fixtures`
37
+ 2. (optional) Add new expectations under `test/expectations/$HANDLER` for the request handlers you're concerned by
38
+ 3. Profit by running `bin/test test/requests/$HANDLER_expectations_test my_fixture`
39
+ * Handlers for which you added expectations will be checked with `assert_expectations`
40
+ * Handlers without expectations will be ran against your new test to check that nothing breaks
41
+
42
+ To add a new expectations test runner for a new request handler:
43
+
44
+ 1. Add a new file under `test/requests/$HANDLER_expectations_test.rb` that subclasses `ExpectationsTestRunner` and calls `expectations_tests $HANDLER, "$EXPECTATIONS_DIR"` where: `$HANDLER` is the fully qualified name or your handler class and `$EXPECTATIONS_DIR` is the directory name where you want to store the expectation files.
45
+
46
+ ```rb
47
+ # frozen_string_literal: true
48
+
49
+ require "test_helper"
50
+ require "expectations/expectations_test_runner"
51
+
52
+ class $HANDLERExpectationsTest < ExpectationsTestRunner
53
+ expectations_tests RubyLsp::Requests::$HANDLER, "$EXPECTATIONS_DIR"
54
+ end
55
+ ```
56
+
57
+ 2. (optional) Override the `run_expectations` and `assert_expectations` methods if needed. See the different request handler expectations runners under `test/requests/*_expectations_test.rb` for examples.
58
+
59
+ 4. (optional) Add new fixtures for your handler under `test/fixtures`
60
+
61
+ 5. (optional) Add new expectations under `test/expectations/$HANDLER`
62
+ * No need to write the expectations by hand, just run the test with an empty expectation file and copy from the output.
63
+
64
+ 7. Profit by running, `bin/test test/expectations_test $HANDLER`
65
+ * Tests with expectations will be checked with `assert_expectations`
66
+ * Tests without expectations will be ran against your new $HANDLER to check that nothing breaks
67
+
68
+ ## Debugging
69
+
70
+ ### Tracing LSP requests and responses
71
+
72
+ LSP server tracing can be controlled through the `ruby lsp.trace.server` config key in the `.vscode/settings.json` config file.
73
+
74
+ Possible values are:
75
+
76
+ * `off`: no tracing
77
+ * `messages`: display requests and responses notifications
78
+ * `verbose`: display each request and response as JSON
79
+
13
80
  ## License
14
81
 
15
82
  The gem is available as open source under the terms of the
data/Rakefile CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "bundler/gem_tasks"
4
4
  require "rake/testtask"
5
+ require "yard"
5
6
 
6
7
  Rake::TestTask.new(:test) do |t|
7
8
  t.libs << "test"
@@ -9,6 +10,10 @@ Rake::TestTask.new(:test) do |t|
9
10
  t.test_files = FileList["test/**/*_test.rb"]
10
11
  end
11
12
 
13
+ YARD::Rake::YardocTask.new do |t|
14
+ t.options = ["--markup", "markdown", "--output-dir", "docs"]
15
+ end
16
+
12
17
  require "rubocop/rake_task"
13
18
 
14
19
  RuboCop::RakeTask.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.4
data/bin/tapioca ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'tapioca' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("tapioca", "tapioca")
data/bin/test CHANGED
@@ -1,3 +1,9 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
- bundle exec rake "$@"
3
+ if [[ 2 -eq $# ]]; then
4
+ bundle exec rake TEST="$1" TESTOPTS="-n='/$2/'"
5
+ elif [[ 1 -eq $# ]]; then
6
+ bundle exec rake TEST="$1"
7
+ else
8
+ bundle exec rake "$@"
9
+ fi
data/dev.yml CHANGED
@@ -4,15 +4,15 @@ type: ruby
4
4
 
5
5
  up:
6
6
  - ruby: 3.1.1
7
- - bundler
8
- - node:
9
- yarn: 1.22.17
10
- version: v16.14.0
11
- packages: ["./features/vscode_extension"]
7
+ - bundler:
8
+ gemfile: Gemfile
12
9
 
13
10
  commands:
14
- style: bin/style
15
- extension: bin/package_extension
11
+ server: exe/ruby-lsp
12
+ style: bin/rubocop
13
+ typecheck:
14
+ aliases: ["tc"]
15
+ run: "bundle exec srb tc"
16
16
  test:
17
17
  syntax:
18
18
  argument: file
data/exe/ruby-lsp CHANGED
@@ -1,6 +1,23 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require_relative "../lib/ruby/lsp"
4
+ require "sorbet-runtime"
5
5
 
6
- Ruby::Lsp::Cli.start(ARGV)
6
+ begin
7
+ T::Configuration.default_checked_level = :never
8
+ # Suppresses call validation errors
9
+ T::Configuration.call_validation_error_handler = ->(*) {}
10
+ # Suppresses errors caused by T.cast, T.let, T.must, etc.
11
+ T::Configuration.inline_type_error_handler = ->(*) {}
12
+ # Suppresses errors caused by incorrect parameter ordering
13
+ T::Configuration.sig_validation_error_handler = ->(*) {}
14
+ rescue
15
+ # Need this rescue so that if another gem has
16
+ # already set the checked level by the time we
17
+ # get to it, we don't fail outright.
18
+ nil
19
+ end
20
+
21
+ require_relative "../lib/internal"
22
+
23
+ RubyLsp::Cli.start
data/lib/internal.rb ADDED
@@ -0,0 +1,7 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "syntax_tree"
6
+ require "ruby-lsp"
7
+ require "ruby_lsp/cli"
data/lib/ruby-lsp.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
- require_relative "./ruby/lsp"
4
+ module RubyLsp
5
+ VERSION = File.read(File.expand_path("../VERSION", __dir__)).strip
6
+ end
@@ -0,0 +1,88 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "language_server-protocol"
5
+
6
+ require_relative "handler"
7
+
8
+ module RubyLsp
9
+ module Cli
10
+ extend T::Sig
11
+
12
+ sig { void }
13
+ def self.start
14
+ handler = RubyLsp::Handler.new
15
+
16
+ handler.config do
17
+ on("initialize") do |request|
18
+ store.clear
19
+ initialization_options = request.dig(:params, :initializationOptions)
20
+
21
+ respond_with_capabilities(initialization_options.fetch(:enabledFeatures, []))
22
+ end
23
+
24
+ on("textDocument/didChange") do |request|
25
+ uri = request.dig(:params, :textDocument, :uri)
26
+ store.push_edits(uri, request.dig(:params, :contentChanges))
27
+
28
+ send_diagnostics(uri)
29
+ RubyLsp::Handler::VOID
30
+ end
31
+
32
+ on("textDocument/didOpen") do |request|
33
+ uri = request.dig(:params, :textDocument, :uri)
34
+ text = request.dig(:params, :textDocument, :text)
35
+ store.set(uri, text)
36
+
37
+ send_diagnostics(uri)
38
+ RubyLsp::Handler::VOID
39
+ end
40
+
41
+ on("textDocument/didClose") do |request|
42
+ uri = request.dig(:params, :textDocument, :uri)
43
+ store.delete(uri)
44
+
45
+ RubyLsp::Handler::VOID
46
+ end
47
+
48
+ on("textDocument/documentSymbol") do |request|
49
+ respond_with_document_symbol(request.dig(:params, :textDocument, :uri))
50
+ end
51
+
52
+ on("textDocument/foldingRange") do |request|
53
+ respond_with_folding_ranges(request.dig(:params, :textDocument, :uri))
54
+ end
55
+
56
+ on("textDocument/selectionRange") do |request|
57
+ respond_with_selection_ranges(
58
+ request.dig(:params, :textDocument, :uri),
59
+ request.dig(:params, :positions),
60
+ )
61
+ end
62
+
63
+ on("textDocument/semanticTokens/full") do |request|
64
+ respond_with_semantic_highlighting(request.dig(:params, :textDocument, :uri))
65
+ end
66
+
67
+ on("textDocument/formatting") do |request|
68
+ respond_with_formatting(request.dig(:params, :textDocument, :uri))
69
+ end
70
+
71
+ on("textDocument/documentHighlight") do |request|
72
+ respond_with_document_highlight(request.dig(:params, :textDocument, :uri), request.dig(:params, :position))
73
+ end
74
+
75
+ on("textDocument/codeAction") do |request|
76
+ range = request.dig(:params, :range)
77
+ start_line = range.dig(:start, :line)
78
+ end_line = range.dig(:end, :line)
79
+ respond_with_code_actions(request.dig(:params, :textDocument, :uri), (start_line..end_line))
80
+ end
81
+
82
+ on("shutdown") { shutdown }
83
+ end
84
+
85
+ handler.start
86
+ end
87
+ end
88
+ end