Skip to content

Commit 0340b51

Browse files
committed
Auto merge of rust-lang#13484 - lnicola:position-encoding, r=lnicola
Switch to upstream `positionEncoding` Closes rust-lang#13481 This drops support for the custom extension, but that's probably fine. Draft because it's not tested yet.
2 parents feefbe7 + e93a2bf commit 0340b51

File tree

16 files changed

+56
-51
lines changed

16 files changed

+56
-51
lines changed

Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rust-analyzer/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ crossbeam-channel = "0.5.5"
2323
dissimilar = "1.0.4"
2424
itertools = "0.10.5"
2525
scip = "0.1.1"
26-
lsp-types = { version = "0.93.1", features = ["proposed"] }
26+
lsp-types = { version = "=0.93.2", features = ["proposed"] }
2727
parking_lot = "0.12.1"
2828
xflags = "0.3.0"
2929
oorandom = "11.1.3"

crates/rust-analyzer/src/bin/main.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::{env, fs, path::Path, process};
1111

1212
use lsp_server::Connection;
1313
use project_model::ProjectManifest;
14-
use rust_analyzer::{cli::flags, config::Config, from_json, lsp_ext::supports_utf8, Result};
14+
use rust_analyzer::{cli::flags, config::Config, from_json, Result};
1515
use vfs::AbsPathBuf;
1616

1717
#[cfg(all(feature = "mimalloc"))]
@@ -191,11 +191,7 @@ fn run_server() -> Result<()> {
191191
name: String::from("rust-analyzer"),
192192
version: Some(rust_analyzer::version().to_string()),
193193
}),
194-
offset_encoding: if supports_utf8(config.caps()) {
195-
Some("utf-8".to_string())
196-
} else {
197-
None
198-
},
194+
offset_encoding: None,
199195
};
200196

201197
let initialize_result = serde_json::to_value(initialize_result).unwrap();

crates/rust-analyzer/src/caps.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@ use lsp_types::{
66
FileOperationFilter, FileOperationPattern, FileOperationPatternKind,
77
FileOperationRegistrationOptions, FoldingRangeProviderCapability, HoverProviderCapability,
88
ImplementationProviderCapability, InlayHintOptions, InlayHintServerCapabilities, OneOf,
9-
RenameOptions, SaveOptions, SelectionRangeProviderCapability, SemanticTokensFullOptions,
10-
SemanticTokensLegend, SemanticTokensOptions, ServerCapabilities, SignatureHelpOptions,
11-
TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions,
12-
TypeDefinitionProviderCapability, WorkDoneProgressOptions,
9+
PositionEncodingKind, RenameOptions, SaveOptions, SelectionRangeProviderCapability,
10+
SemanticTokensFullOptions, SemanticTokensLegend, SemanticTokensOptions, ServerCapabilities,
11+
SignatureHelpOptions, TextDocumentSyncCapability, TextDocumentSyncKind,
12+
TextDocumentSyncOptions, TypeDefinitionProviderCapability, WorkDoneProgressOptions,
1313
WorkspaceFileOperationsServerCapabilities, WorkspaceServerCapabilities,
1414
};
1515
use serde_json::json;
1616

1717
use crate::config::{Config, RustfmtConfig};
18+
use crate::lsp_ext::supports_utf8;
1819
use crate::semantic_tokens;
1920

