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 compiler/rustc_ast_lowering/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ mod pat;
mod path;
pub mod stability;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

struct LoweringContext<'a, 'hir> {
tcx: TyCtxt<'hir>,
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_ast_passes/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ pub mod ast_validation;
mod errors;
pub mod feature_gate;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_attr_parsing/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,4 @@ pub use context::{Early, Late, OmitDoc, ShouldEmit};
pub use interface::AttributeParser;
pub use session_diagnostics::ParsedDescription;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_borrowck/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ mod used_muts;
/// A public API provided for the Rust compiler consumers.
pub mod consumers;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

/// Associate some local constants with the `'tcx` lifetime
struct TyCtxtConsts<'tcx>(PhantomData<&'tcx ()>);
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_builtin_macros/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ pub mod standard_library_imports;
pub mod test_harness;
pub mod util;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) {
let mut register = |name, kind| resolver.register_builtin_macro(name, kind);
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_gcc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ use tempfile::TempDir;
use crate::back::lto::ModuleBuffer;
use crate::gcc_util::{target_cpu, to_gcc_features};

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub struct PrintOnPanic<F: Fn() -> String>(pub F);

Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_llvm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ mod typetree;
mod va_arg;
mod value;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub(crate) use macros::TryFromU32;

Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_ssa/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ pub mod size_of_val;
pub mod target_features;
pub mod traits;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub struct ModuleCodegen<M> {
/// The name of the module. When the crate may be saved between
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_const_eval/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use rustc_middle::util::Providers;

pub use self::errors::ReportErrorExt;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn provide(providers: &mut Providers) {
const_eval::provide(providers);
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_driver_impl/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ use crate::session_diagnostics::{
RLinkWrongFileType, RlinkCorruptFile, RlinkNotAFile, RlinkUnableToRead, UnstableFeatureUsage,
};

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn default_translator() -> Translator {
Translator::with_fallback_bundle(DEFAULT_LOCALE_RESOURCES.to_vec(), false)
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_errors/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ pub mod translation;

pub type PResult<'a, T> = Result<T, Diag<'a>>;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

// `PResult` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_pointer_width = "64")]
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_expand/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ pub mod module;
#[allow(rustc::untranslatable_diagnostic)]
pub mod proc_macro;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
48 changes: 15 additions & 33 deletions compiler/rustc_fluent_macro/src/fluent.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::collections::{HashMap, HashSet};
use std::fs::read_to_string;
use std::path::{Path, PathBuf};
use std::path::PathBuf;

use annotate_snippets::{Renderer, Snippet};
use fluent_bundle::{FluentBundle, FluentError, FluentResource};
Expand All @@ -12,31 +12,12 @@ use fluent_syntax::parser::ParserError;
use proc_macro::tracked::path;
#[cfg(bootstrap)]
use proc_macro::tracked_path::path;
use proc_macro::{Diagnostic, Level, Span};
use proc_macro::{Diagnostic, Level};
use proc_macro2::TokenStream;
use quote::quote;
use syn::{Ident, LitStr, parse_macro_input};
use unic_langid::langid;

/// Helper function for returning an absolute path for macro-invocation relative file paths.
///
/// If the input is already absolute, then the input is returned. If the input is not absolute,
/// then it is appended to the directory containing the source file with this macro invocation.
fn invocation_relative_path_to_absolute(span: Span, path: &str) -> PathBuf {
let path = Path::new(path);
if path.is_absolute() {
path.to_path_buf()
} else {
// `/a/b/c/foo/bar.rs` contains the current macro invocation
let mut source_file_path = span.local_file().unwrap();
// `/a/b/c/foo/`
source_file_path.pop();
// `/a/b/c/foo/../locales/en-US/example.ftl`
source_file_path.push(path);
source_file_path
}
}

/// Final tokens.
fn finish(body: TokenStream, resource: TokenStream) -> proc_macro::TokenStream {
quote! {
Expand Down Expand Up @@ -99,12 +80,13 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
let resource_str = parse_macro_input!(input as LitStr);
let resource_span = resource_str.span().unwrap();
let relative_ftl_path = resource_str.value();
let absolute_ftl_path = invocation_relative_path_to_absolute(resource_span, &relative_ftl_path);
let absolute_ftl_path =
PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()).join(&relative_ftl_path);

let crate_name = Ident::new(&crate_name, resource_str.span());

path(absolute_ftl_path.to_str().unwrap());
let resource_contents = match read_to_string(absolute_ftl_path) {
let resource_contents = match read_to_string(&absolute_ftl_path) {
Ok(resource_contents) => resource_contents,
Err(e) => {
Diagnostic::spanned(
Expand All @@ -116,22 +98,17 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
return failed(&crate_name);
}
};
let mut bad = false;
for esc in ["\\n", "\\\"", "\\'"] {
for _ in resource_contents.matches(esc) {
bad = true;
Diagnostic::spanned(resource_span, Level::Error, format!("invalid escape `{esc}` in Fluent resource"))
.note("Fluent does not interpret these escape sequences (<https://projectfluent.org/fluent/guide/special.html>)")
.emit();
}
}
if bad {
return failed(&crate_name);
}

let resource = match FluentResource::try_new(resource_contents) {
Ok(resource) => resource,
Err((this, errs)) => {
Err((resource, errs)) => {
Diagnostic::spanned(resource_span, Level::Error, "could not parse Fluent resource")
.help("see additional errors emitted")
.emit();
Expand All @@ -142,16 +119,18 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
err.replace_range(0..1, &err.chars().next().unwrap().to_lowercase().to_string());

let message = annotate_snippets::Level::Error.title(&err).snippet(
Snippet::source(this.source())
.origin(&relative_ftl_path)
Snippet::source(resource.source())
// Using an absolute path is fine here as compilation will not continue.
.origin(absolute_ftl_path.to_str().unwrap())
.fold(true)
.annotation(annotate_snippets::Level::Error.span(pos.start..pos.end - 1)),
);
let renderer = Renderer::plain();
eprintln!("{}\n", renderer.render(message));
}

return failed(&crate_name);
// Try to recover from the parse error to avoid cascading errors.
resource
}
};

Expand Down Expand Up @@ -289,7 +268,10 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
}
}

finish(constants, quote! { include_str!(#relative_ftl_path) })
finish(
constants,
quote! { include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/", #relative_ftl_path)) },
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine with respect to reproducibility, right?

)
}

fn variable_references<'a>(msg: &Message<&'a str>) -> Vec<&'a str> {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_hir_analysis/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ use rustc_trait_selection::traits;
pub use crate::collect::suggest_impl_trait;
use crate::hir_ty_lowering::{FeedConstTy, HirTyLowerer};

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

fn check_c_variadic_abi(tcx: TyCtxt<'_>, decl: &hir::FnDecl<'_>, abi: ExternAbi, span: Span) {
if !decl.c_variadic {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_hir_typeck/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ use crate::expectation::Expectation;
use crate::fn_ctxt::LoweredTy;
use crate::gather_locals::GatherLocalsVisitor;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

#[macro_export]
macro_rules! type_error_struct {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_incremental/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ pub fn provide(providers: &mut Providers) {
|tcx| tcx.sess.time("serialize_dep_graph", || persist::save_dep_graph(tcx));
}

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_infer/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ mod errors;
pub mod infer;
pub mod traits;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_interface/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ pub use queries::Linker;
#[cfg(test)]
mod tests;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_lint/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ pub use rustc_errors::BufferedEarlyLint;
pub use rustc_session::lint::Level::{self, *};
pub use rustc_session::lint::{FutureIncompatibleInfo, Lint, LintId, LintPass, LintVec};

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn provide(providers: &mut Providers) {
levels::provide(providers);
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_metadata/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,4 @@ pub use native_libs::{
};
pub use rmeta::{EncodedMetadata, METADATA_HEADER, encode_metadata, rendered_const};

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_middle/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,4 @@ pub mod dep_graph;
// Allows macros to refer to this crate as `::rustc_middle`
extern crate self as rustc_middle;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub mod thir;

use rustc_middle::util::Providers;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn provide(providers: &mut Providers) {
providers.check_match = thir::pattern::check_match;
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_dataflow/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ pub mod rustc_peek;
mod un_derefer;
pub mod value_analysis;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub struct MoveDataTypingEnv<'tcx> {
pub move_data: MoveData<'tcx>,
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_transform/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ declare_passes! {
mod validate : Validator;
}

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn provide(providers: &mut Providers) {
coverage::query::provide(providers);
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_monomorphize/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ mod mono_checks;
mod partitioning;
mod util;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

fn custom_coerce_unsize_info<'tcx>(
tcx: TyCtxtAt<'tcx>,
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_parse/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ const _: () = {
}
};

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

// Unwrap the result if `Ok`, otherwise emit the diagnostics and abort.
pub fn unwrap_or_emit_fatal<T>(expr: Result<T, Vec<Diag<'_>>>) -> T {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_passes/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ pub mod stability;
mod upvars;
mod weak_lang_items;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn provide(providers: &mut Providers) {
check_attr::provide(providers);
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_pattern_analysis/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ pub mod rustc;
pub mod usefulness;

#[cfg(feature = "rustc")]
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

use std::fmt;

Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_privacy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ use rustc_span::hygiene::Transparency;
use rustc_span::{Ident, Span, Symbol, sym};
use tracing::debug;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

////////////////////////////////////////////////////////////////////////////////
// Generic infrastructure used to implement specific visitors below.
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_query_system/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ mod values;
pub use error::{HandleCycleError, QueryOverflow, QueryOverflowNote};
pub use values::Value;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ pub use macros::registered_tools_ast;

use crate::ref_mut::{CmCell, CmRefCell};

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

#[derive(Copy, Clone, PartialEq, Debug)]
enum Determinacy {
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_session/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ pub mod output;

pub use getopts;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

/// Requirements for a `StableHashingContext` to be used in this crate.
/// This is a hack to allow using the `HashStable_Generic` derive macro
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_trait_selection/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,4 @@ pub mod regions;
pub mod solve;
pub mod traits;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }
2 changes: 1 addition & 1 deletion compiler/rustc_ty_utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub mod sig_types;
mod structural_match;
mod ty;

rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
rustc_fluent_macro::fluent_messages! { "messages.ftl" }

pub fn provide(providers: &mut Providers) {
abi::provide(providers);
Expand Down
1 change: 1 addition & 0 deletions src/tools/compiletest/src/directives.rs
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,7 @@ impl Config {
// Trim whitespace from the name, so that `//@ exec-env: FOO=BAR`
// sees the name as `FOO` and not ` FOO`.
let name = name.trim();
let value = value.replace("$ROOT", std::env::current_dir().unwrap().to_str().unwrap());
(name.to_owned(), value.to_owned())
}

Expand Down
1 change: 1 addition & 0 deletions tests/ui-fulldeps/fluent-messages/test.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
//@ normalize-stderr: "could not open Fluent resource:.*" -> "could not open Fluent resource: os-specific message"
//@ rustc-env: CARGO_MANIFEST_DIR=$ROOT/tests/ui-fulldeps/fluent-messages

#![feature(rustc_private)]
#![crate_type = "lib"]
Expand Down
Loading
Loading