diff options
Diffstat (limited to 'lib/CodeGen/StatementGen.cc')
| -rw-r--r-- | lib/CodeGen/StatementGen.cc | 15 |
1 files changed, 15 insertions, 0 deletions
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<int> Location(DiagnosticLine, Stmt && Stmt->getLine() ? Stmt->getLine() : DiagnosticLine); if (!Stmt) return; + if (auto *Class = dynamic_cast<ClassTypeDeclAST*>(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<FunctionDefAST*>(Stmt)) { + SaveAndRestore<std::string> 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<MemberCallStmtAST*>(Stmt)) { + emitMemberCall(Call->getCall()); + return; + } + if (auto *Call = dynamic_cast<CallStmtAST*>(Stmt)) { emitCall(Call->getCallee(), Call->getArgs(), Call->getLine()); return; |
