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"))]
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();
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 {
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)
diagnostics::{CheckFixes, DiagnosticCollection},
document::DocumentData,
from_proto,
- line_endings::{LineEndings, LineIndex, OffsetEncoding},
+ line_endings::{LineEndings, LineIndex},
main_loop::Task,
op_queue::OpQueue,
reload::SourceRootConfig,
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)
}
use std::sync::Arc;
-pub(crate) enum OffsetEncoding {
- #[allow(unused)]
+pub enum OffsetEncoding {
Utf8,
Utf16,
}
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")
+}