From 3425b95cb654f8e1adc98365a4b370aa1fff8b4d Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 06:02:21 +0000 Subject: feat(classes): support ordinary member methods and this references Co-Authored-By: Claude Fable 5.1 --- lib/CodeGen/StatementGen.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'lib/CodeGen/StatementGen.cc') diff --git a/lib/CodeGen/StatementGen.cc b/lib/CodeGen/StatementGen.cc index b648ec6..c55aebe 100644 --- a/lib/CodeGen/StatementGen.cc +++ b/lib/CodeGen/StatementGen.cc @@ -12,7 +12,17 @@ void CodeGen::emitStmt(StmtAST *Stmt) { SaveAndRestore Location(DiagnosticLine, Stmt && Stmt->getLine() ? Stmt->getLine() : DiagnosticLine); if (!Stmt) return; + if (auto *Class = dynamic_cast(Stmt)) { + for (const auto &Method : Class->getMethods()) { + // Invalid or duplicate members have already been diagnosed. + if (findMethod(Class->getName(), Method->getProto()->getName()) == Method->getProto()) + emitStmt(Method.get()); + } + return; + } + if (auto *FuncDef = dynamic_cast(Stmt)) { + SaveAndRestore ClassContext(CurrentClass, FuncDef->getProto()->getOwnerClass()); BasicBlock *SavedBlock = Builder->GetInsertBlock(); // Function bodies get a fresh array scope (metadata SSA values belong // to the emitting function), mirroring FunctionGen's Symbols handling. @@ -54,6 +64,11 @@ void CodeGen::emitStmt(StmtAST *Stmt) { return; } + if (auto *Call = dynamic_cast(Stmt)) { + emitMemberCall(Call->getCall()); + return; + } + if (auto *Call = dynamic_cast(Stmt)) { emitCall(Call->getCallee(), Call->getArgs(), Call->getLine()); return; -- cgit v1.3.1-4-g156e