Auto merge of #14651 - Veykril:workspace-vscode-fix, r=Veykril
fix: Fix vscode workspaces not working properly Fixes https://github.com/rust-lang/rust-analyzer/issues/14571
This commit is contained in:
commit
e46d7a030f
@ -102,6 +102,7 @@ pub trait ExpandDatabase: SourceDatabase {
|
||||
#[salsa::transparent]
|
||||
fn parse_or_expand_with_err(&self, file_id: HirFileId) -> ExpandResult<Parse<SyntaxNode>>;
|
||||
/// Implementation for the macro case.
|
||||
// This query is LRU cached
|
||||
fn parse_macro_expansion(
|
||||
&self,
|
||||
macro_file: MacroFile,
|
||||
@ -130,11 +131,12 @@ fn macro_arg(
|
||||
fn macro_def(&self, id: MacroDefId) -> Result<Arc<TokenExpander>, mbe::ParseError>;
|
||||
|
||||
/// Expand macro call to a token tree.
|
||||
// This query is LRU cached
|
||||
fn macro_expand(&self, macro_call: MacroCallId) -> ExpandResult<Arc<tt::Subtree>>;
|
||||
/// Special case of the previous query for procedural macros. We can't LRU
|
||||
/// proc macros, since they are not deterministic in general, and
|
||||
/// non-determinism breaks salsa in a very, very, very bad way. @edwin0cheng
|
||||
/// heroically debugged this once!
|
||||
/// non-determinism breaks salsa in a very, very, very bad way.
|
||||
/// @edwin0cheng heroically debugged this once!
|
||||
fn expand_proc_macro(&self, call: MacroCallId) -> ExpandResult<tt::Subtree>;
|
||||
/// Firewall query that returns the errors from the `parse_macro_expansion` query.
|
||||
fn parse_macro_expansion_error(
|
||||
|
@ -54,8 +54,8 @@ pub fn expand_eager_macro(
|
||||
let expand_to = ExpandTo::from_call_site(¯o_call.value);
|
||||
|
||||
// Note:
|
||||
// When `lazy_expand` is called, its *parent* file must be already exists.
|
||||
// Here we store an eager macro id for the argument expanded subtree here
|
||||
// When `lazy_expand` is called, its *parent* file must already exist.
|
||||
// Here we store an eager macro id for the argument expanded subtree
|
||||
// for that purpose.
|
||||
let arg_id = db.intern_macro_call(MacroCallLoc {
|
||||
def,
|
||||
@ -79,7 +79,11 @@ pub fn expand_eager_macro(
|
||||
let Some(value ) = value else {
|
||||
return Ok(ExpandResult { value: None, err })
|
||||
};
|
||||
let subtree = to_subtree(&value);
|
||||
let subtree = {
|
||||
let mut subtree = mbe::syntax_node_to_token_tree(&value).0;
|
||||
subtree.delimiter = crate::tt::Delimiter::unspecified();
|
||||
subtree
|
||||
};
|
||||
|
||||
let res = eager.expand(db, arg_id, &subtree);
|
||||
if err.is_none() {
|
||||
@ -100,12 +104,6 @@ pub fn expand_eager_macro(
|
||||
Ok(ExpandResult { value: Some(db.intern_macro_call(loc)), err })
|
||||
}
|
||||
|
||||
fn to_subtree(node: &SyntaxNode) -> crate::tt::Subtree {
|
||||
let mut subtree = mbe::syntax_node_to_token_tree(node).0;
|
||||
subtree.delimiter = crate::tt::Delimiter::unspecified();
|
||||
subtree
|
||||
}
|
||||
|
||||
fn lazy_expand(
|
||||
db: &dyn ExpandDatabase,
|
||||
def: &MacroDefId,
|
||||
@ -121,7 +119,8 @@ fn lazy_expand(
|
||||
MacroCallKind::FnLike { ast_id: macro_call.with_value(ast_id), expand_to },
|
||||
);
|
||||
|
||||
db.parse_or_expand_with_err(id.as_file()).map(|parse| InFile::new(id.as_file(), parse))
|
||||
let file_id = id.as_file();
|
||||
db.parse_or_expand_with_err(file_id).map(|parse| InFile::new(file_id, parse))
|
||||
}
|
||||
|
||||
fn eager_macro_recur(
|
||||
|
@ -215,13 +215,17 @@ pub(crate) fn fetch_workspaces(&mut self, cause: Cause) {
|
||||
let mut i = 0;
|
||||
while i < workspaces.len() {
|
||||
if let Ok(w) = &workspaces[i] {
|
||||
if let Some(dupe) = workspaces[i + 1..]
|
||||
let dupes: Vec<_> = workspaces
|
||||
.iter()
|
||||
.filter_map(|it| it.as_ref().ok())
|
||||
.position(|ws| ws.eq_ignore_build_data(w))
|
||||
{
|
||||
_ = workspaces.remove(dupe);
|
||||
}
|
||||
.enumerate()
|
||||
.skip(i + 1)
|
||||
.filter_map(|(i, it)| {
|
||||
it.as_ref().ok().filter(|ws| ws.eq_ignore_build_data(w)).map(|_| i)
|
||||
})
|
||||
.collect();
|
||||
dupes.into_iter().rev().for_each(|d| {
|
||||
_ = workspaces.remove(d);
|
||||
});
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user