Skip to content

Commit ea412df

Browse files
committed
Create RBSDocument
1 parent 760779f commit ea412df

File tree

6 files changed

+87
-3
lines changed

6 files changed

+87
-3
lines changed

lib/ruby_lsp/document.rb

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class LanguageId < T::Enum
77
enums do
88
Ruby = new("ruby")
99
ERB = new("erb")
10+
RBS = new("rbs")
1011
end
1112
end
1213

lib/ruby_lsp/internal.rb

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
require "ruby_lsp/document"
3737
require "ruby_lsp/ruby_document"
3838
require "ruby_lsp/erb_document"
39+
require "ruby_lsp/rbs_document"
3940
require "ruby_lsp/store"
4041
require "ruby_lsp/addon"
4142
require "ruby_lsp/requests/support/rubocop_runner"

lib/ruby_lsp/rbs_document.rb

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# typed: strict
2+
# frozen_string_literal: true
3+
4+
module RubyLsp
5+
class RBSDocument < Document
6+
extend T::Sig
7+
extend T::Generic
8+
9+
ParseResultType = type_member { { fixed: T::Array[RBS::AST::Declarations::Base] } }
10+
11+
sig { params(source: String, version: Integer, uri: URI::Generic, encoding: Encoding).void }
12+
def initialize(source:, version:, uri:, encoding: Encoding::UTF_8)
13+
@syntax_error = T.let(false, T::Boolean)
14+
super
15+
end
16+
17+
sig { override.returns(ParseResultType) }
18+
def parse
19+
return @parse_result unless @needs_parsing
20+
21+
@needs_parsing = false
22+
23+
_, _, declarations = RBS::Parser.parse_signature(@source)
24+
@syntax_error = false
25+
@parse_result = declarations
26+
rescue RBS::ParsingError
27+
@syntax_error = true
28+
@parse_result
29+
end
30+
31+
sig { override.returns(T::Boolean) }
32+
def syntax_error?
33+
@syntax_error
34+
end
35+
36+
sig { override.returns(LanguageId) }
37+
def language_id
38+
LanguageId::RBS
39+
end
40+
end
41+
end

lib/ruby_lsp/server.rb

+3
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,12 @@ def text_document_did_open(message)
298298
language_id = case text_document[:languageId]
299299
when "erb"
300300
Document::LanguageId::ERB
301+
when "rbs"
302+
Document::LanguageId::RBS
301303
else
302304
Document::LanguageId::Ruby
303305
end
306+
304307
@store.set(
305308
uri: text_document[:uri],
306309
source: text_document[:text],

lib/ruby_lsp/store.rb

+7-3
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,11 @@ def get(uri)
4444
raise NonExistingDocumentError, uri.to_s unless path
4545

4646
ext = File.extname(path)
47-
language_id = if ext == ".erb" || ext == ".rhtml"
47+
language_id = case ext
48+
when ".erb", ".rhtml"
4849
Document::LanguageId::ERB
50+
when ".rbs"
51+
Document::LanguageId::RBS
4952
else
5053
Document::LanguageId::Ruby
5154
end
@@ -66,13 +69,14 @@ def get(uri)
6669
).void
6770
end
6871
def set(uri:, source:, version:, language_id:, encoding: Encoding::UTF_8)
69-
document = case language_id
72+
@state[uri.to_s] = case language_id
7073
when Document::LanguageId::ERB
7174
ERBDocument.new(source: source, version: version, uri: uri, encoding: encoding)
75+
when Document::LanguageId::RBS
76+
RBSDocument.new(source: source, version: version, uri: uri, encoding: encoding)
7277
else
7378
RubyDocument.new(source: source, version: version, uri: uri, encoding: encoding)
7479
end
75-
@state[uri.to_s] = document
7680
end
7781

7882
sig { params(uri: URI::Generic, edits: T::Array[T::Hash[Symbol, T.untyped]], version: Integer).void }

test/rbs_document_test.rb

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# typed: true
2+
# frozen_string_literal: true
3+
4+
require "test_helper"
5+
6+
class RBSDocumentTest < Minitest::Test
7+
def test_parse_result_is_array_of_declarations
8+
document = RubyLsp::RBSDocument.new(source: <<~RBS, version: 1, uri: URI("file:///foo.rbs"))
9+
class Foo
10+
def bar: () -> void
11+
end
12+
RBS
13+
14+
refute_predicate(document, :syntax_error?)
15+
assert_equal(:Foo, T.cast(document.parse_result[0], RBS::AST::Declarations::Class).name.name)
16+
end
17+
18+
def test_parsing_remembers_syntax_errors
19+
document = RubyLsp::RBSDocument.new(source: +<<~RBS, version: 1, uri: URI("file:///foo.rbs"))
20+
class Foo
21+
def bar: () - void
22+
end
23+
RBS
24+
25+
assert_predicate(document, :syntax_error?)
26+
27+
document.push_edits(
28+
[{ range: { start: { line: 1, character: 15 }, end: { line: 1, character: 15 } }, text: ">" }],
29+
version: 2,
30+
)
31+
document.parse
32+
refute_predicate(document, :syntax_error?)
33+
end
34+
end

0 commit comments

Comments
 (0)