summaryrefslogtreecommitdiff
path: root/cli/lsp/tsc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/tsc.rs')
-rw-r--r--cli/lsp/tsc.rs121
1 files changed, 55 insertions, 66 deletions
diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs
index e88aba07b..1d7dac4e9 100644
--- a/cli/lsp/tsc.rs
+++ b/cli/lsp/tsc.rs
@@ -3,6 +3,7 @@
use super::analysis::CodeActionData;
use super::code_lens;
use super::config;
+use super::config::ConfigTree;
use super::documents::AssetOrDocument;
use super::documents::DocumentsFilter;
use super::language_server;
@@ -22,7 +23,6 @@ use super::urls::INVALID_SPECIFIER;
use crate::args::jsr_url;
use crate::args::FmtOptionsConfig;
-use crate::args::TsConfig;
use crate::cache::HttpCache;
use crate::lsp::cache::CacheMetadata;
use crate::lsp::documents::Documents;
@@ -221,6 +221,7 @@ pub struct TsServer {
sender: mpsc::UnboundedSender<Request>,
receiver: Mutex<Option<mpsc::UnboundedReceiver<Request>>>,
specifier_map: Arc<TscSpecifierMap>,
+ config_tree: Arc<ConfigTree>,
inspector_server: Mutex<Option<Arc<InspectorServer>>>,
}
@@ -238,7 +239,11 @@ impl std::fmt::Debug for TsServer {
}
impl TsServer {
- pub fn new(performance: Arc<Performance>, cache: Arc<dyn HttpCache>) -> Self {
+ pub fn new(
+ performance: Arc<Performance>,
+ cache: Arc<dyn HttpCache>,
+ config_tree: Arc<ConfigTree>,
+ ) -> Self {
let (tx, request_rx) = mpsc::unbounded_channel::<Request>();
Self {
performance,
@@ -246,6 +251,7 @@ impl TsServer {
sender: tx,
receiver: Mutex::new(Some(request_rx)),
specifier_map: Arc::new(TscSpecifierMap::new()),
+ config_tree,
inspector_server: Mutex::new(None),
}
}
@@ -268,6 +274,7 @@ impl TsServer {
let performance = self.performance.clone();
let cache = self.cache.clone();
let specifier_map = self.specifier_map.clone();
+ let config_tree = self.config_tree.clone();
let _join_handle = thread::spawn(move || {
run_tsc_thread(
receiver,
@@ -275,6 +282,7 @@ impl TsServer {
cache.clone(),
specifier_map.clone(),
maybe_inspector_server,
+ config_tree,
)
});
}
@@ -343,18 +351,6 @@ impl TsServer {
self.request(snapshot, req).await
}
- pub async fn configure(
- &self,
- snapshot: Arc<StateSnapshot>,
- tsconfig: TsConfig,
- ) -> Result<bool, AnyError> {
- let req = TscRequest {
- method: "$configure",
- args: json!([tsconfig]),
- };
- self.request(snapshot, req).await
- }
-
pub async fn get_supported_code_fixes(
&self,
snapshot: Arc<StateSnapshot>,
@@ -3482,7 +3478,7 @@ impl CompletionEntry {
{
if let Ok(import_specifier) = resolve_url(&import_data.file_name) {
if let Some(new_module_specifier) = language_server
- .get_ts_response_import_mapper()
+ .get_ts_response_import_mapper(specifier)
.check_specifier(&import_specifier, specifier)
.or_else(|| relative_specifier(specifier, &import_specifier))
{
@@ -3849,6 +3845,7 @@ struct State {
response: Option<Response>,
state_snapshot: Arc<StateSnapshot>,
specifier_map: Arc<TscSpecifierMap>,
+ config_tree: Arc<ConfigTree>,
token: CancellationToken,
}
@@ -3856,6 +3853,7 @@ impl State {
fn new(
state_snapshot: Arc<StateSnapshot>,
specifier_map: Arc<TscSpecifierMap>,
+ config_tree: Arc<ConfigTree>,
performance: Arc<Performance>,
) -> Self {
Self {
@@ -3864,6 +3862,7 @@ impl State {
response: None,
state_snapshot,
specifier_map,
+ config_tree,
token: Default::default(),
}
}
@@ -4078,9 +4077,19 @@ fn op_script_version(
}
#[op2]
+#[serde]
+fn op_ts_config(state: &mut OpState) -> serde_json::Value {
+ let state = state.borrow_mut::<State>();
+ let mark = state.performance.mark("tsc.op.op_ts_config");
+ let r = json!(state.config_tree.root_ts_config());
+ state.performance.measure(mark);
+ r
+}
+
+#[op2]
#[string]
fn op_project_version(state: &mut OpState) -> String {
- let state = state.borrow_mut::<State>();
+ let state: &mut State = state.borrow_mut::<State>();
let mark = state.performance.mark("tsc.op.op_project_version");
let r = state.state_snapshot.documents.project_version();
state.performance.measure(mark);
@@ -4093,13 +4102,19 @@ fn run_tsc_thread(
cache: Arc<dyn HttpCache>,
specifier_map: Arc<TscSpecifierMap>,
maybe_inspector_server: Option<Arc<InspectorServer>>,
+ config_tree: Arc<ConfigTree>,
) {
let has_inspector_server = maybe_inspector_server.is_some();
// Create and setup a JsRuntime based on a snapshot. It is expected that the
// supplied snapshot is an isolate that contains the TypeScript language
// server.
let mut tsc_runtime = JsRuntime::new(RuntimeOptions {
- extensions: vec![deno_tsc::init_ops(performance, cache, specifier_map)],
+ extensions: vec![deno_tsc::init_ops(
+ performance,
+ cache,
+ specifier_map,
+ config_tree,
+ )],
startup_snapshot: Some(tsc::compiler_snapshot()),
inspector: maybe_inspector_server.is_some(),
..Default::default()
@@ -4166,12 +4181,14 @@ deno_core::extension!(deno_tsc,
op_respond,
op_script_names,
op_script_version,
+ op_ts_config,
op_project_version,
],
options = {
performance: Arc<Performance>,
cache: Arc<dyn HttpCache>,
specifier_map: Arc<TscSpecifierMap>,
+ config_tree: Arc<ConfigTree>,
},
state = |state, options| {
state.put(State::new(
@@ -4180,10 +4197,10 @@ deno_core::extension!(deno_tsc,
cache_metadata: CacheMetadata::new(options.cache.clone()),
config: Default::default(),
documents: Documents::new(options.cache.clone()),
- maybe_import_map: None,
npm: None,
}),
options.specifier_map,
+ options.config_tree,
options.performance,
));
},
@@ -4344,9 +4361,10 @@ pub struct UserPreferences {
impl UserPreferences {
pub fn from_config_for_specifier(
config: &config::Config,
- fmt_config: &FmtOptionsConfig,
specifier: &ModuleSpecifier,
) -> Self {
+ let fmt_options = config.tree.fmt_options_for_specifier(specifier);
+ let fmt_config = &fmt_options.options;
let base_preferences = Self {
allow_incomplete_completions: Some(true),
allow_text_changes_in_new_files: Some(specifier.scheme() == "file"),
@@ -4450,7 +4468,8 @@ impl UserPreferences {
language_settings.preferences.use_aliases_for_renames,
),
// Only use workspace settings for quote style if there's no `deno.json`.
- quote_preference: if config.has_config_file() {
+ quote_preference: if config.tree.has_config_file_for_specifier(specifier)
+ {
base_preferences.quote_preference
} else {
Some(language_settings.preferences.quote_style)
@@ -4630,7 +4649,6 @@ mod tests {
assets: Default::default(),
cache_metadata: CacheMetadata::new(cache),
config: Default::default(),
- maybe_import_map: None,
npm: None,
}
}
@@ -4645,13 +4663,21 @@ mod tests {
Arc::new(GlobalHttpCache::new(location.clone(), RealDenoCacheEnv));
let snapshot = Arc::new(mock_state_snapshot(sources, &location));
let performance = Arc::new(Performance::default());
- let ts_server = TsServer::new(performance, cache.clone());
+ let config_tree = Arc::new(ConfigTree::default());
+ config_tree
+ .inject_config_file(
+ deno_config::ConfigFile::new(
+ &json!({
+ "compilerOptions": config,
+ })
+ .to_string(),
+ resolve_url("file:///deno.json").unwrap(),
+ )
+ .unwrap(),
+ )
+ .await;
+ let ts_server = TsServer::new(performance, cache.clone(), config_tree);
ts_server.start(None);
- let ts_config = TsConfig::new(config);
- assert!(ts_server
- .configure(snapshot.clone(), ts_config,)
- .await
- .unwrap());
(ts_server, snapshot, cache)
}
@@ -4671,43 +4697,6 @@ mod tests {
}
#[tokio::test]
- async fn test_project_configure() {
- let temp_dir = TempDir::new();
- setup(
- &temp_dir,
- json!({
- "target": "esnext",
- "module": "esnext",
- "noEmit": true,
- }),
- &[],
- )
- .await;
- }
-
- #[tokio::test]
- async fn test_project_reconfigure() {
- let temp_dir = TempDir::new();
- let (ts_server, snapshot, _) = setup(
- &temp_dir,
- json!({
- "target": "esnext",
- "module": "esnext",
- "noEmit": true,
- }),
- &[],
- )
- .await;
- let ts_config = TsConfig::new(json!({
- "target": "esnext",
- "module": "esnext",
- "noEmit": true,
- "lib": ["deno.ns", "deno.worker"]
- }));
- assert!(ts_server.configure(snapshot, ts_config).await.unwrap());
- }
-
- #[tokio::test]
async fn test_get_diagnostics() {
let temp_dir = TempDir::new();
let (ts_server, snapshot, _) = setup(
@@ -4716,6 +4705,7 @@ mod tests {
"target": "esnext",
"module": "esnext",
"noEmit": true,
+ "lib": [],
}),
&[(
"file:///a.ts",
@@ -5468,11 +5458,10 @@ mod tests {
.inlay_hints
.variable_types
.suppress_when_type_matches_name = true;
- let mut config = config::Config::new();
+ let mut config = config::Config::default();
config.set_workspace_settings(settings, vec![]);
let user_preferences = UserPreferences::from_config_for_specifier(
&config,
- &Default::default(),
&ModuleSpecifier::parse("file:///foo.ts").unwrap(),
);
assert_eq!(