diff --git a/packages/manganis/manganis-macro/src/lib.rs b/packages/manganis/manganis-macro/src/lib.rs index 467ee3e9e..d1e67be77 100644 --- a/packages/manganis/manganis-macro/src/lib.rs +++ b/packages/manganis/manganis-macro/src/lib.rs @@ -209,6 +209,16 @@ fn resolve_path(raw: &str, span: Span) -> Result { if let Some(local_folder) = span.local_file().as_ref().and_then(|f| f.parent()) { local_folder.join(raw) } 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); } } 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 +}