fix: path handling bug

This commit is contained in:
Shunsuke Shibayama 2024-01-21 02:26:58 +09:00
parent 74d304a1b7
commit cfc2214bfb
8 changed files with 26 additions and 21 deletions

View file

@ -31,6 +31,7 @@ use lsp_types::{
MarkupContent, MarkupKind, Position, Range, TextEdit, MarkupContent, MarkupKind, Position, Range, TextEdit,
}; };
use crate::_log;
use crate::server::{ELSResult, Flags, RedirectableStdout, Server}; use crate::server::{ELSResult, Flags, RedirectableStdout, Server};
use crate::util::{self, loc_to_pos, NormalizedUrl}; use crate::util::{self, loc_to_pos, NormalizedUrl};
@ -494,7 +495,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
&mut self, &mut self,
params: CompletionParams, params: CompletionParams,
) -> ELSResult<Option<CompletionResponse>> { ) -> ELSResult<Option<CompletionResponse>> {
self.send_log(format!("completion requested: {params:?}"))?; _log!(self, "completion requested: {params:?}");
let uri = NormalizedUrl::new(params.text_document_position.text_document.uri); let uri = NormalizedUrl::new(params.text_document_position.text_document.uri);
let path = util::uri_to_path(&uri); let path = util::uri_to_path(&uri);
let mut pos = params.text_document_position.position; let mut pos = params.text_document_position.position;
@ -587,6 +588,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
_ => None, _ => None,
}); });
let Some(mod_ctx) = self.get_mod_ctx(&uri) else { let Some(mod_ctx) = self.get_mod_ctx(&uri) else {
_log!(self, "module context not found: {uri}");
return Ok(None); return Ok(None);
}; };
for (name, vi) in contexts.into_iter().flat_map(|ctx| ctx.local_dir()) { for (name, vi) in contexts.into_iter().flat_map(|ctx| ctx.local_dir()) {
@ -637,7 +639,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
} }
result.extend(self.neighbor_completion(&uri, arg_pt, &mut already_appeared)); result.extend(self.neighbor_completion(&uri, arg_pt, &mut already_appeared));
} }
self.send_log(format!("completion items: {}", result.len()))?; _log!(self, "completion items: {}", result.len());
Ok(Some(CompletionResponse::Array(result))) Ok(Some(CompletionResponse::Array(result)))
} }

View file

@ -25,7 +25,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
} else if let Some(visitor) = self.get_visitor(uri) { } else if let Some(visitor) = self.get_visitor(uri) {
Ok(visitor.get_info(token)) Ok(visitor.get_info(token))
} else { } else {
self.send_log("not found")?; self.send_log("definition not found")?;
Ok(None) Ok(None)
} }
} }

View file

@ -185,11 +185,11 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
return Ok(()); return Ok(());
} }
let Some(old) = self.get_ast(&uri) else { let Some(old) = self.get_ast(&uri) else {
crate::_log!(self, "not found"); crate::_log!(self, "AST not found: {uri}");
return Ok(()); return Ok(());
}; };
let Ok(new) = self.build_ast(&uri) else { let Ok(new) = self.build_ast(&uri) else {
crate::_log!(self, "not found"); crate::_log!(self, "AST not found: {uri}");
return Ok(()); return Ok(());
}; };
let ast_diff = ASTDiff::diff(old, &new); let ast_diff = ASTDiff::diff(old, &new);

View file