2021
pub fn server_capabilities(config: &Config) -> ServerCapabilities {
2122
ServerCapabilities {
23+
position_encoding: if supports_utf8(config.caps()) {
24+
Some(PositionEncodingKind::UTF8)
25+
} else {
26+
None
27+
},
2228
text_document_sync: Some(TextDocumentSyncCapability::Options(TextDocumentSyncOptions {
2329
open_close: Some(true),
2430
change: Some(TextDocumentSyncKind::INCREMENTAL),

crates/rust-analyzer/src/cli/lsif.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::cli::{
2020
load_cargo::{load_workspace, LoadCargoConfig},
2121
Result,
2222
};
23-
use crate::line_index::{LineEndings, LineIndex, OffsetEncoding};
23+
use crate::line_index::{LineEndings, LineIndex, PositionEncoding};
2424
use crate::to_proto;
2525
use crate::version::version;
2626

@@ -126,7 +126,7 @@ impl LsifManager<'_> {
126126
let line_index = self.db.line_index(file_id);
127127
let line_index = LineIndex {
128128
index: line_index,
129-
encoding: OffsetEncoding::Utf16,
129+
encoding: PositionEncoding::Utf16,
130130
endings: LineEndings::Unix,
131131
};
132132
let range_id = self.add_vertex(lsif::Vertex::Range {
@@ -248,7 +248,7 @@ impl LsifManager<'_> {
248248
let line_index = self.db.line_index(file_id);
249249
let line_index = LineIndex {
250250
index: line_index,
251-
encoding: OffsetEncoding::Utf16,
251+
encoding: PositionEncoding::Utf16,
252252
endings: LineEndings::Unix,
253253
};
254254
let result = folds

crates/rust-analyzer/src/cli/scip.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55
time::Instant,
66
};
77

8-
use crate::line_index::{LineEndings, LineIndex, OffsetEncoding};
8+
use crate::line_index::{LineEndings, LineIndex, PositionEncoding};
99
use hir::Name;
1010
use ide::{
1111
LineCol, MonikerDescriptorKind, StaticIndex, StaticIndexedFile, TextRange, TokenId,
@@ -91,7 +91,7 @@ impl flags::Scip {
9191

9292
let line_index = LineIndex {
9393
index: db.line_index(file_id),
94-
encoding: OffsetEncoding::Utf8,
94+
encoding: PositionEncoding::Utf8,
9595
endings: LineEndings::Unix,
9696
};
9797

crates/rust-analyzer/src/config.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use vfs::AbsPathBuf;
3232
use crate::{
3333
caps::completion_item_edit_resolve,
3434
diagnostics::DiagnosticsMapConfig,
35-
line_index::OffsetEncoding,
35+
line_index::PositionEncoding,
3636
lsp_ext::{self, supports_utf8, WorkspaceSymbolSearchKind, WorkspaceSymbolSearchScope},
3737
};
3838

@@ -948,11 +948,11 @@ impl Config {
948948
.is_some()
949949
}
950950

951-
pub fn offset_encoding(&self) -> OffsetEncoding {
951+
pub fn position_encoding(&self) -> PositionEncoding {
952952
if supports_utf8(&self.caps) {
953-
OffsetEncoding::Utf8
953+
PositionEncoding::Utf8
954954
} else {
955-
OffsetEncoding::Utf16
955+
PositionEncoding::Utf16
956956
}
957957
}
958958

crates/rust-analyzer/src/diagnostics/to_proto.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use stdx::format_to;
88
use vfs::{AbsPath, AbsPathBuf};
99

1010
use crate::{
11-
global_state::GlobalStateSnapshot, line_index::OffsetEncoding, lsp_ext,
11+
global_state::GlobalStateSnapshot, line_index::PositionEncoding, lsp_ext,
1212
to_proto::url_from_abs_path,
1313
};
1414

@@ -66,17 +66,17 @@ fn location(
6666
let uri = url_from_abs_path(&file_name);
6767

6868
let range = {
69-
let offset_encoding = snap.config.offset_encoding();
69+
let position_encoding = snap.config.position_encoding();
7070
lsp_types::Range::new(
71-
position(&offset_encoding, span, span.line_start, span.column_start),
72-
position(&offset_encoding, span, span.line_end, span.column_end),
71+
position(&position_encoding, span, span.line_start, span.column_start),
72+
position(&position_encoding, span, span.line_end, span.column_end),
7373
)
7474
};
7575
lsp_types::Location::new(uri, range)
7676
}
7777

7878
fn position(
79-
offset_encoding: &OffsetEncoding,
79+
position_encoding: &PositionEncoding,
8080
span: &DiagnosticSpan,
8181
line_offset: usize,
8282
column_offset: usize,
@@ -93,9 +93,9 @@ fn position(
9393
};
9494
}
9595
let mut char_offset = 0;
96-
let len_func = match offset_encoding {
97-
OffsetEncoding::Utf8 => char::len_utf8,
98-
OffsetEncoding::Utf16 => char::len_utf16,
96+
let len_func = match position_encoding {
97+
PositionEncoding::Utf8 => char::len_utf8,
98+
PositionEncoding::Utf16 => char::len_utf16,
9999
};
100100
for c in line.text.chars() {
101101
char_offset += 1;

crates/rust-analyzer/src/from_proto.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use vfs::AbsPathBuf;
88
use crate::{
99
from_json,
1010
global_state::GlobalStateSnapshot,
11-
line_index::{LineIndex, OffsetEncoding},
11+
line_index::{LineIndex, PositionEncoding},
1212
lsp_ext,
1313
lsp_utils::invalid_params_error,
1414
Result,
@@ -25,10 +25,10 @@ pub(crate) fn vfs_path(url: &lsp_types::Url) -> Result<vfs::VfsPath> {
2525

2626
pub(crate) fn offset(line_index: &LineIndex, position: lsp_types::Position) -> Result<TextSize> {
2727
let line_col = match line_index.encoding {
28-
OffsetEncoding::Utf8 => {
28+
PositionEncoding::Utf8 => {
2929
LineCol { line: position.line as u32, col: position.character as u32 }
3030
}
31-
OffsetEncoding::Utf16 => {
31+
PositionEncoding::Utf16 => {
3232
let line_col =
3333
LineColUtf16 { line: position.line as u32, col: position.character as u32 };
3434
line_index.index.to_utf8(line_col)

crates/rust-analyzer/src/global_state.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ impl GlobalStateSnapshot {
383383
pub(crate) fn file_line_index(&self, file_id: FileId) -> Cancellable<LineIndex> {
384384
let endings = self.vfs.read().1[&file_id];
385385
let index = self.analysis.file_line_index(file_id)?;
386-
let res = LineIndex { index, endings, encoding: self.config.offset_encoding() };
386+
let res = LineIndex { index, endings, encoding: self.config.position_encoding() };
387387
Ok(res)
388388
}
389389

crates/rust-analyzer/src/line_index.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
88
use std::sync::Arc;
99

10-
pub enum OffsetEncoding {
10+
pub enum PositionEncoding {
1111
Utf8,
1212
Utf16,
1313
}
1414

1515
pub(crate) struct LineIndex {
1616
pub(crate) index: Arc<ide::LineIndex>,
1717
pub(crate) endings: LineEndings,
18-
pub(crate) encoding: OffsetEncoding,
18+
pub(crate) encoding: PositionEncoding,
1919
}
2020

2121
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]

crates/rust-analyzer/src/lsp_ext.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::{collections::HashMap, path::PathBuf};
44

55
use lsp_types::request::Request;
6+
use lsp_types::PositionEncodingKind;
67
use lsp_types::{
78
notification::Notification, CodeActionKind, DocumentOnTypeFormattingParams,
89
PartialResultParams, Position, Range, TextDocumentIdentifier, WorkDoneProgressParams,
@@ -455,7 +456,15 @@ pub(crate) enum CodeLensResolveData {
455456
}
456457

457458
pub fn supports_utf8(caps: &lsp_types::ClientCapabilities) -> bool {
458-
caps.offset_encoding.as_deref().unwrap_or_default().iter().any(|it| it == "utf-8")
459+
match &caps.general {
460+
Some(general) => general
461+
.position_encodings
462+
.as_deref()
463+
.unwrap_or_default()
464+
.iter()
465+
.any(|it| it == &PositionEncodingKind::UTF8),
466+
_ => false,
467+
}
459468
}
460469

461470
pub enum MoveItem {}

crates/rust-analyzer/src/lsp_utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use lsp_server::Notification;
66
use crate::{
77
from_proto,
88
global_state::GlobalState,
9-
line_index::{LineEndings, LineIndex, OffsetEncoding},
9+
line_index::{LineEndings, LineIndex, PositionEncoding},
1010
LspError,
1111
};
1212

@@ -140,7 +140,7 @@ pub(crate) fn apply_document_changes(
140140
index: Arc::new(ide::LineIndex::new(old_text)),
141141
// We don't care about line endings or offset encoding here.
142142
endings: LineEndings::Unix,
143-
encoding: OffsetEncoding::Utf16,
143+
encoding: PositionEncoding::Utf16,
144144
};
145145

146146
// The changes we got must be applied sequentially, but can cross lines so we

crates/rust-analyzer/src/to_proto.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::{
2121
cargo_target_spec::CargoTargetSpec,
2222
config::{CallInfoConfig, Config},
2323
global_state::GlobalStateSnapshot,
24-
line_index::{LineEndings, LineIndex, OffsetEncoding},
24+
line_index::{LineEndings, LineIndex, PositionEncoding},
2525
lsp_ext,
2626
lsp_utils::invalid_params_error,
2727
semantic_tokens, Result,
@@ -30,8 +30,8 @@ use crate::{
3030
pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position {
3131
let line_col = line_index.index.line_col(offset);
3232
match line_index.encoding {
33-
OffsetEncoding::Utf8 => lsp_types::Position::new(line_col.line, line_col.col),
34-
OffsetEncoding::Utf16 => {
33+
PositionEncoding::Utf8 => lsp_types::Position::new(line_col.line, line_col.col),
34+
PositionEncoding::Utf16 => {
3535
let line_col = line_index.index.to_utf16(line_col);
3636
lsp_types::Position::new(line_col.line, line_col.col)
3737
}
@@ -1394,7 +1394,7 @@ fn main() {
13941394
let line_index = LineIndex {
13951395
index: Arc::new(ide::LineIndex::new(text)),
13961396
endings: LineEndings::Unix,
1397-
encoding: OffsetEncoding::Utf16,
1397+
encoding: PositionEncoding::Utf16,
13981398
};
13991399
let converted: Vec<lsp_types::FoldingRange> =
14001400
folds.into_iter().map(|it| folding_range(text, &line_index, true, it)).collect();

docs/dev/lsp-extensions.md

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!---
2-
lsp_ext.rs hash: 7b710095d773b978
2+
lsp_ext.rs hash: 62068e53ac202dc8
33
44
If you need to change the above hash to make the test pass, please check if you
55
need to adjust this doc as well and ping this issue:
@@ -19,12 +19,6 @@ Requests, which are likely to always remain specific to `rust-analyzer` are unde
1919

2020
If you want to be notified about the changes to this document, subscribe to [#4604](https://github.com/rust-lang/rust-analyzer/issues/4604).
2121

22-
## UTF-8 offsets
23-
24-
rust-analyzer supports clangd's extension for opting into UTF-8 as the coordinate space for offsets (by default, LSP uses UTF-16 offsets).
25-
26-
https://clangd.llvm.org/extensions.html#utf-8-offsets
27-
2822
## Configuration in `initializationOptions`
2923

3024
**Upstream Issue:** https://github.com/microsoft/language-server-protocol/issues/567

lib/lsp-server/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ serde = { version = "1.0.144", features = ["derive"] }
1313
crossbeam-channel = "0.5.6"
1414

1515
[dev-dependencies]
16-
lsp-types = "0.93.1"
16+
lsp-types = "=0.93.2"

0 commit comments

Comments
 (0)