Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(check/lsp): support "compilerOptions.rootDirs" #27844

Merged
merged 8 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ deno_ast = { version = "=0.44.0", features = ["transpiling"] }
deno_core = { version = "0.333.0" }

deno_bench_util = { version = "0.181.0", path = "./bench_util" }
deno_config = { version = "=0.46.0", features = ["workspace"] }
deno_config = { version = "=0.47.1", features = ["workspace"] }
deno_lockfile = "=0.24.0"
deno_media_type = { version = "=0.2.5", features = ["module_specifier"] }
deno_npm = "=0.27.2"
Expand Down Expand Up @@ -204,7 +204,7 @@ slab = "0.4"
smallvec = "1.8"
socket2 = { version = "0.5.3", features = ["all"] }
spki = "0.7.2"
sys_traits = "=0.1.7"
sys_traits = "=0.1.8"
tar = "=0.4.40"
tempfile = "3.4.0"
termcolor = "1.1.3"
Expand Down
2 changes: 1 addition & 1 deletion cli/factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -711,7 +711,7 @@ impl CliFactory {

pub async fn workspace_resolver(
&self,
) -> Result<&Arc<WorkspaceResolver>, AnyError> {
) -> Result<&Arc<WorkspaceResolver<CliSys>>, AnyError> {
self.initialize_npm_resolution_if_managed().await?;
self.resolver_factory()?.workspace_resolver().await
}
Expand Down
8 changes: 5 additions & 3 deletions cli/lsp/analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1343,9 +1343,11 @@ impl CodeActionCollection {
.tree
.data_for_specifier(file_referrer?)?;
let workspace_resolver = config_data.resolver.clone();
let npm_ref = if let Ok(resolution) =
workspace_resolver.resolve(&dep_key, document.specifier())
{
let npm_ref = if let Ok(resolution) = workspace_resolver.resolve(
&dep_key,
document.specifier(),
deno_config::workspace::ResolutionKind::Execution,
) {
let specifier = match resolution {
MappedResolution::Normal { specifier, .. }
| MappedResolution::ImportMap { specifier, .. } => specifier,
Expand Down
9 changes: 6 additions & 3 deletions cli/lsp/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1205,7 +1205,7 @@ pub struct ConfigData {
pub vendor_dir: Option<PathBuf>,
pub lockfile: Option<Arc<CliLockfile>>,
pub npmrc: Option<Arc<ResolvedNpmRc>>,
pub resolver: Arc<WorkspaceResolver>,
pub resolver: Arc<WorkspaceResolver<CliSys>>,
pub sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
pub import_map_from_settings: Option<ModuleSpecifier>,
pub unstable: BTreeSet<String>,
Expand Down Expand Up @@ -1572,7 +1572,7 @@ impl ConfigData {
let resolver = member_dir
.workspace
.create_resolver(
&CliSys::default(),
CliSys::default(),
CreateResolverOptions {
pkg_json_dep_resolution,
specified_import_map,
Expand All @@ -1593,11 +1593,14 @@ impl ConfigData {
member_dir.workspace.resolver_jsr_pkgs().collect(),
member_dir.workspace.package_jsons().cloned().collect(),
pkg_json_dep_resolution,
Default::default(),
Default::default(),
CliSys::default(),
)
});
if !resolver.diagnostics().is_empty() {
lsp_warn!(
" Import map diagnostics:\n{}",
" Resolver diagnostics:\n{}",
resolver
.diagnostics()
.iter()
Expand Down
3 changes: 3 additions & 0 deletions cli/lsp/resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -851,6 +851,9 @@ impl<'a> ResolverFactory<'a> {
Vec::new(),
Vec::new(),
PackageJsonDepResolution::Disabled,
Default::default(),
Default::default(),
self.sys.clone(),
))
}),
is_byonm: self.config_data.map(|d| d.byonm).unwrap_or(false),
Expand Down
14 changes: 9 additions & 5 deletions cli/rt/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ struct SharedModuleLoaderState {
npm_registry_permission_checker: NpmRegistryReadPermissionChecker<DenoRtSys>,
npm_req_resolver: Arc<DenoRtNpmReqResolver>,
vfs: Arc<FileBackedVfs>,
workspace_resolver: WorkspaceResolver,
workspace_resolver: WorkspaceResolver<DenoRtSys>,
}

impl SharedModuleLoaderState {
Expand Down Expand Up @@ -201,10 +201,11 @@ impl ModuleLoader for EmbeddedModuleLoader {
);
}

let mapped_resolution = self
.shared
.workspace_resolver
.resolve(raw_specifier, &referrer);
let mapped_resolution = self.shared.workspace_resolver.resolve(
raw_specifier,
&referrer,
deno_config::workspace::ResolutionKind::Execution,
);

match mapped_resolution {
Ok(MappedResolution::WorkspaceJsrPackage { specifier, .. }) => {
Expand Down Expand Up @@ -859,6 +860,9 @@ pub async fn run(
.collect(),
pkg_jsons,
metadata.workspace_resolver.pkg_json_resolution,
Default::default(),
Default::default(),
sys.clone(),
)
};
let code_cache = match metadata.code_cache_key {
Expand Down
8 changes: 8 additions & 0 deletions cli/schemas/config-file.v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,14 @@
"default": false,
"markdownDescription": "Raise an error when a function parameter isn't read\n\nSee more: https://www.typescriptlang.org/tsconfig#noUnusedParameters"
},
"rootDirs": {
"description": "Declare many “virtual” directories acting as a single root.",
"type": "array",
"items": {
"type": "string"
},
"markdownDescription": "Declare many “virtual” directories acting as a single root.\n\nSee more: https://www.typescriptlang.org/tsconfig#rootDirs"
},
"strict": {
"description": "Enable all strict type checking options.",
"type": "boolean",
Expand Down
5 changes: 3 additions & 2 deletions cli/standalone/binary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ use crate::http_util::HttpClientProvider;
use crate::node::CliCjsCodeAnalyzer;
use crate::npm::CliNpmResolver;
use crate::resolver::CliCjsTracker;
use crate::sys::CliSys;
use crate::util::archive;
use crate::util::progress_bar::ProgressBar;
use crate::util::progress_bar::ProgressBarStyle;
Expand Down Expand Up @@ -194,7 +195,7 @@ pub struct DenoCompileBinaryWriter<'a> {
emitter: &'a Emitter,
http_client_provider: &'a HttpClientProvider,
npm_resolver: &'a CliNpmResolver,
workspace_resolver: &'a WorkspaceResolver,
workspace_resolver: &'a WorkspaceResolver<CliSys>,
npm_system_info: NpmSystemInfo,
}

Expand All @@ -208,7 +209,7 @@ impl<'a> DenoCompileBinaryWriter<'a> {
emitter: &'a Emitter,
http_client_provider: &'a HttpClientProvider,
npm_resolver: &'a CliNpmResolver,
workspace_resolver: &'a WorkspaceResolver,
workspace_resolver: &'a WorkspaceResolver<CliSys>,
npm_system_info: NpmSystemInfo,
) -> Self {
Self {
Expand Down
8 changes: 5 additions & 3 deletions cli/tools/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,11 @@ pub async fn info(
let cwd_url =
url::Url::from_directory_path(cli_options.initial_cwd()).unwrap();

let maybe_import_specifier = if let Ok(resolved) =
resolver.resolve(&specifier, &cwd_url)
{
let maybe_import_specifier = if let Ok(resolved) = resolver.resolve(
&specifier,
&cwd_url,
deno_config::workspace::ResolutionKind::Execution,
) {
match resolved {
deno_config::workspace::MappedResolution::Normal {
specifier, ..
Expand Down
5 changes: 3 additions & 2 deletions cli/tools/lint/rules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use deno_lint::rules::LintRule;
use deno_lint::tags;

use crate::resolver::CliSloppyImportsResolver;
use crate::sys::CliSys;

mod no_sloppy_imports;
mod no_slow_types;
Expand Down Expand Up @@ -141,13 +142,13 @@ impl ConfiguredRules {

pub struct LintRuleProvider {
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
workspace_resolver: Option<Arc<WorkspaceResolver>>,
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
}

impl LintRuleProvider {
pub fn new(
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
workspace_resolver: Option<Arc<WorkspaceResolver>>,
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
) -> Self {
Self {
sloppy_imports_resolver,
Expand Down
20 changes: 16 additions & 4 deletions cli/tools/lint/rules/no_sloppy_imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,19 @@ use text_lines::LineAndColumnIndex;
use super::ExtendedLintRule;
use crate::graph_util::CliJsrUrlProvider;
use crate::resolver::CliSloppyImportsResolver;
use crate::sys::CliSys;

#[derive(Debug)]
pub struct NoSloppyImportsRule {
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
// None for making printing out the lint rules easy
workspace_resolver: Option<Arc<WorkspaceResolver>>,
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
}

impl NoSloppyImportsRule {
pub fn new(
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
workspace_resolver: Option<Arc<WorkspaceResolver>>,
workspace_resolver: Option<Arc<WorkspaceResolver<CliSys>>>,
) -> Self {
NoSloppyImportsRule {
sloppy_imports_resolver,
Expand Down Expand Up @@ -174,7 +175,7 @@ impl LintRule for NoSloppyImportsRule {

#[derive(Debug)]
struct SloppyImportCaptureResolver<'a> {
workspace_resolver: &'a WorkspaceResolver,
workspace_resolver: &'a WorkspaceResolver<CliSys>,
sloppy_imports_resolver: &'a CliSloppyImportsResolver,
captures: RefCell<HashMap<Range, SloppyImportsResolution>>,
}
Expand All @@ -188,7 +189,18 @@ impl<'a> deno_graph::source::Resolver for SloppyImportCaptureResolver<'a> {
) -> Result<deno_ast::ModuleSpecifier, deno_graph::source::ResolveError> {
let resolution = self
.workspace_resolver
.resolve(specifier_text, &referrer_range.specifier)
.resolve(
specifier_text,
&referrer_range.specifier,
match resolution_kind {
ResolutionKind::Execution => {
deno_config::workspace::ResolutionKind::Execution
}
ResolutionKind::Types => {
deno_config::workspace::ResolutionKind::Types
}
},
)
.map_err(|err| ResolveError::Other(JsErrorBox::from_err(err)))?;

match resolution {
Expand Down
21 changes: 15 additions & 6 deletions cli/tools/registry/unfurl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ use deno_semver::Version;
use deno_semver::VersionReq;

use crate::resolver::CliSloppyImportsResolver;
use crate::sys::CliSys;

#[derive(Debug, Clone)]
pub enum SpecifierUnfurlerDiagnostic {
Expand Down Expand Up @@ -190,14 +191,14 @@ enum UnfurlSpecifierError {

pub struct SpecifierUnfurler {
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
workspace_resolver: Arc<WorkspaceResolver>,
workspace_resolver: Arc<WorkspaceResolver<CliSys>>,
bare_node_builtins: bool,
}

impl SpecifierUnfurler {
pub fn new(
sloppy_imports_resolver: Option<Arc<CliSloppyImportsResolver>>,
workspace_resolver: Arc<WorkspaceResolver>,
workspace_resolver: Arc<WorkspaceResolver<CliSys>>,
bare_node_builtins: bool,
) -> Self {
debug_assert_eq!(
Expand Down Expand Up @@ -252,9 +253,11 @@ impl SpecifierUnfurler {
specifier: &str,
resolution_kind: SloppyImportsResolutionKind,
) -> Result<Option<String>, UnfurlSpecifierError> {
let resolved = if let Ok(resolved) =
self.workspace_resolver.resolve(specifier, referrer)
{
let resolved = if let Ok(resolved) = self.workspace_resolver.resolve(
specifier,
referrer,
resolution_kind.into(),
) {
match resolved {
MappedResolution::Normal { specifier, .. }
| MappedResolution::ImportMap { specifier, .. } => Some(specifier),
Expand Down Expand Up @@ -758,6 +761,9 @@ mod tests {
}],
vec![Arc::new(package_json)],
deno_config::workspace::PackageJsonDepResolution::Enabled,
Default::default(),
Default::default(),
CliSys::default(),
);
let unfurler = SpecifierUnfurler::new(
Some(Arc::new(CliSloppyImportsResolver::new(
Expand Down Expand Up @@ -900,6 +906,7 @@ export type * from "./c.d.ts";
cwd.join("package.json"),
json!({ "workspaces": ["./publish", "./subtract", "./add"] }),
);
let sys = CliSys::default();
let workspace_resolver = WorkspaceResolver::new_raw(
Arc::new(ModuleSpecifier::from_directory_path(&cwd).unwrap()),
None,
Expand All @@ -920,8 +927,10 @@ export type * from "./c.d.ts";
Arc::new(pkg_json_publishing),
],
deno_config::workspace::PackageJsonDepResolution::Enabled,
Default::default(),
Default::default(),
sys.clone(),
);
let sys = CliSys::default();
let unfurler = SpecifierUnfurler::new(
Some(Arc::new(CliSloppyImportsResolver::new(
SloppyImportsCachedFs::new(sys),
Expand Down
Loading