Port crate name to the new attribute system

This commit is contained in:
Jana Dönszelmann
2025-08-11 11:46:30 +02:00
parent 4b35cde904
commit 59ceb02d65
25 changed files with 458 additions and 366 deletions

View File

@@ -6,7 +6,7 @@ use std::sync::{Arc, LazyLock, OnceLock};
use std::{env, fs, iter};
use rustc_ast as ast;
use rustc_attr_parsing::validate_attr;
use rustc_attr_parsing::{AttributeParser, ShouldEmit, validate_attr};
use rustc_codegen_ssa::traits::CodegenBackend;
use rustc_data_structures::jobserver::Proxy;
use rustc_data_structures::steal::Steal;
@@ -16,6 +16,7 @@ use rustc_errors::timings::TimingSection;
use rustc_expand::base::{ExtCtxt, LintStoreExpand};
use rustc_feature::Features;
use rustc_fs_util::try_canonicalize;
use rustc_hir::attrs::AttributeKind;
use rustc_hir::def_id::{LOCAL_CRATE, StableCrateId, StableCrateIdMap};
use rustc_hir::definitions::Definitions;
use rustc_incremental::setup_dep_graph;
@@ -1244,8 +1245,7 @@ pub fn get_crate_name(sess: &Session, krate_attrs: &[ast::Attribute]) -> Symbol
// in all code paths that require the crate name very early on, namely before
// macro expansion.
let attr_crate_name =
validate_and_find_value_str_builtin_attr(sym::crate_name, sess, krate_attrs);
let attr_crate_name = parse_crate_name(sess, krate_attrs, ShouldEmit::EarlyFatal);
let validate = |name, span| {
rustc_session::output::validate_crate_name(sess, name, span);
@@ -1283,6 +1283,28 @@ pub fn get_crate_name(sess: &Session, krate_attrs: &[ast::Attribute]) -> Symbol
sym::rust_out
}
pub(crate) fn parse_crate_name(
sess: &Session,
attrs: &[ast::Attribute],
emit_errors: ShouldEmit,
) -> Option<(Symbol, Span)> {
let rustc_hir::Attribute::Parsed(AttributeKind::CrateName { name, name_span, .. }) =
AttributeParser::parse_limited_should_emit(
sess,
&attrs,
sym::crate_name,
DUMMY_SP,
rustc_ast::node_id::CRATE_NODE_ID,
None,
emit_errors,
)?
else {
unreachable!("crate_name is the only attr we could've parsed here");
};
Some((name, name_span))
}
fn get_recursion_limit(krate_attrs: &[ast::Attribute], sess: &Session) -> Limit {
// We don't permit macro calls inside of the attribute (e.g., #![recursion_limit = `expand!()`])
// because that would require expanding this while in the middle of expansion, which needs to

View File

@@ -5,7 +5,7 @@ use std::sync::{Arc, OnceLock};
use std::{env, thread};
use rustc_ast as ast;
use rustc_attr_parsing::validate_attr;
use rustc_attr_parsing::{ShouldEmit, validate_attr};
use rustc_codegen_ssa::traits::CodegenBackend;
use rustc_data_structures::jobserver::Proxy;
use rustc_data_structures::sync;
@@ -24,6 +24,7 @@ use rustc_target::spec::Target;
use tracing::info;
use crate::errors;
use crate::passes::parse_crate_name;
/// Function pointer type that constructs a new CodegenBackend.
type MakeBackendFn = fn() -> Box<dyn CodegenBackend>;
@@ -520,11 +521,10 @@ pub fn build_output_filenames(attrs: &[ast::Attribute], sess: &Session) -> Outpu
sess.dcx().emit_fatal(errors::MultipleOutputTypesToStdout);
}
let crate_name = sess
.opts
.crate_name
.clone()
.or_else(|| rustc_attr_parsing::find_crate_name(attrs).map(|n| n.to_string()));
let crate_name =
sess.opts.crate_name.clone().or_else(|| {
parse_crate_name(sess, attrs, ShouldEmit::Nothing).map(|i| i.0.to_string())
});
match sess.io.output_file {
None => {