mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Latest LSP 3.16 protocol
Pulls in https://github.com/gluon-lang/lsp-types/pull/186
This commit is contained in:
parent
0a658c4a97
commit
233fdb12ce
12 changed files with 32 additions and 33 deletions
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -852,9 +852,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lsp-server"
|
name = "lsp-server"
|
||||||
version = "0.4.1"
|
version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9c85acaf36c53bf15da2b8b35afeea56747707261f59eb0b77229081dd72b04e"
|
checksum = "69b18dfe0e4a380b872aa79d8e0ee6c3d7a9682466e84b83ad807c88b3545f79"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-channel 0.5.0",
|
"crossbeam-channel 0.5.0",
|
||||||
"log",
|
"log",
|
||||||
|
@ -864,9 +864,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lsp-types"
|
name = "lsp-types"
|
||||||
version = "0.83.0"
|
version = "0.83.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "25e0bd4b95038f2c23bda332ba0ca684e8dda765db1f9bdb63dc4c3e01f3b456"
|
checksum = "c4e79f39834b97271f9f5ecec573e42c7d9c5bdbd2620b30a851054ece6aab6d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
|
|
|
@ -21,7 +21,7 @@ env_logger = { version = "0.8.1", default-features = false }
|
||||||
itertools = "0.9.0"
|
itertools = "0.9.0"
|
||||||
jod-thread = "0.1.0"
|
jod-thread = "0.1.0"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
lsp-types = { version = "0.83.0", features = ["proposed"] }
|
lsp-types = { version = "0.83.1", features = ["proposed"] }
|
||||||
parking_lot = "0.11.0"
|
parking_lot = "0.11.0"
|
||||||
pico-args = "0.3.1"
|
pico-args = "0.3.1"
|
||||||
oorandom = "11.1.2"
|
oorandom = "11.1.2"
|
||||||
|
@ -31,7 +31,7 @@ serde_json = "1.0.48"
|
||||||
threadpool = "1.7.1"
|
threadpool = "1.7.1"
|
||||||
rayon = "1.5"
|
rayon = "1.5"
|
||||||
mimalloc = { version = "0.1.19", default-features = false, optional = true }
|
mimalloc = { version = "0.1.19", default-features = false, optional = true }
|
||||||
lsp-server = "0.4.0"
|
lsp-server = "0.5.0"
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
tracing-subscriber = { version = "0.2", default-features = false, features = ["env-filter", "registry"] }
|
tracing-subscriber = { version = "0.2", default-features = false, features = ["env-filter", "registry"] }
|
||||||
tracing-tree = { version = "0.1.4" }
|
tracing-tree = { version = "0.1.4" }
|
||||||
|
|
|
@ -62,6 +62,7 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
|
||||||
prepare_provider: Some(true),
|
prepare_provider: Some(true),
|
||||||
work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None },
|
work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None },
|
||||||
})),
|
})),
|
||||||
|
on_type_rename_provider: None,
|
||||||
document_link_provider: None,
|
document_link_provider: None,
|
||||||
color_provider: None,
|
color_provider: None,
|
||||||
execute_command_provider: None,
|
execute_command_provider: None,
|
||||||
|
|
|
@ -55,8 +55,8 @@ fn location_naive(workspace_root: &Path, span: &DiagnosticSpan) -> lsp_types::Lo
|
||||||
|
|
||||||
// FIXME: this doesn't handle UTF16 offsets correctly
|
// FIXME: this doesn't handle UTF16 offsets correctly
|
||||||
let range = lsp_types::Range::new(
|
let range = lsp_types::Range::new(
|
||||||
lsp_types::Position::new(span.line_start as u64 - 1, span.column_start as u64 - 1),
|
lsp_types::Position::new(span.line_start as u32 - 1, span.column_start as u32 - 1),
|
||||||
lsp_types::Position::new(span.line_end as u64 - 1, span.column_end as u64 - 1),
|
lsp_types::Position::new(span.line_end as u32 - 1, span.column_end as u32 - 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
lsp_types::Location { uri, range }
|
lsp_types::Location { uri, range }
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
/// client notifications.
|
/// client notifications.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub(crate) struct DocumentData {
|
pub(crate) struct DocumentData {
|
||||||
pub(crate) version: Option<i64>,
|
pub(crate) version: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DocumentData {
|
impl DocumentData {
|
||||||
pub(crate) fn new(version: i64) -> Self {
|
pub(crate) fn new(version: i32) -> Self {
|
||||||
DocumentData { version: Some(version) }
|
DocumentData { version }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -263,9 +263,9 @@ impl GlobalStateSnapshot {
|
||||||
self.vfs.read().1[&id]
|
self.vfs.read().1[&id]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn url_file_version(&self, url: &Url) -> Option<i64> {
|
pub(crate) fn url_file_version(&self, url: &Url) -> Option<i32> {
|
||||||
let path = from_proto::vfs_path(&url).ok()?;
|
let path = from_proto::vfs_path(&url).ok()?;
|
||||||
self.mem_docs.get(&path)?.version
|
Some(self.mem_docs.get(&path)?.version)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn anchored_path(&self, file_id: FileId, path: &str) -> Url {
|
pub(crate) fn anchored_path(&self, file_id: FileId, path: &str) -> Url {
|
||||||
|
|
|
@ -302,7 +302,7 @@ pub enum SnippetDocumentChangeOperation {
|
||||||
#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
|
#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct SnippetTextDocumentEdit {
|
pub struct SnippetTextDocumentEdit {
|
||||||
pub text_document: lsp_types::VersionedTextDocumentIdentifier,
|
pub text_document: lsp_types::OptionalVersionedTextDocumentIdentifier,
|
||||||
pub edits: Vec<SnippetTextEdit>,
|
pub edits: Vec<SnippetTextEdit>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ impl GlobalState {
|
||||||
}
|
}
|
||||||
let percentage = fraction.map(|f| {
|
let percentage = fraction.map(|f| {
|
||||||
assert!(0.0 <= f && f <= 1.0);
|
assert!(0.0 <= f && f <= 1.0);
|
||||||
f * 100.0
|
(f * 100.0) as u32
|
||||||
});
|
});
|
||||||
let token = lsp_types::ProgressToken::String(format!("rustAnalyzer/{}", title));
|
let token = lsp_types::ProgressToken::String(format!("rustAnalyzer/{}", title));
|
||||||
let work_done_progress = match state {
|
let work_done_progress = match state {
|
||||||
|
@ -98,11 +98,11 @@ pub(crate) fn apply_document_changes(
|
||||||
// The VFS will normalize the end of lines to `\n`.
|
// The VFS will normalize the end of lines to `\n`.
|
||||||
enum IndexValid {
|
enum IndexValid {
|
||||||
All,
|
All,
|
||||||
UpToLineExclusive(u64),
|
UpToLineExclusive(u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IndexValid {
|
impl IndexValid {
|
||||||
fn covers(&self, line: u64) -> bool {
|
fn covers(&self, line: u32) -> bool {
|
||||||
match *self {
|
match *self {
|
||||||
IndexValid::UpToLineExclusive(to) => to > line,
|
IndexValid::UpToLineExclusive(to) => to > line,
|
||||||
_ => true,
|
_ => true,
|
||||||
|
|
|
@ -368,7 +368,7 @@ impl GlobalState {
|
||||||
let url = file_id_to_url(&self.vfs.read().0, file_id);
|
let url = file_id_to_url(&self.vfs.read().0, file_id);
|
||||||
let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect();
|
let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect();
|
||||||
let version = from_proto::vfs_path(&url)
|
let version = from_proto::vfs_path(&url)
|
||||||
.map(|path| self.mem_docs.get(&path)?.version)
|
.map(|path| self.mem_docs.get(&path).map(|it| it.version))
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
self.send_notification::<lsp_types::notification::PublishDiagnostics>(
|
self.send_notification::<lsp_types::notification::PublishDiagnostics>(
|
||||||
|
@ -521,7 +521,7 @@ impl GlobalState {
|
||||||
let mut version = None;
|
let mut version = None;
|
||||||
if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) {
|
if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) {
|
||||||
match this.mem_docs.remove(&path) {
|
match this.mem_docs.remove(&path) {
|
||||||
Some(doc) => version = doc.version,
|
Some(doc) => version = Some(doc.version),
|
||||||
None => log::error!("orphan DidCloseTextDocument: {}", path),
|
None => log::error!("orphan DidCloseTextDocument: {}", path),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,7 @@ use crate::{
|
||||||
|
|
||||||
pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position {
|
pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position {
|
||||||
let line_col = line_index.line_col(offset);
|
let line_col = line_index.line_col(offset);
|
||||||
let line = u64::from(line_col.line);
|
lsp_types::Position::new(line_col.line, line_col.col_utf16)
|
||||||
let character = u64::from(line_col.col_utf16);
|
|
||||||
lsp_types::Position::new(line, character)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn range(line_index: &LineIndex, range: TextRange) -> lsp_types::Range {
|
pub(crate) fn range(line_index: &LineIndex, range: TextRange) -> lsp_types::Range {
|
||||||
|
@ -278,9 +276,9 @@ pub(crate) fn signature_help(
|
||||||
label.push_str(", ");
|
label.push_str(", ");
|
||||||
}
|
}
|
||||||
first = false;
|
first = false;
|
||||||
let start = label.len() as u64;
|
let start = label.len() as u32;
|
||||||
label.push_str(param);
|
label.push_str(param);
|
||||||
let end = label.len() as u64;
|
let end = label.len() as u32;
|
||||||
params.push(lsp_types::ParameterInformation {
|
params.push(lsp_types::ParameterInformation {
|
||||||
label: lsp_types::ParameterLabel::LabelOffsets([start, end]),
|
label: lsp_types::ParameterLabel::LabelOffsets([start, end]),
|
||||||
documentation: None,
|
documentation: None,
|
||||||
|
@ -302,7 +300,7 @@ pub(crate) fn signature_help(
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
let active_parameter = call_info.active_parameter.map(|it| it as i64);
|
let active_parameter = call_info.active_parameter.map(|it| it as u32);
|
||||||
|
|
||||||
let signature = lsp_types::SignatureInformation {
|
let signature = lsp_types::SignatureInformation {
|
||||||
label,
|
label,
|
||||||
|
@ -518,13 +516,13 @@ pub(crate) fn url_from_abs_path(path: &Path) -> lsp_types::Url {
|
||||||
lsp_types::Url::parse(&url).unwrap()
|
lsp_types::Url::parse(&url).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn versioned_text_document_identifier(
|
pub(crate) fn optional_versioned_text_document_identifier(
|
||||||
snap: &GlobalStateSnapshot,
|
snap: &GlobalStateSnapshot,
|
||||||
file_id: FileId,
|
file_id: FileId,
|
||||||
) -> lsp_types::VersionedTextDocumentIdentifier {
|
) -> lsp_types::OptionalVersionedTextDocumentIdentifier {
|
||||||
let url = url(snap, file_id);
|
let url = url(snap, file_id);
|
||||||
let version = snap.url_file_version(&url);
|
let version = snap.url_file_version(&url);
|
||||||
lsp_types::VersionedTextDocumentIdentifier { uri: url, version }
|
lsp_types::OptionalVersionedTextDocumentIdentifier { uri: url, version }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn location(
|
pub(crate) fn location(
|
||||||
|
@ -613,7 +611,7 @@ pub(crate) fn snippet_text_document_edit(
|
||||||
is_snippet: bool,
|
is_snippet: bool,
|
||||||
source_file_edit: SourceFileEdit,
|
source_file_edit: SourceFileEdit,
|
||||||
) -> Result<lsp_ext::SnippetTextDocumentEdit> {
|
) -> Result<lsp_ext::SnippetTextDocumentEdit> {
|
||||||
let text_document = versioned_text_document_identifier(snap, source_file_edit.file_id);
|
let text_document = optional_versioned_text_document_identifier(snap, source_file_edit.file_id);
|
||||||
let line_index = snap.analysis.file_line_index(source_file_edit.file_id)?;
|
let line_index = snap.analysis.file_line_index(source_file_edit.file_id)?;
|
||||||
let line_endings = snap.file_line_endings(source_file_edit.file_id);
|
let line_endings = snap.file_line_endings(source_file_edit.file_id);
|
||||||
let edits = source_file_edit
|
let edits = source_file_edit
|
||||||
|
|
|
@ -108,7 +108,7 @@ pub(crate) fn project(fixture: &str) -> Server {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) struct Server {
|
pub(crate) struct Server {
|
||||||
req_id: Cell<u64>,
|
req_id: Cell<i32>,
|
||||||
messages: RefCell<Vec<Message>>,
|
messages: RefCell<Vec<Message>>,
|
||||||
_thread: jod_thread::JoinHandle<()>,
|
_thread: jod_thread::JoinHandle<()>,
|
||||||
client: Connection,
|
client: Connection,
|
||||||
|
@ -165,7 +165,7 @@ impl Server {
|
||||||
R::Params: Serialize,
|
R::Params: Serialize,
|
||||||
{
|
{
|
||||||
let id = self.req_id.get();
|
let id = self.req_id.get();
|
||||||
self.req_id.set(id + 1);
|
self.req_id.set(id.wrapping_add(1));
|
||||||
|
|
||||||
let r = Request::new(id.into(), R::METHOD.to_string(), params);
|
let r = Request::new(id.into(), R::METHOD.to_string(), params);
|
||||||
self.send_request_(r)
|
self.send_request_(r)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<!---
|
<!---
|
||||||
lsp_ext.rs hash: 9d5daed5b25dc4f6
|
lsp_ext.rs hash: 203fdf79b21b5987
|
||||||
|
|
||||||
If you need to change the above hash to make the test pass, please check if you
|
If you need to change the above hash to make the test pass, please check if you
|
||||||
need to adjust this doc as well and ping this issue:
|
need to adjust this doc as well and ping this issue:
|
||||||
|
@ -45,7 +45,7 @@ interface SnippetTextEdit extends TextEdit {
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
export interface TextDocumentEdit {
|
export interface TextDocumentEdit {
|
||||||
textDocument: VersionedTextDocumentIdentifier;
|
textDocument: OptionalVersionedTextDocumentIdentifier;
|
||||||
edits: (TextEdit | SnippetTextEdit)[];
|
edits: (TextEdit | SnippetTextEdit)[];
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
Loading…
Reference in a new issue