Skip to content
Open
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
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ members = [
version = "0.6.53"
authors = ["erg-lang team <moderation.erglang@gmail.com>"]
license = "MIT OR Apache-2.0"
edition = "2021"
edition = "2024"
repository = "https://github.com/erg-lang/erg"
homepage = "https://erg-lang.org/"

Expand Down
10 changes: 4 additions & 6 deletions crates/els/call_hierarchy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
let Some(pos) = loc_to_pos(referrer_loc.loc) else {
continue;
};
if let Some(def) = self.get_min::<Def>(&uri, pos) {
if def.sig.is_subr() {
if let Some(def) = self.get_min::<Def>(&uri, pos)
&& def.sig.is_subr() {
let Some(from) =
hierarchy_item(def.sig.inspect().to_string(), &def.sig.ident().vi)
else {
Expand All @@ -67,7 +67,6 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
};
res.push(call);
}
}
}
}
Ok(Some(res))
Expand Down Expand Up @@ -196,14 +195,13 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
let mut res = vec![];
let uri = NormalizedUrl::new(params.text_document_position_params.text_document.uri);
let pos = params.text_document_position_params.position;
if let Some(token) = self.file_cache.get_symbol(&uri, pos) {
if let Some(vi) = self.get_definition(&uri, &token)? {
if let Some(token) = self.file_cache.get_symbol(&uri, pos)
&& let Some(vi) = self.get_definition(&uri, &token)? {
let Some(item) = hierarchy_item(token.content.to_string(), &vi) else {
return Ok(None);
};
res.push(item);
}
}
Ok(Some(res))
}
}
5 changes: 2 additions & 3 deletions crates/els/code_action.rs
Original file line number Diff line number Diff line change
Expand Up @@ -194,12 +194,11 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
fn send_normal_action(&self, params: &CodeActionParams) -> ELSResult<Vec<CodeAction>> {
let mut actions = vec![];
let uri = NormalizedUrl::new(params.text_document.uri.clone());
if let Some(token) = self.file_cache.get_token(&uri, params.range.start) {
if token.is(TokenKind::Symbol) && !token.is_const() && !token.content.is_snake_case() {
if let Some(token) = self.file_cache.get_token(&uri, params.range.start)
&& token.is(TokenKind::Symbol) && !token.is_const() && !token.content.is_snake_case() {
let action = self.gen_change_case_action(token, &uri, params.clone());
actions.extend(action);
}
}
actions.extend(self.send_quick_fix(params)?);
actions.extend(self.gen_extract_action(params));
actions.extend(self.gen_inline_action(params));
Expand Down
5 changes: 2 additions & 3 deletions crates/els/completion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -662,8 +662,8 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
}
_ => None,
});
if PYTHON_MODE {
if let Some(receiver_t) = &receiver_t {
if PYTHON_MODE
&& let Some(receiver_t) = &receiver_t {
for (field, ty) in mod_ctx.context.fields(receiver_t) {
let mut item =
CompletionItem::new_simple(field.symbol.to_string(), ty.to_string());
Expand All @@ -681,7 +681,6 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
result.push(item);
}
}
}
if let Some(receiver_t) = &receiver_t {
result.extend(self.magic_completion_items(
&comp_kind,
Expand Down
4 changes: 1 addition & 3 deletions crates/els/definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
// `{x;} = import "foo"` => jump to `x` of `foo.er`
if vi.def_loc.module == Some(util::uri_to_path(uri).into())
&& vi.def_loc.loc == token.loc()
{
if let Some(def) = self.get_min::<Def>(uri, pos) {
&& let Some(def) = self.get_min::<Def>(uri, pos) {
if def.def_kind().is_import() {
if let Some(mod_uri) =
vi.t.module_path()
Expand Down Expand Up @@ -101,7 +100,6 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
}
}
}
}
match (vi.def_loc.module, util::loc_to_range(vi.def_loc.loc)) {
(Some(path), Some(range)) => {
let def_uri = Url::from_file_path(path).unwrap();
Expand Down
5 changes: 2 additions & 3 deletions crates/els/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -419,14 +419,13 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
file_vers.insert(uri.clone(), latest_ver);
continue;
};
if latest_ver != ver {
if let Ok(code) = _self.file_cache.get_entire_code(&uri) {
if latest_ver != ver
&& let Ok(code) = _self.file_cache.get_entire_code(&uri) {
let mut checked = Set::new();
let _ = _self.check_file(uri.clone(), code, &mut checked);
_self.send_empty_diagnostics(checked).unwrap();
file_vers.insert(uri, latest_ver);
}
}
}
sleep(Duration::from_millis(500));
}
Expand Down
4 changes: 1 addition & 3 deletions crates/els/diff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,9 @@ impl HIRDiff {
if let ast::Expr::Def(def)
| ast::Expr::ClassDef(ast::ClassDef { def, .. })
| ast::Expr::PatchDef(ast::PatchDef { def, .. }) = &expr
{
if let Some(name) = def.sig.name_as_str() {
&& let Some(name) = def.sig.name_as_str() {
lowerer.unregister(name);
}
}
let expr = match lowerer.lower_and_resolve_chunk(expr, None) {
Ok(expr) => expr,
Err((opt_expr, _err)) => opt_expr?,
Expand Down
5 changes: 2 additions & 3 deletions crates/els/doc_highlight.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
let Some(visitor) = self.get_visitor(uri) else {
return res;
};
if let Some(tok) = self.file_cache.get_symbol(uri, pos) {
if let Some(vi) = visitor.get_info(&tok) {
if let Some(tok) = self.file_cache.get_symbol(uri, pos)
&& let Some(vi) = visitor.get_info(&tok) {
if let Some(range) = loc_to_range(vi.def_loc.loc) {
res.push(DocumentHighlight {
range,
Expand All @@ -41,7 +41,6 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
});
}
}
}
res
}
}
5 changes: 2 additions & 3 deletions crates/els/doc_link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,10 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
tooltip: Some(format!("module {word}")),
data: None,
});
} else if let Some((_, vi)) = mod_ctx.context.get_type_info(&typ) {
if let Some(doc) = self.gen_doc_link_from_vi(word, range, vi) {
} else if let Some((_, vi)) = mod_ctx.context.get_type_info(&typ)
&& let Some(doc) = self.gen_doc_link_from_vi(word, range, vi) {
res.push(doc);
}
}
col += word.len() as u32 + 1;
}
line += 1;
Expand Down
5 changes: 2 additions & 3 deletions crates/els/file_cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -274,12 +274,11 @@ impl FileCache {
pub(crate) fn update(&self, uri: &NormalizedUrl, code: String, ver: Option<i32>) {
let lock = self.files.borrow_mut();
let entry = lock.get(uri);
if let Some(entry) = entry {
if ver.is_some_and(|ver| ver <= entry.ver) {
if let Some(entry) = entry
&& ver.is_some_and(|ver| ver <= entry.ver) {
// crate::_log!(self, "171: double update detected: {ver:?}, {}, code:\n{}", entry.ver, entry.code);
return;
}
}
let token_stream = match Lexer::from_str(code.clone()).lex() {
Ok(ts) => Some(ts),
Err((ts, es)) => {
Expand Down
30 changes: 12 additions & 18 deletions crates/els/hir_visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -350,11 +350,10 @@ impl<'a> HIRVisitor<'a> {
return Some(expr);
}
}
if let Some(var) = &args.var_args {
if let Some(expr) = self.get_expr(&var.expr, pos) {
if let Some(var) = &args.var_args
&& let Some(expr) = self.get_expr(&var.expr, pos) {
return Some(expr);
}
}
for arg in args.kw_args.iter() {
if let Some(expr) = self.get_expr(&arg.expr, pos) {
return Some(expr);
Expand Down Expand Up @@ -628,11 +627,10 @@ impl HIRVisitor<'_> {
}

fn get_call_info(&self, call: &Call, token: &Token) -> Option<VarInfo> {
if let Some(attr) = &call.attr_name {
if let Some(t) = self.return_var_info_if_same(attr, attr.raw.name.token(), token) {
if let Some(attr) = &call.attr_name
&& let Some(t) = self.return_var_info_if_same(attr, attr.raw.name.token(), token) {
return Some(t);
}
}
self.get_expr_info(&call.obj, token)
.or_else(|| self.get_args_info(&call.args, token))
}
Expand All @@ -643,11 +641,10 @@ impl HIRVisitor<'_> {
return Some(vi);
}
}
if let Some(var) = &args.var_args {
if let Some(vi) = self.get_expr_info(&var.expr, token) {
if let Some(var) = &args.var_args
&& let Some(vi) = self.get_expr_info(&var.expr, token) {
return Some(vi);
}
}
for arg in args.kw_args.iter() {
if let Some(vi) = self.get_expr_info(&arg.expr, token) {
return Some(vi);
Expand Down Expand Up @@ -715,11 +712,10 @@ impl HIRVisitor<'_> {
}
}
for guard in params.guards.iter() {
if let GuardClause::Bind(bind) = guard {
if let Some(vi) = self.get_def_info(bind, token) {
if let GuardClause::Bind(bind) = guard
&& let Some(vi) = self.get_def_info(bind, token) {
return Some(vi);
}
}
}
None
}
Expand Down Expand Up @@ -869,21 +865,19 @@ impl HIRVisitor<'_> {
return Some(parent);
}
}
if let Some(var) = &call.args.var_args {
if let Some(parent) = self.get_parent_expr(&var.expr, expr_loc) {
if let Some(var) = &call.args.var_args
&& let Some(parent) = self.get_parent_expr(&var.expr, expr_loc) {
return Some(parent);
}
}
for arg in call.args.kw_args.iter() {
if let Some(parent) = self.get_parent_expr(&arg.expr, expr_loc) {
return Some(parent);
}
}
if let Some(kw_var) = &call.args.kw_var {
if let Some(parent) = self.get_parent_expr(&kw_var.expr, expr_loc) {
if let Some(kw_var) = &call.args.kw_var
&& let Some(parent) = self.get_parent_expr(&kw_var.expr, expr_loc) {
return Some(parent);
}
}
None
}
Expr::Def(def) => {
Expand Down
10 changes: 4 additions & 6 deletions crates/els/hover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,15 +168,14 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
}
// not found or not symbol, etc.
None => {
if let Some(visitor) = self.get_visitor(&uri) {
if let Some(typ) = visitor.get_min_expr(pos) {
if let Some(visitor) = self.get_visitor(&uri)
&& let Some(typ) = visitor.get_min_expr(pos) {
let typ = MarkedString::from_language_code(
ERG_LANG.into(),
format!("{}: {typ}", token.content),
);
contents.push(typ);
}
}
}
}
if let Some(visitor) = self.get_visitor(&uri) {
Expand Down Expand Up @@ -243,8 +242,8 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
}) else {
continue;
};
if let Some((_, vi)) = module.context.get_type_info(&inner_t) {
if let Some(url) = vi
if let Some((_, vi)) = module.context.get_type_info(&inner_t)
&& let Some(url) = vi
.def_loc
.module
.as_ref()
Expand All @@ -256,7 +255,6 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
vi.def_loc.loc.ln_begin().unwrap_or(1)
);
}
}
}
}
if !defs.is_empty() {
Expand Down
19 changes: 8 additions & 11 deletions crates/els/inlay_hint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,38 +187,35 @@ impl<C: BuildRunnable, P: Parsable> InlayHintGenerator<'_, C, P> {
let hint = self.type_anot(ln, col, return_t, subr.params.parens.is_none());
result.push(hint);
}
if subr.params.parens.is_none() {
if let Some((ln, col)) = subr.params.ln_begin().zip(subr.params.col_begin()) {
if subr.params.parens.is_none()
&& let Some((ln, col)) = subr.params.ln_begin().zip(subr.params.col_begin()) {
let hint = self.anot(ln, col, "(".to_string());
result.push(hint);
}
}
}
result
}

fn get_var_def_hint(&self, def: &Def) -> Vec<InlayHint> {
let mut result = self.get_block_hint(&def.body.block);
// don't show hints for compiler internal variables
if def.sig.t_spec().is_none() && !def.sig.ident().inspect().starts_with(['%']) {
if let Some((ln, col)) = def.sig.ln_begin().zip(def.sig.col_end()) {
if def.sig.t_spec().is_none() && !def.sig.ident().inspect().starts_with(['%'])
&& let Some((ln, col)) = def.sig.ln_begin().zip(def.sig.col_end()) {
let hint = self.type_anot(ln, col, def.sig.ident().ref_t(), false);
result.push(hint);
}
}
result
}

fn get_lambda_hint(&self, lambda: &Lambda) -> Vec<InlayHint> {
let mut result = vec![];
result.extend(self.get_block_hint(&lambda.body));
result.extend(self.get_param_hint(&lambda.params));
if lambda.params.parens.is_none() {
if let Some((ln, col)) = lambda.params.ln_begin().zip(lambda.params.col_begin()) {
if lambda.params.parens.is_none()
&& let Some((ln, col)) = lambda.params.ln_begin().zip(lambda.params.col_begin()) {
let hint = self.anot(ln, col, "(".to_string());
result.push(hint);
}
}
if let Some(((ln, col), return_t)) = lambda
.params
.ln_end()
Expand Down Expand Up @@ -306,13 +303,13 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
self.send_log(format!("inlay hint request: {params:?}"))?;
let uri = NormalizedUrl::new(params.text_document.uri);
let mut result = vec![];
let gen = InlayHintGenerator {
let hint_gen = InlayHintGenerator {
_server: self,
uri: uri.clone().raw().to_string().into(),
};
if let Some(hir) = self.get_hir(&uri) {
for chunk in hir.module.iter() {
result.extend(gen.get_expr_hint(chunk));
result.extend(hint_gen.get_expr_hint(chunk));
}
}
Ok(Some(result))
Expand Down
8 changes: 3 additions & 5 deletions crates/els/references.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,11 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
}

fn show_refs_inner(&self, uri: &NormalizedUrl, pos: Position) -> Vec<lsp_types::Location> {
if let Some(tok) = self.file_cache.get_symbol(uri, pos) {
if let Some(visitor) = self.get_visitor(uri) {
if let Some(vi) = visitor.get_info(&tok) {
if let Some(tok) = self.file_cache.get_symbol(uri, pos)
&& let Some(visitor) = self.get_visitor(uri)
&& let Some(vi) = visitor.get_info(&tok) {
return self.get_refs_from_abs_loc(&vi.def_loc);
}
}
}
vec![]
}

Expand Down
5 changes: 2 additions & 3 deletions crates/els/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -282,11 +282,10 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
if let Some(&feature) = args.next() {
disabled_features.push(DefaultFeatures::from(feature));
}
} else if arg == "--enable" {
if let Some(&feature) = args.next() {
} else if arg == "--enable"
&& let Some(&feature) = args.next() {
opt_features.push(OptionalFeatures::from(feature));
}
}
}
let external_items = !disabled_features.contains(&DefaultFeatures::DeepCompletion);
Self {
Expand Down
5 changes: 2 additions & 3 deletions crates/els/sig_help.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,10 @@ impl<Checker: BuildRunnable, Parser: Parsable> Server<Checker, Parser> {
) -> Option<(Token, Expr)> {
let token = self.file_cache.get_token_relatively(uri, pos, offset)?;
crate::_log!(self, "token: {token}");
if let Some(visitor) = self.get_visitor(uri) {
if let Some(expr) = visitor.get_min_expr(loc_to_pos(token.loc())?) {
if let Some(visitor) = self.get_visitor(uri)
&& let Some(expr) = visitor.get_min_expr(loc_to_pos(token.loc())?) {
return Some((token, expr.clone()));
}
}
None
}

Expand Down
Loading
Loading