Explorer: support virtual class methods (#2462)

Features:
* Add `virtual` virtual override keyword for functions
* Support `virtual` class methods using dynamic dispatch

Changes:
* Add `vtable` in `NominalClassType`, 
* Add `NominalClassValue**` in class values pointing to  descendant-most class
* Resolve virtual methods during member lookup

Limitations:
* Does not include yet `impl`, `abstract` virtual override keywords, or the complete logic for virtual function declaration

Depends on #2460 
Relates to #1881 
Relates to #2493
This commit is contained in:
Adrien Leravat
2023-01-02 12:37:49 -08:00
committed by GitHub
parent dd26ea6a15
commit 8301258ef8
17 changed files with 359 additions and 39 deletions
+3 -2
View File
@@ -341,14 +341,15 @@ auto FunctionDeclaration::Create(Nonnull<Arena*> arena,
std::vector<Nonnull<AstNode*>> deduced_params,
Nonnull<TuplePattern*> param_pattern,
ReturnTerm return_term,
std::optional<Nonnull<Block*>> body)
std::optional<Nonnull<Block*>> body,
bool is_virtual)
-> ErrorOr<Nonnull<FunctionDeclaration*>> {
DeducedParameters split_params;
CARBON_ASSIGN_OR_RETURN(split_params,
SplitDeducedParameters(source_loc, deduced_params));
return arena->New<FunctionDeclaration>(
source_loc, name, std::move(split_params.resolved_params),
split_params.self_pattern, param_pattern, return_term, body);
split_params.self_pattern, param_pattern, return_term, body, is_virtual);
}
void CallableDeclaration::PrintDepth(int depth, llvm::raw_ostream& out) const {