mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
When diagnosing a duplicated name, add the name to the diagnosis (#4902)
In order to have the name available for diagnostics, we now always set `NameId` in `NameContext` and put `poisoning_loc_id` as part of the union with `resolved_inst_id` instead (since we never need both).
This commit is contained in:
@@ -136,7 +136,7 @@ auto DeclNameStack::AddName(NameContext name_context, SemIR::InstId target_id,
|
||||
|
||||
case NameContext::State::Unresolved:
|
||||
if (!name_context.parent_scope_id.has_value()) {
|
||||
AddNameToLookup(*context_, name_context.unresolved_name_id, target_id,
|
||||
AddNameToLookup(*context_, name_context.name_id, target_id,
|
||||
name_context.initial_scope_index);
|
||||
} else {
|
||||
auto& name_scope =
|
||||
@@ -161,7 +161,7 @@ auto DeclNameStack::AddName(NameContext name_context, SemIR::InstId target_id,
|
||||
context_->AddExport(target_id);
|
||||
}
|
||||
|
||||
name_scope.AddRequired({.name_id = name_context.unresolved_name_id,
|
||||
name_scope.AddRequired({.name_id = name_context.name_id,
|
||||
.result = SemIR::ScopeLookupResult::MakeFound(
|
||||
target_id, access_kind)});
|
||||
}
|
||||
@@ -180,7 +180,8 @@ auto DeclNameStack::AddNameOrDiagnose(NameContext name_context,
|
||||
DiagnosePoisonedName(*context_, name_context.name_id_for_new_inst(),
|
||||
name_context.poisoning_loc_id, name_context.loc_id);
|
||||
} else if (auto id = name_context.prev_inst_id(); id.has_value()) {
|
||||
DiagnoseDuplicateName(*context_, name_context.loc_id, id);
|
||||
DiagnoseDuplicateName(*context_, name_context.name_id, name_context.loc_id,
|
||||
id);
|
||||
} else {
|
||||
AddName(name_context, target_id, access_kind);
|
||||
}
|
||||
@@ -258,10 +259,11 @@ auto DeclNameStack::ApplyAndLookupName(NameContext& name_context,
|
||||
// processed so far.
|
||||
name_context.loc_id = loc_id;
|
||||
|
||||
name_context.name_id = name_id;
|
||||
|
||||
// Don't perform any more lookups after we hit an error. We still track the
|
||||
// final name, though.
|
||||
if (name_context.state == NameContext::State::Error) {
|
||||
name_context.unresolved_name_id = name_id;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -270,12 +272,10 @@ auto DeclNameStack::ApplyAndLookupName(NameContext& name_context,
|
||||
name_context.parent_scope_id,
|
||||
name_context.initial_scope_index);
|
||||
if (lookup_result.is_poisoned()) {
|
||||
name_context.unresolved_name_id = name_id;
|
||||
name_context.poisoning_loc_id = lookup_result.poisoning_loc_id();
|
||||
name_context.state = NameContext::State::Poisoned;
|
||||
} else if (!lookup_result.is_found()) {
|
||||
// Invalid indicates an unresolved name. Store it and return.
|
||||
name_context.unresolved_name_id = name_id;
|
||||
name_context.state = NameContext::State::Unresolved;
|
||||
} else {
|
||||
// Store the resolved instruction and continue for the target scope
|
||||
@@ -300,8 +300,7 @@ static auto CheckQualifierIsResolved(
|
||||
case DeclNameStack::NameContext::State::Unresolved:
|
||||
// Because more qualifiers were found, we diagnose that the earlier
|
||||
// qualifier failed to resolve.
|
||||
DiagnoseNameNotFound(context, name_context.loc_id,
|
||||
name_context.unresolved_name_id);
|
||||
DiagnoseNameNotFound(context, name_context.loc_id, name_context.name_id);
|
||||
return false;
|
||||
|
||||
case DeclNameStack::NameContext::State::Finished:
|
||||
|
||||
Reference in New Issue
Block a user