python: Replace pyright with basedpyright (#35362)
Follow-up to #35250. Let's experiment with having this by default on nightly. Release Notes: - Added built-in support for the basedpyright language server for Python code. basedpyright is now enabled by default, and pyright (previously the primary Python language server) remains available but is disabled by default. This supersedes the basedpyright extension, which can be uninstalled. Advantages of basedpyright over pyright include support for inlay hints, semantic highlighting, auto-import code actions, and stricter type checking. To switch back to pyright, add the following configuration to settings.json: ```json { "languages": { "Python": { "language_servers": ["pyright", "pylsp", "!basedpyright"] } } } ``` --------- Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Co-authored-by: Lukas Wirth <lukas@zed.dev>
This commit is contained in:
co-authored by
Piotr Osiewicz
Lukas Wirth
parent
99102a84fa
commit
fa0df6da1c
+10
-36
@@ -1,5 +1,4 @@
|
||||
use anyhow::Context as _;
|
||||
use feature_flags::{FeatureFlag, FeatureFlagAppExt as _};
|
||||
use gpui::{App, SharedString, UpdateGlobal};
|
||||
use node_runtime::NodeRuntime;
|
||||
use python::PyprojectTomlManifestProvider;
|
||||
@@ -54,12 +53,6 @@ pub static LANGUAGE_GIT_COMMIT: std::sync::LazyLock<Arc<Language>> =
|
||||
))
|
||||
});
|
||||
|
||||
struct BasedPyrightFeatureFlag;
|
||||
|
||||
impl FeatureFlag for BasedPyrightFeatureFlag {
|
||||
const NAME: &'static str = "basedpyright";
|
||||
}
|
||||
|
||||
pub fn init(languages: Arc<LanguageRegistry>, node: NodeRuntime, cx: &mut App) {
|
||||
#[cfg(feature = "load-grammars")]
|
||||
languages.register_native_grammars([
|
||||
@@ -174,7 +167,7 @@ pub fn init(languages: Arc<LanguageRegistry>, node: NodeRuntime, cx: &mut App) {
|
||||
},
|
||||
LanguageInfo {
|
||||
name: "python",
|
||||
adapters: vec![python_lsp_adapter, py_lsp_adapter],
|
||||
adapters: vec![basedpyright_lsp_adapter],
|
||||
context: Some(python_context_provider),
|
||||
toolchain: Some(python_toolchain_provider),
|
||||
manifest_name: Some(SharedString::new_static("pyproject.toml").into()),
|
||||
@@ -240,17 +233,6 @@ pub fn init(languages: Arc<LanguageRegistry>, node: NodeRuntime, cx: &mut App) {
|
||||
);
|
||||
}
|
||||
|
||||
let mut basedpyright_lsp_adapter = Some(basedpyright_lsp_adapter);
|
||||
cx.observe_flag::<BasedPyrightFeatureFlag, _>({
|
||||
let languages = languages.clone();
|
||||
move |enabled, _| {
|
||||
if enabled && let Some(adapter) = basedpyright_lsp_adapter.take() {
|
||||
languages.register_available_lsp_adapter(adapter.name(), move || adapter.clone());
|
||||
}
|
||||
}
|
||||
})
|
||||
.detach();
|
||||
|
||||
// Register globally available language servers.
|
||||
//
|
||||
// This will allow users to add support for a built-in language server (e.g., Tailwind)
|
||||
@@ -267,27 +249,19 @@ pub fn init(languages: Arc<LanguageRegistry>, node: NodeRuntime, cx: &mut App) {
|
||||
// ```
|
||||
languages.register_available_lsp_adapter(
|
||||
LanguageServerName("tailwindcss-language-server".into()),
|
||||
{
|
||||
let adapter = tailwind_adapter.clone();
|
||||
move || adapter.clone()
|
||||
},
|
||||
tailwind_adapter.clone(),
|
||||
);
|
||||
languages.register_available_lsp_adapter(LanguageServerName("eslint".into()), {
|
||||
let adapter = eslint_adapter.clone();
|
||||
move || adapter.clone()
|
||||
});
|
||||
languages.register_available_lsp_adapter(LanguageServerName("vtsls".into()), {
|
||||
let adapter = vtsls_adapter;
|
||||
move || adapter.clone()
|
||||
});
|
||||
languages.register_available_lsp_adapter(
|
||||
LanguageServerName("eslint".into()),
|
||||
eslint_adapter.clone(),
|
||||
);
|
||||
languages.register_available_lsp_adapter(LanguageServerName("vtsls".into()), vtsls_adapter);
|
||||
languages.register_available_lsp_adapter(
|
||||
LanguageServerName("typescript-language-server".into()),
|
||||
{
|
||||
let adapter = typescript_lsp_adapter;
|
||||
move || adapter.clone()
|
||||
},
|
||||
typescript_lsp_adapter,
|
||||
);
|
||||
|
||||
languages.register_available_lsp_adapter(python_lsp_adapter.name(), python_lsp_adapter);
|
||||
languages.register_available_lsp_adapter(py_lsp_adapter.name(), py_lsp_adapter);
|
||||
// Register Tailwind for the existing languages that should have it by default.
|
||||
//
|
||||
// This can be driven by the `language_servers` setting once we have a way for
|
||||
|
||||
@@ -35,7 +35,7 @@ use std::{
|
||||
sync::Arc,
|
||||
};
|
||||
use task::{ShellKind, TaskTemplate, TaskTemplates, VariableName};
|
||||
use util::ResultExt;
|
||||
use util::{ResultExt, maybe};
|
||||
|
||||
pub(crate) struct PyprojectTomlManifestProvider;
|
||||
|
||||
@@ -1619,23 +1619,37 @@ impl LspAdapter for BasedPyrightLspAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
// Always set the python interpreter path
|
||||
// Get or create the python section
|
||||
let python = object
|
||||
// Set both pythonPath and defaultInterpreterPath for compatibility
|
||||
if let Some(python) = object
|
||||
.entry("python")
|
||||
.or_insert(Value::Object(serde_json::Map::default()))
|
||||
.as_object_mut()
|
||||
.unwrap();
|
||||
|
||||
// Set both pythonPath and defaultInterpreterPath for compatibility
|
||||
python.insert(
|
||||
"pythonPath".to_owned(),
|
||||
Value::String(interpreter_path.clone()),
|
||||
);
|
||||
python.insert(
|
||||
"defaultInterpreterPath".to_owned(),
|
||||
Value::String(interpreter_path),
|
||||
);
|
||||
{
|
||||
python.insert(
|
||||
"pythonPath".to_owned(),
|
||||
Value::String(interpreter_path.clone()),
|
||||
);
|
||||
python.insert(
|
||||
"defaultInterpreterPath".to_owned(),
|
||||
Value::String(interpreter_path),
|
||||
);
|
||||
}
|
||||
// Basedpyright by default uses `strict` type checking, we tone it down as to not surpris users
|
||||
maybe!({
|
||||
let basedpyright = object
|
||||
.entry("basedpyright")
|
||||
.or_insert(Value::Object(serde_json::Map::default()));
|
||||
let analysis = basedpyright
|
||||
.as_object_mut()?
|
||||
.entry("analysis")
|
||||
.or_insert(Value::Object(serde_json::Map::default()));
|
||||
if let serde_json::map::Entry::Vacant(v) =
|
||||
analysis.as_object_mut()?.entry("typeCheckingMode")
|
||||
{
|
||||
v.insert(Value::String("standard".to_owned()));
|
||||
}
|
||||
Some(())
|
||||
});
|
||||
}
|
||||
|
||||
user_settings
|
||||
|
||||
Reference in New Issue
Block a user