Track the start of a signature more accurately (#6760)

This change ensures that a function signature always starts with an
`IdentifierNameMaybeBeforeSignature` node (renamed from
`IdentifierNameBeforeParams`), even in the case of function declarations
like `fn F -> T` that have no parameter list. As a consequence, this
ensures that we push new entries onto `pattern_block_stack` and
`full_pattern_stack` when we start processing the function signature.
This commit is contained in:
Geoff Romer
2026-02-23 22:46:03 +00:00
committed by GitHub
parent 375a736c42
commit 4a0cf6c1fb
282 changed files with 1041 additions and 1039 deletions
@@ -17,16 +17,16 @@
namespace Carbon::LanguageServer {
// Returns the token of first child of kind IdentifierNameBeforeParams or
// IdentifierNameNotBeforeParams.
// Returns the token of first child of kind IdentifierNameMaybeBeforeSignature
// or IdentifierNameNotBeforeSignature.
static auto GetSymbolIdentifier(const Parse::TreeAndSubtrees& tree_and_subtrees,
Parse::NodeId node)
-> std::optional<Lex::TokenIndex> {
const auto& tokens = tree_and_subtrees.tree().tokens();
for (auto child : tree_and_subtrees.children(node)) {
switch (tree_and_subtrees.tree().node_kind(child)) {
case Parse::NodeKind::IdentifierNameBeforeParams:
case Parse::NodeKind::IdentifierNameNotBeforeParams: {
case Parse::NodeKind::IdentifierNameMaybeBeforeSignature:
case Parse::NodeKind::IdentifierNameNotBeforeSignature: {
auto token = tree_and_subtrees.tree().node_token(child);
if (tokens.GetKind(token) == Lex::TokenKind::Identifier) {
return token;