Explorer: Support class extension (#1946)

Support class extension with `extends`
Relates to #1881 

Add support for:
* Class extension with `extends`
* Using base class methods and members
This commit is contained in:
Adrien Leravat
2022-10-21 08:08:07 -07:00
committed by GitHub
parent d76835bed4
commit 7c19ef5be3
14 changed files with 353 additions and 56 deletions
+13 -5
View File
@@ -253,14 +253,14 @@ class ClassDeclaration : public Declaration {
Nonnull<SelfDeclaration*> self_decl,
ClassExtensibility extensibility,
std::optional<Nonnull<TuplePattern*>> type_params,
std::optional<Nonnull<Expression*>> extends,
std::optional<Nonnull<Expression*>> base,
std::vector<Nonnull<Declaration*>> members)
: Declaration(AstNodeKind::ClassDeclaration, source_loc),
name_(std::move(name)),
extensibility_(extensibility),
self_decl_(self_decl),
type_params_(type_params),
extends_(extends),
base_expr_(base),
members_(std::move(members)) {}
static auto classof(const AstNode* node) -> bool {
@@ -275,8 +275,8 @@ class ClassDeclaration : public Declaration {
auto type_params() -> std::optional<Nonnull<TuplePattern*>> {
return type_params_;
}
auto extends() const -> std::optional<Nonnull<Expression*>> {
return extends_;
auto base_expr() const -> std::optional<Nonnull<Expression*>> {
return base_expr_;
}
auto self() const -> Nonnull<const SelfDeclaration*> { return self_decl_; }
auto self() -> Nonnull<SelfDeclaration*> { return self_decl_; }
@@ -295,14 +295,22 @@ class ClassDeclaration : public Declaration {
auto value_category() const -> ValueCategory { return ValueCategory::Let; }
auto base() const -> std::optional<Nonnull<const ClassDeclaration*>> {
return base_;
}
void set_base(Nonnull<const ClassDeclaration*> base_decl) {
base_ = base_decl;
}
private:
std::string name_;
ClassExtensibility extensibility_;
Nonnull<SelfDeclaration*> self_decl_;
std::optional<Nonnull<TuplePattern*>> type_params_;
std::optional<Nonnull<Expression*>> extends_;
std::optional<Nonnull<Expression*>> base_expr_;
std::vector<Nonnull<Declaration*>> members_;
std::optional<Nonnull<FunctionDeclaration*>> destructor_;
std::optional<Nonnull<const ClassDeclaration*>> base_;
};
// EXPERIMENTAL MIXIN FEATURE