aboutsummaryrefslogtreecommitdiff
path: root/AGENTS/SUBSYSTEMS/CLASSES.md
blob: 21e5124d102d672ec01d03345036fd977f7f50a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# Classes: declarations and methods

Part of the [subsystem notes](../SUBSYSTEMS.md). Builds on [user types](USER_TYPES.md);
construction and destruction are in [class lifetime](CLASS_LIFETIME.md).

## Declaration and access

- `ClassTypeDeclAST` inherits `RecordTypeDeclAST`: CLASS declarations use the same
  two-pass registration, `TypeKind::Record`, `%record.NAME` layout and value semantics.
- Shared body/field parsing lives in `ParserType.cc`.
- TYPE fields always have `IsPublic = true`; CLASS fields default to public or accept an
  explicit PUBLIC/PRIVATE keyword and carry that flag through `defineRecord` into
  `RecordFieldInfo`.
- Both the static designator type walk and `emitLValue` check private field access
  against the current method's owning class, including address-of, array elements and
  pointer dereferences. Other instances of the same class are accessible from its
  methods.
- `TypeInfo::IsClass` distinguishes classes from records without changing their shared
  LLVM representation.

## Methods

- Class ASTs also own their `FunctionDefAST` methods. PrototypeAST retains the owner and
  access level; `getLinkName()` supplies the source key `Class.Method`.
- FunctionGen appends `(canonical parameter types)` and, for non-VOID results, a
  `:ReturnKey` suffix only for OVERLOAD, leaving ordinary symbols and NEW unchanged.
- CodeGen registers methods separately in `ClassMethods` overload vectors and
  pre-registers their prototypes after the type pre-pass.
- `resolveMethod` uses `resolveCall`; access is checked on the selected overload.
  Constructor/default-construction paths select NEW through this same resolver.
- `MemberCallExprAST` keeps an addressable receiver separate from explicit arguments;
  `MemberCallStmtAST` discards its result.
- `emitMemberCall` checks access and prepends the receiver address to arguments
  marshalled by the existing `marshalCallArgs`. The hidden receiver is not part of
  FuncSig's explicit parameter list.
- FunctionGen binds field aliases and `this` to the incoming receiver storage before
  binding explicit parameters.
- CodeGen saves/restores `CurrentClass` around each function body; unqualified calls
  still resolve globally.
- Local declarations and parameters may shadow fields with a source-line warning;
  `this.Field` remains explicit. `this` cannot be redeclared within methods.