@ -146,7 +146,7 @@ impl FileCache {
.files .files
.borrow_mut() .borrow_mut()
.get(uri) .get(uri)
.ok_or("not found")? .ok_or("file entry not found")?
.code .code
.clone()) .clone())
} }
@ -241,7 +241,7 @@ impl FileCache {
) -> ELSResult<Option<String>> { ) -> ELSResult<Option<String>> {
self.load_once(uri)?; self.load_once(uri)?;
let ent = self.files.borrow_mut(); let ent = self.files.borrow_mut();
let file = ent.get(uri).ok_or("not found")?; let file = ent.get(uri).ok_or("file entry not found")?;
let mut code = String::new(); let mut code = String::new();
for (i, line) in file.code.lines().enumerate() { for (i, line) in file.code.lines().enumerate() {
if i >= range.start.line as usize && i <= range.end.line as usize { if i >= range.start.line as usize && i <= range.end.line as usize {

View file

@ -755,7 +755,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
Some(MappedRwLockReadGuard::map(ent, |ent| &ent.module)) Some(MappedRwLockReadGuard::map(ent, |ent| &ent.module))
} }
pub(crate) fn raw_get_mod_ctx(&self, uri: &NormalizedUrl) -> Option<&ModuleContext> { pub(crate) fn get_raw_mod_ctx(&self, uri: &NormalizedUrl) -> Option<&ModuleContext> {
let path = uri.to_file_path().ok()?; let path = uri.to_file_path().ok()?;
self.shared.raw_ref_ctx(&path) self.shared.raw_ref_ctx(&path)
} }
@ -789,7 +789,10 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
pub(crate) fn get_visitor(&self, uri: &NormalizedUrl) -> Option<HIRVisitor> { pub(crate) fn get_visitor(&self, uri: &NormalizedUrl) -> Option<HIRVisitor> {
let path = uri.to_file_path().ok()?; let path = uri.to_file_path().ok()?;
let ent = self.shared.get_module(&path)?; let Some(ent) = self.shared.get_module(&path) else {
_log!(self, "module not found: {uri}");
return None;
};
ent.hir.as_ref()?; ent.hir.as_ref()?;
let hir = MappedRwLockReadGuard::map(ent, |ent| ent.hir.as_ref().unwrap()); let hir = MappedRwLockReadGuard::map(ent, |ent| ent.hir.as_ref().unwrap());
Some(HIRVisitor::new(hir, &self.file_cache, uri.clone())) Some(HIRVisitor::new(hir, &self.file_cache, uri.clone()))
@ -810,7 +813,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
pub(crate) fn get_local_ctx(&self, uri: &NormalizedUrl, pos: Position) -> Vec<&Context> { pub(crate) fn get_local_ctx(&self, uri: &NormalizedUrl, pos: Position) -> Vec<&Context> {
let mut ctxs = vec![]; let mut ctxs = vec![];
if let Some(mod_ctx) = self.raw_get_mod_ctx(uri) { if let Some(mod_ctx) = self.get_raw_mod_ctx(uri) {
if let Some(visitor) = self.get_visitor(uri) { if let Some(visitor) = self.get_visitor(uri) {
// FIXME: // FIXME:
let mut ns = visitor.get_namespace(pos); let mut ns = visitor.get_namespace(pos);
@ -826,7 +829,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
} }
ctxs.push(&mod_ctx.context); ctxs.push(&mod_ctx.context);
} }
let builtin_ctx = self.get_builtin_module(); let builtin_ctx = self.get_raw_builtin_module();
ctxs.extend(builtin_ctx); ctxs.extend(builtin_ctx);
ctxs ctxs
} }
@ -859,7 +862,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
continue; continue;
}; };
let uri = NormalizedUrl::from_file_path(neighbor.path()).unwrap(); let uri = NormalizedUrl::from_file_path(neighbor.path()).unwrap();
if let Some(mod_ctx) = self.raw_get_mod_ctx(&uri) { if let Some(mod_ctx) = self.get_raw_mod_ctx(&uri) {
ctxs.push(&mod_ctx.context); ctxs.push(&mod_ctx.context);
} }
} }
@ -872,7 +875,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
uri: &NormalizedUrl, uri: &NormalizedUrl,
attr_marker_pos: Position, attr_marker_pos: Position,
) -> ELSResult<(Option<Type>, Vec<&Context>)> { ) -> ELSResult<(Option<Type>, Vec<&Context>)> {
let Some(module) = self.raw_get_mod_ctx(uri) else { let Some(module) = self.get_raw_mod_ctx(uri) else {
return Ok((None, vec![])); return Ok((None, vec![]));
}; };
let maybe_token = self.file_cache.get_receiver(uri, attr_marker_pos); let maybe_token = self.file_cache.get_receiver(uri, attr_marker_pos);
@ -909,7 +912,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
} }
} }
pub(crate) fn get_builtin_module(&self) -> Option<&Context> { pub(crate) fn get_raw_builtin_module(&self) -> Option<&Context> {
self.shared.raw_ref_builtins_ctx().map(|mc| &mc.context) self.shared.raw_ref_builtins_ctx().map(|mc| &mc.context)
} }

