Skip to content

Commit 0199baa

Browse files
steileymtsmfm
authored andcommitted
Enable to get column position on error (#43)
* Enabled to get column position on error * I made an error when there was no character indicating position. * I made it impossible to fail with rspec without setting charactor。 * Added start and end to character * Fixed by rubocop * Deleted unnecessary white spaces.
1 parent d854006 commit 0199baa

File tree

3 files changed

+19
-8
lines changed

3 files changed

+19
-8
lines changed

lib/language_server.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,11 @@ def on(method, &callback)
118118
range: Protocol::Interface::Range.new(
119119
start: Protocol::Interface::Position.new(
120120
line: error.line_num,
121-
character: 0,
121+
character: error.characters.min,
122122
),
123123
end: Protocol::Interface::Position.new(
124124
line: error.line_num,
125-
character: 0,
125+
character: error.characters.max,
126126
),
127127
),
128128
)

lib/language_server/linter/ruby_wc.rb

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
module LanguageServer
44
module Linter
55
class Error
6-
attr_reader :line_num, :message, :type
6+
attr_reader :line_num, :characters, :message, :type
77

8-
def initialize(line_num:, message:, type:)
8+
def initialize(line_num:, characters: 0..0, message:, type:)
99
@line_num = line_num
10+
@characters = characters
1011
@message = message
1112
@type = type
1213
end
@@ -16,7 +17,7 @@ def warning?
1617
end
1718

1819
def ==(other)
19-
line_num == other.line_num && message == other.message
20+
line_num == other.line_num && characters == other.characters && message == other.message
2021
end
2122
end
2223

@@ -27,7 +28,7 @@ def initialize(source)
2728

2829
def call
2930
error_message.scan(/.+:(\d+):\s*(.+?)[,:]\s(.+)/).map do |line_num, type, message|
30-
Error.new(line_num: line_num.to_i - 1, message: message, type: type)
31+
Error.new(line_num: line_num.to_i - 1, characters: get_characters_from_error_message(error_message, line_num.to_i - 1), message: message, type: type)
3132
end
3233
end
3334

@@ -75,6 +76,16 @@ def capture_stderr
7576
ensure
7677
$stderr = origin
7778
end
79+
80+
def get_characters_from_error_message(error_message, line_index)
81+
error_mark_included_line = error_message.split("\n")[2]
82+
83+
if !error_mark_included_line.nil? && character_start = error_mark_included_line.index("^")
84+
Range.new(character_start, character_start + 1)
85+
else
86+
Range.new(0, @source.split("\n")[line_index].length - 1)
87+
end
88+
end
7889
end
7990
end
8091
end

test/language_server/linter/ruby_wc_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def test_error
99
EOS
1010

1111
assert {
12-
linter.call == [Error.new(line_num: 1, message: "unexpected $undefined, expecting end-of-input", type: "syntax error")]
12+
linter.call == [Error.new(line_num: 1, characters: 10..11, message: "unexpected $undefined, expecting end-of-input", type: "syntax error")]
1313
}
1414
end
1515

@@ -19,7 +19,7 @@ def test_warn
1919
EOS
2020

2121
assert {
22-
linter.call == [Error.new(line_num: 0, message: "assigned but unused variable - a", type: "warning")]
22+
linter.call == [Error.new(line_num: 0, characters: 0..4, message: "assigned but unused variable - a", type: "warning")]
2323
}
2424
end
2525
end

0 commit comments

Comments
 (0)