Implement static var class fields (#7215)

This adds the `static` token to the lexer and parses it as a modifier.

In check, `FullPatternStack::Kind::FieldDecl` is now used for both
static and non-static vars. Static vars get treated basically the same
as `NameBindingDecl`s.

Global initialization is used for static var initializers. To make the
necessary stack information available to `pattern_match.cpp`, the
`full_pattern_stack` and `decl_introducer_state_stack` are now popped
later in `handle_let_and_var.cpp`.

In lowering, each class's body is checked for `VarStorage` insts and
lowered the same as global vars.
This commit is contained in:
Nicholas Bishop
2026-05-18 20:09:17 +00:00
committed by GitHub
parent 31db4a0931
commit 773ecdfac6
21 changed files with 380 additions and 69 deletions
+2 -2
View File
@@ -605,7 +605,7 @@ auto MatchContext::DoVarPreWorkImpl(State state,
// TODO: Find a more efficient way to put these insts in the global_init
// block (or drop the distinction between the global_init block and the
// file scope?)
if (context_.scope_stack().PeekIndex() == ScopeIndex::Package) {
if (UseGlobalInit(context_)) {
context_.global_init().Resume();
}
@@ -625,7 +625,7 @@ auto MatchContext::DoVarPreWorkImpl(State state,
{.lhs_id = storage_id, .rhs_id = init_id});
}
if (context_.scope_stack().PeekIndex() == ScopeIndex::Package) {
if (UseGlobalInit(context_)) {
context_.global_init().Suspend();
}
return storage_id;