Skip to content

Commit e08645f

Browse files
authored
Merge pull request #1307 from julia-vscode/fix-offset
Use index_at for get_offset
2 parents 044c645 + a4bb4b8 commit e08645f

File tree

8 files changed

+25
-55
lines changed

8 files changed

+25
-55
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ JSONRPC = "1.1"
2626
JuliaFormatter = "0.20.0, 0.21, 0.22, 0.23, 1"
2727
PrecompileTools = "1"
2828
StaticLint = "8.0"
29-
JuliaWorkspaces = "4.3"
29+
JuliaWorkspaces = "4.4"
3030
SymbolServer = "8"
3131
Tokenize = "0.5.10"
3232
URIs = "1.3"

src/document.jl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,6 @@ get_offset(doc::Document, line::Integer, character::Integer) = get_offset(doc._t
7676
get_offset(doc::Document, p::Position) = get_offset(doc, p.line, p.character)
7777
get_offset(doc::Document, r::Range) = get_offset(doc, r.start):get_offset(doc, r.stop)
7878

79-
# get_offset, but correct
80-
get_offset3(args...) = index_at(args...) - 1
81-
8279
index_at(doc::Document, pos, args...) = index_at(doc._text_document, pos, args...)
8380

8481
get_position_from_offset(doc::Document, offset::Integer) = get_position_from_offset(doc._text_document, offset)

src/requests/completions.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ end
4141
function textDocument_completion_request(params::CompletionParams, server::LanguageServerInstance, conn)
4242
state = let
4343
doc = getdocument(server, params.textDocument.uri)
44-
offset = get_offset3(get_text_document(doc), params.position)
44+
offset = get_offset(get_text_document(doc), params.position)
4545
rng = Range(doc, offset:offset)
4646
x = get_expr(getcst(doc), offset)
4747
using_stmts = server.completion_mode == :import ? get_preexisting_using_stmts(x, doc) : Dict()

src/requests/highlight.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
function textDocument_documentHighlight_request(params::DocumentHighlightParams, server::LanguageServerInstance, conn)
22
doc = getdocument(server, params.textDocument.uri)
3-
# This is ONLY here to test whether it also crashes when get_offset crashes
4-
index_at(doc, params.position)
53
offset = get_offset(doc, params.position)
64
identifier = get_identifier(getcst(doc), offset)
75
identifier !== nothing || return nothing

src/requests/signatures.jl

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
function textDocument_signatureHelp_request(params::TextDocumentPositionParams, server::LanguageServerInstance, conn)
22
doc = getdocument(server, params.textDocument.uri)
33
sigs = SignatureInformation[]
4-
# TODO The following call is just here for diagnostics
5-
# We currently have crashes in the call to get_offset in crash reporting
6-
# but they are fairly rare. So the idea here is to see whether we also get_expr
7-
# crashes in index_at or not. If we still see crashes in get_offset after this here
8-
# is merged, then the bug is simply in get_offset and we should migrate this function
9-
# over to use index_at. If not, then there might still be a problem in the sync protocol.
10-
index_at(get_text_document(doc), params.position)
114
offset = get_offset(doc, params.position)
125
x = get_expr(getcst(doc), offset)
136

src/textdocument.jl

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,7 @@ get_language_id(doc::TextDocument) = doc._language_id
4949
Converts a 0-based `Position` that is UTF-16 encoded to a 1-based UTF-8
5050
encoded Julia string index.
5151
"""
52-
function index_at(doc::TextDocument, p::Position, forgiving_mode=false)
53-
line = p.line
54-
character = p.character
55-
52+
function index_at(doc::TextDocument, line::Integer, character::Integer, forgiving_mode=false)
5653
line_indices = get_line_indices(doc)
5754
text = get_text(doc)
5855

@@ -85,9 +82,15 @@ function index_at(doc::TextDocument, p::Position, forgiving_mode=false)
8582
pos = nextind(text, pos)
8683
end
8784

85+
if character < 0
86+
error("Invalid UTF-16 index supplied")
87+
end
88+
8889
return pos
8990
end
9091

92+
index_at(doc::TextDocument, p::Position, args...) = index_at(doc, p.line, p.character, args...)
93+
9194
function apply_text_edits(doc::TextDocument, edits, new_version)
9295
content = doc._content
9396

@@ -220,30 +223,7 @@ This takes 0 based line/char inputs. Corresponding functions are available for
220223
Position and Range arguments, the latter returning a UnitRange{Int}.
221224
"""
222225
function get_offset(doc::TextDocument, line::Integer, character::Integer)
223-
c = ' '
224-
line_offsets = get_line_offsets(doc)
225-
io = IOBuffer(get_text(doc))
226-
try
227-
seek(io, line_offsets[line + 1])
228-
while character > 0
229-
c = read(io, Char)
230-
character -= 1
231-
if UInt32(c) >= 0x010000
232-
character -= 1
233-
end
234-
end
235-
if UInt32(c) < 0x0080
236-
return position(io)
237-
elseif UInt32(c) < 0x0800
238-
return position(io) - 1
239-
elseif UInt32(c) < 0x010000
240-
return position(io) - 2
241-
else
242-
return position(io) - 3
243-
end
244-
catch err
245-
throw(LSOffsetError("get_offset crashed. More diagnostics:\nline=$line\ncharacter=$character\nposition(io)=$(position(io))\nline_offsets='$line_offsets'\ntext='$(_obscure_text(get_text(doc)))'\n\noriginal_error=$(sprint(Base.display_error, err, catch_backtrace()))"))
246-
end
226+
return index_at(doc, line, character) - 1
247227
end
248228
get_offset(doc::TextDocument, p::Position) = get_offset(doc, p.line, p.character)
249229
get_offset(doc::TextDocument, r::Range) = get_offset(doc, r.start):get_offset(doc, r.stop)

test/test_document.jl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -127,44 +127,44 @@ end
127127
@test sizeof(LanguageServer.get_text(doc)) == 6
128128
@test LanguageServer.get_offset(doc, 0, 0) == 0
129129
@test LanguageServer.get_position_from_offset(doc, 0) == (0, 0)
130-
@test LanguageServer.get_offset(doc, 0, 1) == 1
130+
@test LanguageServer.get_offset(doc, 0, 1) == 2
131131
@test LanguageServer.get_position_from_offset(doc, 1) == (0, 1)
132-
@test LanguageServer.get_offset(doc, 0, 2) == 3
132+
@test LanguageServer.get_offset(doc, 0, 2) == 4
133133
@test LanguageServer.get_position_from_offset(doc, 3) == (0, 2)
134-
@test LanguageServer.get_offset(doc, 0, 3) == 5
134+
@test LanguageServer.get_offset(doc, 0, 3) == 6
135135
@test LanguageServer.get_position_from_offset(doc, 5) == (0, 3)
136136

137137
doc = LanguageServer.Document(TextDocument(uri"", "ࠀࠀࠀ", 0), false) # 0x0800
138138
@test sizeof(LanguageServer.get_text(doc)) == 9
139139
@test LanguageServer.get_offset(doc, 0, 0) == 0
140140
@test LanguageServer.get_position_from_offset(doc, 0) == (0, 0)
141-
@test LanguageServer.get_offset(doc, 0, 1) == 1
142-
@test LanguageServer.get_position_from_offset(doc, 1) == (0, 1)
143-
@test LanguageServer.get_offset(doc, 0, 2) == 4
141+
@test LanguageServer.get_offset(doc, 0, 1) == 3
142+
@test LanguageServer.get_position_from_offset(doc, 2) == (0, 1)
143+
@test LanguageServer.get_offset(doc, 0, 2) == 6
144144
@test LanguageServer.get_position_from_offset(doc, 4) == (0, 2)
145-
@test LanguageServer.get_offset(doc, 0, 3) == 7
145+
@test LanguageServer.get_offset(doc, 0, 3) == 9
146146
@test LanguageServer.get_position_from_offset(doc, 7) == (0, 3)
147147

148148
doc = LanguageServer.Document(TextDocument(uri"", "𐐀𐐀𐐀", 0), false)
149149
@test sizeof(LanguageServer.get_text(doc)) == 12
150150
@test LanguageServer.get_offset(doc, 0, 0) == 0
151151
@test LanguageServer.get_position_from_offset(doc, 0) == (0, 0)
152-
@test LanguageServer.get_offset(doc, 0, 2) == 1
152+
@test LanguageServer.get_offset(doc, 0, 2) == 4
153153
@test LanguageServer.get_position_from_offset(doc, 1) == (0, 2)
154-
@test LanguageServer.get_offset(doc, 0, 4) == 5
154+
@test LanguageServer.get_offset(doc, 0, 4) == 8
155155
@test LanguageServer.get_position_from_offset(doc, 5) == (0, 4)
156-
@test LanguageServer.get_offset(doc, 0, 6) == 9
156+
@test LanguageServer.get_offset(doc, 0, 6) == 12
157157
@test LanguageServer.get_position_from_offset(doc, 9) == (0, 6)
158158

159159
doc = LanguageServer.Document(TextDocument(uri"", "𐀀𐀀𐀀", 0), false) # 0x010000
160160
@test sizeof(LanguageServer.get_text(doc)) == 12
161161
@test LanguageServer.get_offset(doc, 0, 0) == 0
162162
@test LanguageServer.get_position_from_offset(doc, 0) == (0, 0)
163-
@test LanguageServer.get_offset(doc, 0, 2) == 1
163+
@test LanguageServer.get_offset(doc, 0, 2) == 4
164164
@test LanguageServer.get_position_from_offset(doc, 1) == (0, 2)
165-
@test LanguageServer.get_offset(doc, 0, 4) == 5
165+
@test LanguageServer.get_offset(doc, 0, 4) == 8
166166
@test LanguageServer.get_position_from_offset(doc, 5) == (0, 4)
167-
@test LanguageServer.get_offset(doc, 0, 6) == 9
167+
@test LanguageServer.get_offset(doc, 0, 6) == 12
168168
@test LanguageServer.get_position_from_offset(doc, 9) == (0, 6)
169169
end
170170

test/test_shared_server.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ function settestdoc(text)
1010

1111
doc = LanguageServer.getdocument(server, uri"untitled:testdoc")
1212
LanguageServer.parse_all(doc, server)
13+
LanguageServer.lint!(doc, server)
14+
LanguageServer.semantic_pass(doc)
1315
doc
1416
end
1517

0 commit comments

Comments
 (0)