diff --git a/pyrefly/lib/lsp/wasm/completion.rs b/pyrefly/lib/lsp/wasm/completion.rs index e4056c3f7d..635af7f214 100644 --- a/pyrefly/lib/lsp/wasm/completion.rs +++ b/pyrefly/lib/lsp/wasm/completion.rs @@ -510,10 +510,16 @@ impl Transaction<'_> { && let Some(base_type) = answers.get_type_trace(base_range) { self.ad_hoc_solve(handle, |solver| { - solver - .completions(base_type, None, true) - .iter() - .for_each(|x| { + let completions = solver.completions(base_type.clone(), None, false); + let include_types = completions.len() <= 200; + let completions = if include_types { + solver.completions(base_type, None, true) + } else { + completions + }; + + completions.iter().for_each(|x| { + let (kind, detail, documentation) = if include_types { let kind = match x.ty { Some(Type::BoundMethod(_)) => Some(CompletionItemKind::METHOD), Some(Type::Function(_) | Type::Overload(_)) => { @@ -527,24 +533,29 @@ impl Transaction<'_> { let detail = ty.clone().map(|t| t.as_lsp_string(LspDisplayMode::Hover)); let documentation = self.get_docstring_for_attribute(handle, x); - result.push(CompletionItem { - label: x.name.as_str().to_owned(), - detail, - kind, - documentation, - sort_text: if x.is_reexport { - Some("1".to_owned()) - } else { - None - }, - tags: if x.is_deprecated { - Some(vec![CompletionItemTag::DEPRECATED]) - } else { - None - }, - ..Default::default() - }); + (kind, detail, documentation) + } else { + (Some(CompletionItemKind::FIELD), None, None) + }; + + result.push(CompletionItem { + label: x.name.as_str().to_owned(), + detail, + kind, + documentation, + sort_text: if x.is_reexport { + Some("1".to_owned()) + } else { + None + }, + tags: if x.is_deprecated { + Some(vec![CompletionItemTag::DEPRECATED]) + } else { + None + }, + ..Default::default() }); + }); }); } } diff --git a/pyrefly/python/pyrefly-0.51.0.data/scripts/pyrefly b/pyrefly/python/pyrefly-0.51.0.data/scripts/pyrefly new file mode 100755 index 0000000000..2a613f6f4d Binary files /dev/null and b/pyrefly/python/pyrefly-0.51.0.data/scripts/pyrefly differ