Skip to content

Commit 0dd334b

Browse files
authored
feat(check/lsp): support "compilerOptions.rootDirs" (#27844)
1 parent b39ae6f commit 0dd334b

File tree

27 files changed

+260
-186
lines changed

27 files changed

+260
-186
lines changed

Cargo.lock

+5-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ deno_ast = { version = "=0.44.0", features = ["transpiling"] }
5454
deno_core = { version = "0.333.0" }
5555

5656
deno_bench_util = { version = "0.181.0", path = "./bench_util" }
57-
deno_config = { version = "=0.46.0", features = ["workspace"] }
57+
deno_config = { version = "=0.47.1", features = ["workspace"] }
5858
deno_lockfile = "=0.24.0"
5959
deno_media_type = { version = "=0.2.5", features = ["module_specifier"] }
6060
deno_npm = "=0.27.2"
@@ -204,7 +204,7 @@ slab = "0.4"
204204
smallvec = "1.8"
205205
socket2 = { version = "0.5.3", features = ["all"] }
206206
spki = "0.7.2"
207-
sys_traits = "=0.1.7"
207+
sys_traits = "=0.1.8"
208208
tar = "=0.4.40"
209209
tempfile = "3.4.0"
210210
termcolor = "1.1.3"

cli/factory.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ impl CliFactory {
711711

712712
pub async fn workspace_resolver(
713713
&self,
714-
) -> Result<&Arc<WorkspaceResolver>, AnyError> {
714+
) -> Result<&Arc<WorkspaceResolver<CliSys>>, AnyError> {
715715
self.initialize_npm_resolution_if_managed().await?;
716716
self.resolver_factory()?.workspace_resolver().await
717717
}

cli/lsp/analysis.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1343,9 +1343,11 @@ impl CodeActionCollection {
13431343
.tree
13441344
.data_for_specifier(file_referrer?)?;
13451345
let workspace_resolver = config_data.resolver.clone();
1346-
let npm_ref = if let Ok(resolution) =
1347-
workspace_resolver.resolve(&dep_key, document.specifier())
1348-
{
1346+
let npm_ref = if let Ok(resolution) = workspace_resolver.resolve(
1347+
&dep_key,
1348+
document.specifier(),
1349+
deno_config::workspace::ResolutionKind::Execution,
1350+
) {
13491351
let specifier = match resolution {
13501352
MappedResolution::Normal { specifier, .. }
13511353
| MappedResolution::ImportMap { specifier, .. } => specifier,

cli/lsp/config.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ pub struct ConfigData {
12051205
pub vendor_dir: Option<PathBuf>,
12061206
pub lockfile: Option<Arc<CliLockfile>>,
12071207
pub npmrc: Option<Arc<ResolvedNpmRc>>,
1208-
pub resolver: Arc<WorkspaceResolver>,
1208+
pub resolver: Arc<WorkspaceResolver<CliSys>>,
12091209
pub sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
12101210
pub import_map_from_settings: Option<ModuleSpecifier>,
12111211
pub unstable: BTreeSet<String>,
@@ -1572,7 +1572,7 @@ impl ConfigData {
15721572
let resolver = member_dir
15731573
.workspace
15741574
.create_resolver(
1575-
&CliSys::default(),
1575+
CliSys::default(),
15761576
CreateResolverOptions {
15771577
pkg_json_dep_resolution,
15781578
specified_import_map,
@@ -1593,11 +1593,14 @@ impl ConfigData {
15931593
member_dir.workspace.resolver_jsr_pkgs().collect(),
15941594
member_dir.workspace.package_jsons().cloned().collect(),
15951595
pkg_json_dep_resolution,
1596+
Default::default(),
1597+
Default::default(),
1598+
CliSys::default(),
15961599
)
15971600
});
15981601
if !resolver.diagnostics().is_empty() {
15991602
lsp_warn!(
1600-
" Import map diagnostics:\n{}",
1603+
" Resolver diagnostics:\n{}",
16011604
resolver
16021605
.diagnostics()
16031606
.iter()

cli/lsp/resolver.rs

+3
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,9 @@ impl<'a> ResolverFactory<'a> {
851851
Vec::new(),
852852
Vec::new(),
853853
PackageJsonDepResolution::Disabled,
854+
Default::default(),
855+
Default::default(),
856+
self.sys.clone(),
854857
))
855858
}),
856859
is_byonm: self.config_data.map(|d| d.byonm).unwrap_or(false),

cli/rt/run.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ struct SharedModuleLoaderState {
104104
npm_registry_permission_checker: NpmRegistryReadPermissionChecker<DenoRtSys>,
105105
npm_req_resolver: Arc<DenoRtNpmReqResolver>,
106106
vfs: Arc<FileBackedVfs>,
107-
workspace_resolver: WorkspaceResolver,
107+
workspace_resolver: WorkspaceResolver<DenoRtSys>,
108108
}
109109

110110
impl SharedModuleLoaderState {
@@ -201,10 +201,11 @@ impl ModuleLoader for EmbeddedModuleLoader {
201201
);
202202
}
203203

204-
let mapped_resolution = self
205-
.shared
206-
.workspace_resolver
207-
.resolve(raw_specifier, &referrer);
204+
let mapped_resolution = self.shared.workspace_resolver.resolve(
205+
raw_specifier,
206+
&referrer,
207+
deno_config::workspace::ResolutionKind::Execution,
208+
);
208209

209210
match mapped_resolution {
210211
Ok(MappedResolution::WorkspaceJsrPackage { specifier, .. }) => {
@@ -859,6 +860,9 @@ pub async fn run(
859860
.collect(),
860861
pkg_jsons,
861862
metadata.workspace_resolver.pkg_json_resolution,
863+
Default::default(),
864+
Default::default(),
865+
sys.clone(),
862866
)
863867
};
864868
let code_cache = match metadata.code_cache_key {

cli/schemas/config-file.v1.json

+8
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,14 @@
175175
"default": false,
176176
"markdownDescription": "Raise an error when a function parameter isn't read\n\nSee more: https://www.typescriptlang.org/tsconfig#noUnusedParameters"
177177
},
178+
"rootDirs": {
179+
"description": "Declare many “virtual” directories acting as a single root.",
180+
"type": "array",
181+
"items": {
182+
"type": "string"
183+
},
184+
"markdownDescription": "Declare many “virtual” directories acting as a single root.\n\nSee more: https://www.typescriptlang.org/tsconfig#rootDirs"
185+
},
178186
"strict": {
179187
"description": "Enable all strict type checking options.",
180188
"type": "boolean",

cli/standalone/binary.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ use crate::http_util::HttpClientProvider;
6262
use crate::node::CliCjsCodeAnalyzer;
6363
use crate::npm::CliNpmResolver;
6464
use crate::resolver::CliCjsTracker;
65+
use crate::sys::CliSys;
6566
use crate::util::archive;
6667
use crate::util::progress_bar::ProgressBar;
6768
use crate::util::progress_bar::ProgressBarStyle;
@@ -194,7 +195,7 @@ pub struct DenoCompileBinaryWriter<'a> {
194195
emitter: &'a Emitter,
195196
http_client_provider: &'a HttpClientProvider,
196197
npm_resolver: &'a CliNpmResolver,
197-
workspace_resolver: &'a WorkspaceResolver,
198+
workspace_resolver: &'a WorkspaceResolver<CliSys>,
198199
npm_system_info: NpmSystemInfo,
199200
}
200201

@@ -208,7 +209,7 @@ impl<'a> DenoCompileBinaryWriter<'a> {
208209
emitter: &'a Emitter,
209210
http_client_provider: &'a HttpClientProvider,
210211
npm_resolver: &'a CliNpmResolver,
211-
workspace_resolver: &'a WorkspaceResolver,
212+
workspace_resolver: &'a WorkspaceResolver<CliSys>,
212213
npm_system_info: NpmSystemInfo,
213214
) -> Self {
214215
Self {

cli/tools/info.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ pub async fn info(
5656
let cwd_url =
5757
url::Url::from_directory_path(cli_options.initial_cwd()).unwrap();
5858

59-
let maybe_import_specifier = if let Ok(resolved) =
60-
resolver.resolve(&specifier, &cwd_url)
61-
{
59+
let maybe_import_specifier = if let Ok(resolved) = resolver.resolve(
60+
&specifier,
61+
&cwd_url,
62+
deno_config::workspace::ResolutionKind::Execution,
63+
) {
6264
match resolved {
6365
deno_config::workspace::MappedResolution::Normal {
6466
specifier, ..

cli/tools/lint/rules/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use deno_lint::rules::LintRule;
1616
use deno_lint::tags;
1717

1818
use crate::resolver::CliSloppyImportsResolver;
19+
use crate::sys::CliSys;
1920

2021
mod no_sloppy_imports;
2122
mod no_slow_types;
@@ -141,13 +142,13 @@ impl ConfiguredRules {
141142

142143
pub struct LintRuleProvider {
143144
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
144-
workspace_resolver: Option<Arc<WorkspaceResolver>>,
145+
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
145146
}
146147

147148
impl LintRuleProvider {
148149
pub fn new(
149150
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
150-
workspace_resolver: Option<Arc<WorkspaceResolver>>,
151+
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
151152
) -> Self {
152153
Self {
153154
sloppy_imports_resolver,

cli/tools/lint/rules/no_sloppy_imports.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,19 @@ use text_lines::LineAndColumnIndex;
2424
use super::ExtendedLintRule;
2525
use crate::graph_util::CliJsrUrlProvider;
2626
use crate::resolver::CliSloppyImportsResolver;
27+
use crate::sys::CliSys;
2728

2829
#[derive(Debug)]
2930
pub struct NoSloppyImportsRule {
3031
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
3132
// None for making printing out the lint rules easy
32-
workspace_resolver: Option<Arc<WorkspaceResolver>>,
33+
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
3334
}
3435

3536
impl NoSloppyImportsRule {
3637
pub fn new(
3738
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
38-
workspace_resolver: Option<Arc<WorkspaceResolver>>,
39+
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
3940
) -> Self {
4041
NoSloppyImportsRule {
4142
sloppy_imports_resolver,
@@ -174,7 +175,7 @@ impl LintRule for NoSloppyImportsRule {
174175

175176
#[derive(Debug)]
176177
struct SloppyImportCaptureResolver<'a> {
177-
workspace_resolver: &'a WorkspaceResolver,
178+
workspace_resolver: &'a WorkspaceResolver<CliSys>,
178179
sloppy_imports_resolver: &'a CliSloppyImportsResolver,
179180
captures: RefCell<HashMap<Range, SloppyImportsResolution>>,
180181
}
@@ -188,7 +189,18 @@ impl<'a> deno_graph::source::Resolver for SloppyImportCaptureResolver<'a> {
188189
) -> Result<deno_ast::ModuleSpecifier, deno_graph::source::ResolveError> {
189190
let resolution = self
190191
.workspace_resolver
191-
.resolve(specifier_text, &referrer_range.specifier)
192+
.resolve(
193+
specifier_text,
194+
&referrer_range.specifier,
195+
match resolution_kind {
196+
ResolutionKind::Execution => {
197+
deno_config::workspace::ResolutionKind::Execution
198+
}
199+
ResolutionKind::Types => {
200+
deno_config::workspace::ResolutionKind::Types
201+
}
202+
},
203+
)
192204
.map_err(|err| ResolveError::Other(JsErrorBox::from_err(err)))?;
193205

194206
match resolution {

cli/tools/registry/unfurl.rs

+15-6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use deno_semver::Version;
3333
use deno_semver::VersionReq;
3434

3535
use crate::resolver::CliSloppyImportsResolver;
36+
use crate::sys::CliSys;
3637

3738
#[derive(Debug, Clone)]
3839
pub enum SpecifierUnfurlerDiagnostic {
@@ -190,14 +191,14 @@ enum UnfurlSpecifierError {
190191

191192
pub struct SpecifierUnfurler {
192193
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
193-
workspace_resolver: Arc<WorkspaceResolver>,
194+
workspace_resolver: Arc<WorkspaceResolver<CliSys>>,
194195
bare_node_builtins: bool,
195196
}
196197

197198
impl SpecifierUnfurler {
198199
pub fn new(
199200
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
200-
workspace_resolver: Arc<WorkspaceResolver>,
201+
workspace_resolver: Arc<WorkspaceResolver<CliSys>>,
201202
bare_node_builtins: bool,
202203
) -> Self {
203204
debug_assert_eq!(
@@ -252,9 +253,11 @@ impl SpecifierUnfurler {
252253
specifier: &str,
253254
resolution_kind: SloppyImportsResolutionKind,
254255
) -> Result<Option<String>, UnfurlSpecifierError> {
255-
let resolved = if let Ok(resolved) =
256-
self.workspace_resolver.resolve(specifier, referrer)
257-
{
256+
let resolved = if let Ok(resolved) = self.workspace_resolver.resolve(
257+
specifier,
258+
referrer,
259+
resolution_kind.into(),
260+
) {
258261
match resolved {
259262
MappedResolution::Normal { specifier, .. }
260263
| MappedResolution::ImportMap { specifier, .. } => Some(specifier),
@@ -758,6 +761,9 @@ mod tests {
758761
}],
759762
vec![Arc::new(package_json)],
760763
deno_config::workspace::PackageJsonDepResolution::Enabled,
764+
Default::default(),
765+
Default::default(),
766+
CliSys::default(),
761767
);
762768
let unfurler = SpecifierUnfurler::new(
763769
Some(Arc::new(CliSloppyImportsResolver::new(
@@ -900,6 +906,7 @@ export type * from "./c.d.ts";
900906
cwd.join("package.json"),
901907
json!({ "workspaces": ["./publish", "./subtract", "./add"] }),
902908
);
909+
let sys = CliSys::default();
903910
let workspace_resolver = WorkspaceResolver::new_raw(
904911
Arc::new(ModuleSpecifier::from_directory_path(&cwd).unwrap()),
905912
None,
@@ -920,8 +927,10 @@ export type * from "./c.d.ts";
920927
Arc::new(pkg_json_publishing),
921928
],
922929
deno_config::workspace::PackageJsonDepResolution::Enabled,
930+
Default::default(),
931+
Default::default(),
932+
sys.clone(),
923933
);
924-
let sys = CliSys::default();
925934
let unfurler = SpecifierUnfurler::new(
926935
Some(Arc::new(CliSloppyImportsResolver::new(
927936
SloppyImportsCachedFs::new(sys),

0 commit comments

Comments
 (0)