Expand relative assets to a placeholder if we are running in rust (#4860)
analyzer
This commit is contained in:
1 parent
566dab939f
commit
ee1719af92
1 file changed
+29
@@ -209,6 +209,16 @@ fn resolve_path(raw: &str, span: Span) -> Result<PathBuf, AssetParseError> {
|
|||||||
if let Some(local_folder) = span.local_file().as_ref().and_then(|f| f.parent()) {
|
if let Some(local_folder) = span.local_file().as_ref().and_then(|f| f.parent()) {
|
||||||
local_folder.join(raw)
|
local_folder.join(raw)
|
||||||
} else {
|
} else {
|
||||||
|
// If we are running in rust analyzer, just assume the path is valid and return an error when
|
||||||
|
// we compile if it doesn't exist
|
||||||
|
if looks_like_rust_analyzer(&span) {
|
||||||
|
return Ok(
|
||||||
|
"The asset macro was expanded under Rust Analyzer which doesn't support paths or local assets yet"
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, return an error about the version of rust required for relative assets
|
||||||
return Err(AssetParseError::RelativeAssetPath);
|
return Err(AssetParseError::RelativeAssetPath);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -328,3 +338,22 @@ impl std::fmt::Display for AssetParseError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Rust analyzer doesn't provide a stable way to detect if macros are running under it.
|
||||||
|
/// This function uses heuristics to determine if we are running under rust analyzer for better error
|
||||||
|
/// messages.
|
||||||
|
fn looks_like_rust_analyzer(span: &Span) -> bool {
|
||||||
|
// Rust analyzer spans have a struct debug impl compared to rustcs custom debug impl
|
||||||
|
// RA Example: SpanData { range: 45..58, anchor: SpanAnchor(EditionedFileId(0, Edition2024), ErasedFileAstId { kind: Fn, index: 0, hash: 9CD8 }), ctx: SyntaxContext(4294967036) }
|
||||||
|
// Rustc Example: #0 bytes(70..83)
|
||||||
|
let looks_like_rust_analyzer_span = format!("{:?}", span).contains("ctx:");
|
||||||
|
// The rust analyzer macro expander runs under RUST_ANALYZER_INTERNALS_DO_NOT_USE
|
||||||
|
let looks_like_rust_analyzer_env = std::env::var("RUST_ANALYZER_INTERNALS_DO_NOT_USE").is_ok();
|
||||||
|
// The rust analyzer executable is named rust-analyzer-proc-macro-srv
|
||||||
|
let looks_like_rust_analyzer_exe = std::env::current_exe().ok().is_some_and(|p| {
|
||||||
|
p.file_stem()
|
||||||
|
.and_then(|s| s.to_str())
|
||||||
|
.is_some_and(|s| s.contains("rust-analyzer"))
|
||||||
|
});
|
||||||
|
looks_like_rust_analyzer_span || looks_like_rust_analyzer_env || looks_like_rust_analyzer_exe
|
||||||
|
}
|
||||||
Reference in new issue
Block a user