improved semantic indexing
This commit is contained in:
@@ -580,16 +580,20 @@ function resolve_mod_fn(path, pkg) {
|
||||
|
||||
// given a path and a package context
|
||||
// return module info about where it was found
|
||||
function resolve_locator(path, ctx)
|
||||
// Resolve a module path to {path, scope, pkg} without compiling.
|
||||
function resolve_path(path, ctx)
|
||||
{
|
||||
var explicit = split_explicit_package_import(path)
|
||||
var explicit_path = null
|
||||
var fn = null
|
||||
var core_dir = null
|
||||
var core_file_path = null
|
||||
var is_core = null
|
||||
var scope = null
|
||||
var alias_path = null
|
||||
var ctx_dir = null
|
||||
var ctx_path = null
|
||||
var alias = null
|
||||
var package_path = null
|
||||
|
||||
if (explicit) {
|
||||
if (is_internal_path(explicit.path) && ctx && explicit.package != ctx)
|
||||
@@ -597,72 +601,60 @@ function resolve_locator(path, ctx)
|
||||
}
|
||||
if (explicit) {
|
||||
explicit_path = get_packages_dir() + '/' + safe_package_path(explicit.package) + '/' + explicit.path
|
||||
if (fd.is_file(explicit_path)) {
|
||||
fn = resolve_mod_fn(explicit_path, explicit.package)
|
||||
return {path: explicit_path, scope: SCOPE_PACKAGE, symbol: fn}
|
||||
}
|
||||
if (fd.is_file(explicit_path))
|
||||
return {path: explicit_path, scope: SCOPE_PACKAGE, pkg: explicit.package}
|
||||
}
|
||||
|
||||
// 1. If no context, resolve from core only
|
||||
if (!ctx) {
|
||||
core_dir = Shop.get_core_dir()
|
||||
core_file_path = core_dir + '/' + path
|
||||
if (fd.is_file(core_file_path)) {
|
||||
fn = resolve_mod_fn(core_file_path, 'core')
|
||||
return {path: core_file_path, scope: SCOPE_CORE, symbol: fn}
|
||||
}
|
||||
if (fd.is_file(core_file_path))
|
||||
return {path: core_file_path, scope: SCOPE_CORE, pkg: 'core'}
|
||||
return null
|
||||
}
|
||||
|
||||
// check in ctx package
|
||||
// If ctx is an absolute path (starts with /), use it directly
|
||||
// Otherwise, look it up in the packages directory
|
||||
var ctx_dir = null
|
||||
if (starts_with(ctx, '/')) {
|
||||
if (starts_with(ctx, '/'))
|
||||
ctx_dir = ctx
|
||||
} else {
|
||||
else
|
||||
ctx_dir = get_packages_dir() + '/' + safe_package_path(ctx)
|
||||
}
|
||||
var ctx_path = ctx_dir + '/' + path
|
||||
ctx_path = ctx_dir + '/' + path
|
||||
|
||||
if (fd.is_file(ctx_path)) {
|
||||
fn = resolve_mod_fn(ctx_path, ctx)
|
||||
// Check if ctx is the core package (either by name or by path)
|
||||
is_core = (ctx == 'core') || (ctx_dir == Shop.get_core_dir())
|
||||
scope = is_core ? SCOPE_CORE : SCOPE_LOCAL
|
||||
return {path: ctx_path, scope: scope, symbol: fn}
|
||||
return {path: ctx_path, scope: scope, pkg: ctx}
|
||||
}
|
||||
|
||||
if (is_internal_path(path))
|
||||
return null
|
||||
|
||||
// check for aliased dependency
|
||||
var alias = pkg_tools.split_alias(ctx, path)
|
||||
alias = pkg_tools.split_alias(ctx, path)
|
||||
if (alias) {
|
||||
alias_path = get_packages_dir() + '/' + safe_package_path(alias.package) + '/' + alias.path
|
||||
if (fd.is_file(alias_path)) {
|
||||
fn = resolve_mod_fn(alias_path, ctx)
|
||||
return {path: alias_path, scope:SCOPE_PACKAGE, symbol:fn}
|
||||
}
|
||||
if (fd.is_file(alias_path))
|
||||
return {path: alias_path, scope: SCOPE_PACKAGE, pkg: ctx}
|
||||
}
|
||||
|
||||
var package_path = get_packages_dir() + '/' + safe_package_path(path)
|
||||
if (fd.is_file(package_path)) {
|
||||
fn = resolve_mod_fn(package_path, ctx)
|
||||
return {path: package_path, scope: SCOPE_PACKAGE, symbol: fn}
|
||||
}
|
||||
package_path = get_packages_dir() + '/' + safe_package_path(path)
|
||||
if (fd.is_file(package_path))
|
||||
return {path: package_path, scope: SCOPE_PACKAGE, pkg: ctx}
|
||||
|
||||
// 4. Check core as fallback
|
||||
core_dir = Shop.get_core_dir()
|
||||
core_file_path = core_dir + '/' + path
|
||||
if (fd.is_file(core_file_path)) {
|
||||
fn = resolve_mod_fn(core_file_path, 'core')
|
||||
return {path: core_file_path, scope: SCOPE_CORE, symbol: fn}
|
||||
}
|
||||
if (fd.is_file(core_file_path))
|
||||
return {path: core_file_path, scope: SCOPE_CORE, pkg: 'core'}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
function resolve_locator(path, ctx)
|
||||
{
|
||||
var info = resolve_path(path, ctx)
|
||||
if (info == null) return null
|
||||
var fn = resolve_mod_fn(info.path, info.pkg)
|
||||
return {path: info.path, scope: info.scope, symbol: fn}
|
||||
}
|
||||
|
||||
// Generate symbol name for a C module file
|
||||
// e.g., make_c_symbol('core', 'math') -> 'js_core_math_use'
|
||||
function make_c_symbol(pkg, file) {
|
||||
@@ -1018,6 +1010,14 @@ Shop.use = function use(path, package_context) {
|
||||
|
||||
Shop.resolve_locator = resolve_locator
|
||||
|
||||
// Resolve a use() module path to a filesystem path without compiling.
|
||||
// Returns the absolute path string, or null if not found.
|
||||
Shop.resolve_use_path = function(path, ctx) {
|
||||
var info = resolve_path(path + '.cm', ctx)
|
||||
if (info == null) return null
|
||||
return info.path
|
||||
}
|
||||
|
||||
// Get cache path for a package and commit
|
||||
function get_cache_path(pkg, commit) {
|
||||
return global_shop_path + '/cache/' + replace(replace(pkg, '@','_'), '/','_') + '_' + commit + '.zip'
|
||||
|
||||
Reference in New Issue
Block a user