View file

@ -125,7 +125,7 @@ COMMAND
compile compile compile compile
transpile transpile transpile transpile
run|exec execute (default mode) run|exec execute (default mode)
server execute language server", server start Erg language server",
) )
} }

View file

@ -2968,7 +2968,7 @@ impl<A: ASTBuildable> GenericASTLowerer<A> {
let mut builder = GenericHIRBuilder::<A>::new_submodule(mod_ctx, &mod_name); let mut builder = GenericHIRBuilder::<A>::new_submodule(mod_ctx, &mod_name);
builder.lowerer.module.context.cfg.input = inline.input.clone(); builder.lowerer.module.context.cfg.input = inline.input.clone();
builder.cfg_mut().input = inline.input.clone(); builder.cfg_mut().input = inline.input.clone();
let mode = if path.to_string_lossy().ends_with("d.er") { let mode = if path.to_string_lossy().ends_with(".d.er") {
"declare" "declare"
} else { } else {
"exec" "exec"
@ -2985,7 +2985,7 @@ impl<A: ASTBuildable> GenericASTLowerer<A> {
} }
}; };
let ctx = builder.pop_mod_ctx().unwrap(); let ctx = builder.pop_mod_ctx().unwrap();
let cache = if path.to_string_lossy().ends_with("d.er") { let cache = if path.to_string_lossy().ends_with(".d.er") {
&self.module.context.shared().py_mod_cache &self.module.context.shared().py_mod_cache
} else { } else {
&self.module.context.shared().mod_cache &self.module.context.shared().mod_cache

View file

@ -97,7 +97,7 @@ impl SharedCompilerResource {
} }
pub fn insert_module(&self, path: NormalizedPathBuf, entry: ModuleEntry) { pub fn insert_module(&self, path: NormalizedPathBuf, entry: ModuleEntry) {
if path.to_string_lossy().ends_with("d.er") { if path.to_string_lossy().ends_with(".d.er") {
self.py_mod_cache.insert(path, entry); self.py_mod_cache.insert(path, entry);
} else { } else {
self.mod_cache.insert(path, entry); self.mod_cache.insert(path, entry);
@ -105,7 +105,7 @@ impl SharedCompilerResource {
} }
pub fn remove_module(&self, path: &std::path::Path) -> Option<ModuleEntry> { pub fn remove_module(&self, path: &std::path::Path) -> Option<ModuleEntry> {
if path.to_string_lossy().ends_with("d.er") { if path.to_string_lossy().ends_with(".d.er") {
self.py_mod_cache.remove(path) self.py_mod_cache.remove(path)
} else { } else {
self.mod_cache.remove(path) self.mod_cache.remove(path)
@ -113,7 +113,7 @@ impl SharedCompilerResource {
} }
pub fn get_module(&self, path: &std::path::Path) -> Option<MappedRwLockReadGuard<ModuleEntry>> { pub fn get_module(&self, path: &std::path::Path) -> Option<MappedRwLockReadGuard<ModuleEntry>> {
if path.to_string_lossy().ends_with("d.er") { if path.to_string_lossy().ends_with(".d.er") {
self.py_mod_cache.get(path) self.py_mod_cache.get(path)
} else { } else {
self.mod_cache.get(path) self.mod_cache.get(path)
@ -121,7 +121,7 @@ impl SharedCompilerResource {
} }
pub fn raw_ref_ctx(&self, path: &std::path::Path) -> Option<&ModuleContext> { pub fn raw_ref_ctx(&self, path: &std::path::Path) -> Option<&ModuleContext> {
if path.to_string_lossy().ends_with("d.er") { if path.to_string_lossy().ends_with(".d.er") {
self.py_mod_cache.raw_ref_ctx(path) self.py_mod_cache.raw_ref_ctx(path)
} else { } else {
self.mod_cache.raw_ref_ctx(path) self.mod_cache.raw_ref_ctx(path)