mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 04:24:43 +00:00
chore: resolve decl package path
This commit is contained in:
parent
027009680a
commit
14bf431c57
5 changed files with 36 additions and 14 deletions
|
@ -499,7 +499,7 @@ impl Input {
|
||||||
|
|
||||||
pub fn resolve_path(&self, path: &Path, cfg: &ErgConfig) -> Option<PathBuf> {
|
pub fn resolve_path(&self, path: &Path, cfg: &ErgConfig) -> Option<PathBuf> {
|
||||||
self.resolve_real_path(path, cfg)
|
self.resolve_real_path(path, cfg)
|
||||||
.or_else(|| self.resolve_decl_path(path))
|
.or_else(|| self.resolve_decl_path(path, cfg))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// resolution order:
|
/// resolution order:
|
||||||
|
@ -507,7 +507,7 @@ impl Input {
|
||||||
/// 2. `./{path/to}/__init__.er`
|
/// 2. `./{path/to}/__init__.er`
|
||||||
/// 3. `std/{path/to}.er`
|
/// 3. `std/{path/to}.er`
|
||||||
/// 4. `std/{path/to}/__init__.er`
|
/// 4. `std/{path/to}/__init__.er`
|
||||||
/// 5. `pkgs/{path/to}/lib.er`
|
/// 5. `pkgs/{path/to}/src/lib.er`
|
||||||
pub fn resolve_real_path(&self, path: &Path, cfg: &ErgConfig) -> Option<PathBuf> {
|
pub fn resolve_real_path(&self, path: &Path, cfg: &ErgConfig) -> Option<PathBuf> {
|
||||||
if let Ok(path) = self.resolve_local(path) {
|
if let Ok(path) = self.resolve_local(path) {
|
||||||
Some(path)
|
Some(path)
|
||||||
|
@ -522,7 +522,7 @@ impl Input {
|
||||||
.canonicalize()
|
.canonicalize()
|
||||||
{
|
{
|
||||||
Some(normalize_path(path))
|
Some(normalize_path(path))
|
||||||
} else if let Some(pkg) = self.resolve_project_dep_path(path, cfg) {
|
} else if let Some(pkg) = self.resolve_project_dep_path(path, cfg, false) {
|
||||||
Some(normalize_path(pkg))
|
Some(normalize_path(pkg))
|
||||||
} else if path == Path::new("unsound") {
|
} else if path == Path::new("unsound") {
|
||||||
Some(PathBuf::from("unsound"))
|
Some(PathBuf::from("unsound"))
|
||||||
|
@ -531,7 +531,12 @@ impl Input {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_project_dep_path(&self, path: &Path, cfg: &ErgConfig) -> Option<PathBuf> {
|
fn resolve_project_dep_path(
|
||||||
|
&self,
|
||||||
|
path: &Path,
|
||||||
|
cfg: &ErgConfig,
|
||||||
|
decl: bool,
|
||||||
|
) -> Option<PathBuf> {
|
||||||
let name = format!("{}", path.display());
|
let name = format!("{}", path.display());
|
||||||
let pkg = cfg.packages.iter().find(|p| p.as_name == name)?;
|
let pkg = cfg.packages.iter().find(|p| p.as_name == name)?;
|
||||||
let path = if let Some(path) = pkg.path {
|
let path = if let Some(path) = pkg.path {
|
||||||
|
@ -539,7 +544,12 @@ impl Input {
|
||||||
} else {
|
} else {
|
||||||
erg_pkgs_path().join(pkg.name).join(pkg.version)
|
erg_pkgs_path().join(pkg.name).join(pkg.version)
|
||||||
};
|
};
|
||||||
Some(path.join("src").join("lib.er"))
|
let path = if decl {
|
||||||
|
path.join("src").join("lib.d.er")
|
||||||
|
} else {
|
||||||
|
path.join("src").join("lib.er")
|
||||||
|
};
|
||||||
|
path.canonicalize().ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// resolution order:
|
/// resolution order:
|
||||||
|
@ -552,9 +562,10 @@ impl Input {
|
||||||
/// (and repeat for the project root)
|
/// (and repeat for the project root)
|
||||||
/// 7. `std/{path/to}.d.er`
|
/// 7. `std/{path/to}.d.er`
|
||||||
/// 8. `std/{path/to}/__init__.d.er`
|
/// 8. `std/{path/to}/__init__.d.er`
|
||||||
/// 9. `site-packages/{path}/__pycache__/{to}.d.er`
|
/// 9. `pkgs/{path/to}/src/lib.d.er`
|
||||||
/// 10. `site-packages/{path/to}/__pycache__/__init__.d.er`
|
/// 10. `site-packages/{path}/__pycache__/{to}.d.er`
|
||||||
pub fn resolve_decl_path(&self, path: &Path) -> Option<PathBuf> {
|
/// 11. `site-packages/{path/to}/__pycache__/__init__.d.er`
|
||||||
|
pub fn resolve_decl_path(&self, path: &Path, cfg: &ErgConfig) -> Option<PathBuf> {
|
||||||
if let Ok(path) = self.resolve_local_decl(self.dir(), path) {
|
if let Ok(path) = self.resolve_local_decl(self.dir(), path) {
|
||||||
return Some(path);
|
return Some(path);
|
||||||
}
|
}
|
||||||
|
@ -579,6 +590,9 @@ impl Input {
|
||||||
return Some(path);
|
return Some(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let Some(pkg) = self.resolve_project_dep_path(path, cfg, true) {
|
||||||
|
return Some(normalize_path(pkg));
|
||||||
|
}
|
||||||
for site_packages in python_site_packages() {
|
for site_packages in python_site_packages() {
|
||||||
if let Some(path) = Self::resolve_site_pkgs_decl_path(site_packages, path) {
|
if let Some(path) = Self::resolve_site_pkgs_decl_path(site_packages, path) {
|
||||||
return Some(path);
|
return Some(path);
|
||||||
|
|
|
@ -13,7 +13,7 @@ use std::time::{Duration, SystemTime};
|
||||||
use erg_common::config::ErgMode;
|
use erg_common::config::ErgMode;
|
||||||
|
|
||||||
use erg_common::config::ErgConfig;
|
use erg_common::config::ErgConfig;
|
||||||
use erg_common::consts::ELS;
|
use erg_common::consts::{DEBUG_MODE, ELS};
|
||||||
use erg_common::debug_power_assert;
|
use erg_common::debug_power_assert;
|
||||||
use erg_common::dict::Dict;
|
use erg_common::dict::Dict;
|
||||||
use erg_common::env::is_std_decl_path;
|
use erg_common::env::is_std_decl_path;
|
||||||
|
@ -525,7 +525,11 @@ impl<ASTBuilder: ASTBuildable, HIRBuilder: Buildable>
|
||||||
.spawn()
|
.spawn()
|
||||||
.and_then(|mut child| child.wait())
|
.and_then(|mut child| child.wait())
|
||||||
{
|
{
|
||||||
if let Some(path) = self.cfg.input.resolve_decl_path(Path::new(&__name__[..])) {
|
if let Some(path) = self
|
||||||
|
.cfg
|
||||||
|
.input
|
||||||
|
.resolve_decl_path(Path::new(&__name__[..]), &self.cfg)
|
||||||
|
{
|
||||||
let size = metadata(&path).unwrap().len();
|
let size = metadata(&path).unwrap().len();
|
||||||
// if pylyzer crashed
|
// if pylyzer crashed
|
||||||
if !status.success() && size == 0 {
|
if !status.success() && size == 0 {
|
||||||
|
@ -728,7 +732,7 @@ impl<ASTBuilder: ASTBuildable, HIRBuilder: Buildable>
|
||||||
// return;
|
// return;
|
||||||
} else if let Some(inliner) = self.inlines.get(path).cloned() {
|
} else if let Some(inliner) = self.inlines.get(path).cloned() {
|
||||||
self.build_deps_and_module(&inliner, graph);
|
self.build_deps_and_module(&inliner, graph);
|
||||||
} else {
|
} else if DEBUG_MODE {
|
||||||
todo!("{path} is not found in self.inlines and self.asts");
|
todo!("{path} is not found in self.inlines and self.asts");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1445,7 +1445,7 @@ pub(crate) fn resolve_decl_path_func(
|
||||||
return Err(type_mismatch("Str", other, "Path"));
|
return Err(type_mismatch("Str", other, "Path"));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let Some(path) = ctx.cfg.input.resolve_decl_path(path) else {
|
let Some(path) = ctx.cfg.input.resolve_decl_path(path, &ctx.cfg) else {
|
||||||
return Err(ErrorCore::new(
|
return Err(ErrorCore::new(
|
||||||
vec![SubMessage::only_loc(Location::Unknown)],
|
vec![SubMessage::only_loc(Location::Unknown)],
|
||||||
format!("Path {} is not found", path.display()),
|
format!("Path {} is not found", path.display()),
|
||||||
|
|
|
@ -2262,7 +2262,11 @@ impl Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_decl_path(&self, __name__: &Str, loc: &impl Locational) -> CompileResult<PathBuf> {
|
fn get_decl_path(&self, __name__: &Str, loc: &impl Locational) -> CompileResult<PathBuf> {
|
||||||
match self.cfg.input.resolve_decl_path(Path::new(&__name__[..])) {
|
match self
|
||||||
|
.cfg
|
||||||
|
.input
|
||||||
|
.resolve_decl_path(Path::new(&__name__[..]), &self.cfg)
|
||||||
|
{
|
||||||
Some(path) => {
|
Some(path) => {
|
||||||
if self.cfg.input.decl_file_is(&path) {
|
if self.cfg.input.decl_file_is(&path) {
|
||||||
return Ok(path);
|
return Ok(path);
|
||||||
|
|
|
@ -483,7 +483,7 @@ impl<'a> HIRLinker<'a> {
|
||||||
let mod_path = self
|
let mod_path = self
|
||||||
.cfg
|
.cfg
|
||||||
.input
|
.input
|
||||||
.resolve_decl_path(Path::new(&mod_name_str[..]))
|
.resolve_decl_path(Path::new(&mod_name_str[..]), self.cfg)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
if !mod_path
|
if !mod_path
|
||||||
.canonicalize()
|
.canonicalize()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue