]> git.lizzy.rs Git - rust.git/commitdiff
Enable offset-encoding capability
authorAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 12 Feb 2021 22:26:01 +0000 (01:26 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 16 Feb 2021 16:17:32 +0000 (19:17 +0300)
crates/rust-analyzer/src/bin/main.rs
crates/rust-analyzer/src/config.rs
crates/rust-analyzer/src/global_state.rs
crates/rust-analyzer/src/line_endings.rs
crates/rust-analyzer/src/lsp_ext.rs

index 93d0ad4ec82dc00d8eb97f885ddac6cc0a09d632..89482b95266b09c4769d50757cfc11b8d98b4576 100644 (file)
@@ -8,7 +8,7 @@
 
 use lsp_server::Connection;
 use project_model::ProjectManifest;
-use rust_analyzer::{cli, config::Config, from_json, Result};
+use rust_analyzer::{cli, config::Config, from_json, lsp_ext::supports_utf8, Result};
 use vfs::AbsPathBuf;
 
 #[cfg(all(feature = "mimalloc"))]
@@ -127,7 +127,11 @@ fn run_server() -> Result<()> {
             name: String::from("rust-analyzer"),
             version: Some(String::from(env!("REV"))),
         }),
-        offset_encoding: None,
+        offset_encoding: if supports_utf8(&initialize_params.capabilities) {
+            Some("utf-8".to_string())
+        } else {
+            None
+        },
     };
 
     let initialize_result = serde_json::to_value(initialize_result).unwrap();
index f9098968a8277455d973179745a53a9e745498e0..425ef145c24ef7aa5d22eec98044bdf92f1a2527 100644 (file)
 use serde::{de::DeserializeOwned, Deserialize};
 use vfs::AbsPathBuf;
 
-use crate::{caps::completion_item_edit_resolve, diagnostics::DiagnosticsMapConfig};
+use crate::{
+    caps::completion_item_edit_resolve, diagnostics::DiagnosticsMapConfig,
+    line_endings::OffsetEncoding, lsp_ext::supports_utf8,
+};
 
 config_data! {
     struct ConfigData {
@@ -415,6 +418,13 @@ pub fn signature_help_label_offsets(&self) -> bool {
             false
         )
     }
+    pub fn offset_encoding(&self) -> OffsetEncoding {
+        if supports_utf8(&self.caps) {
+            OffsetEncoding::Utf8
+        } else {
+            OffsetEncoding::Utf16
+        }
+    }
 
     fn experimental(&self, index: &'static str) -> bool {
         try_or!(self.caps.experimental.as_ref()?.get(index)?.as_bool()?, false)
index d26e5ef482104ea0d5aeaca298f76ca2a2936842..85c87645c0c1bb4b442f0ca06161475f382a442b 100644 (file)
@@ -22,7 +22,7 @@
     diagnostics::{CheckFixes, DiagnosticCollection},
     document::DocumentData,
     from_proto,
-    line_endings::{LineEndings, LineIndex, OffsetEncoding},
+    line_endings::{LineEndings, LineIndex},
     main_loop::Task,
     op_queue::OpQueue,
     reload::SourceRootConfig,
@@ -274,7 +274,7 @@ pub(crate) fn file_id_to_url(&self, id: FileId) -> Url {
     pub(crate) fn file_line_index(&self, file_id: FileId) -> Cancelable<LineIndex> {
         let endings = self.vfs.read().1[&file_id];
         let index = self.analysis.file_line_index(file_id)?;
-        let res = LineIndex { index, endings, encoding: OffsetEncoding::Utf16 };
+        let res = LineIndex { index, endings, encoding: self.config.offset_encoding() };
         Ok(res)
     }
 
index 7b6cba43e5164799f95827487b176fe46de1a54d..dd8901152882073a10a8ab2faaf6d22acc18fe8a 100644 (file)
@@ -4,8 +4,7 @@
 
 use std::sync::Arc;
 
-pub(crate) enum OffsetEncoding {
-    #[allow(unused)]
+pub enum OffsetEncoding {
     Utf8,
     Utf16,
 }
index a1ad855c32f11a594aacb763e783443c9f7a4f15..0d2c8f7ffbb23bf4ac83b04aaf17ab69d027d927 100644 (file)
@@ -385,3 +385,7 @@ pub(crate) enum CodeLensResolveData {
     Impls(lsp_types::request::GotoImplementationParams),
     References(lsp_types::TextDocumentPositionParams),
 }
+
+pub fn supports_utf8(caps: &lsp_types::ClientCapabilities) -> bool {
+    caps.offset_encoding.as_deref().unwrap_or_default().iter().any(|it| it == "utf-8")
+}