fix(parser): resolve generic nesting ambiguity by splitting >> tokens

Signed-off-by: erick-alcachofa <erick@artichoke.dev>

Refactor the termination logic for generic parameter lists in type
parsing to correctly handle nested generics. By replacing manual peeking
with `peekExpect(TokenV::opGt)`, the parser now correctly handles cases
where two closing angle brackets appear consecutively (e.g.,
`List<List<Int>>`).

Previously, the parser manually checked for a literal `>` token. If the
lexer encountered `>>` (a right-shift operator), the parser would fail
to recognize it as two closing brackets. The transition to `peekExpect`
allows the tokenizer to "split" the `>>` token into two individual `>`
tokens when a single closing bracket is expected, resolving the classic
nested template ambiguity.

Key changes:
- Replaced manual token validation and error reporting with
  `peekExpect`.
- Enabled support for nested generic types without requiring spaces
  between closing brackets.
- Simplified the `keepParsing` loop state in `lib/src/Parser/Types.cpp`.
This commit is contained in:
erick-alcachofa 2025-12-26 23:54:17 -06:00
parent 5762497f56
commit 09c44f3b67
Signed by: me
GPG Key ID: 6FA5F8643444BAFA

View File

@ -299,21 +299,11 @@ namespace arti::lang {
return Unexpected{ std::move(comma).error() };
}
else if (! comma.value()) {
if (peekToken = tokenizer.peek(); ! peekToken) {
if (peekToken = tokenizer.peekExpect(TokenV::opGt); ! peekToken) {
return Unexpected{ std::move(peekToken).error() };
}
else {
if (peekToken->value != TokenV::opGt) {
return langException<ExceptCode::ecUnexpectedToken>(
peekToken->line,
peekToken->column,
toString(*peekToken),
"',' or '>'"
);
}
else {
keepParsing = false;
}
keepParsing = false;
}
}
}