Change Alternative to a class (#853)

Revives BisonWrap because this seems a reasonable use of it (avoiding the need to have an std::optional or pointer for Alternative, both of which I thought could be unclear about the intent).
This commit is contained in:
Jon Meow
2021-09-27 09:05:22 -07:00
committed by GitHub
parent 6ab2bff69c
commit 721743bc58
7 changed files with 84 additions and 22 deletions
+17 -7
View File
@@ -95,10 +95,21 @@ class ClassDeclaration : public Declaration {
class ChoiceDeclaration : public Declaration {
public:
ChoiceDeclaration(
SourceLocation loc, std::string name,
std::vector<std::pair<std::string, Nonnull<const Expression*>>>
alternatives)
class Alternative {
public:
Alternative(std::string name, Nonnull<const Expression*> signature)
: name_(name), signature_(signature) {}
auto name() const -> const std::string& { return name_; }
auto signature() const -> const Expression& { return *signature_; }
private:
std::string name_;
Nonnull<const Expression*> signature_;
};
ChoiceDeclaration(SourceLocation loc, std::string name,
std::vector<Alternative> alternatives)
: Declaration(Kind::ChoiceDeclaration, loc),
name(std::move(name)),
alternatives(std::move(alternatives)) {}
@@ -108,14 +119,13 @@ class ChoiceDeclaration : public Declaration {
}
auto Name() const -> const std::string& { return name; }
auto Alternatives() const -> const
std::vector<std::pair<std::string, Nonnull<const Expression*>>>& {
auto Alternatives() const -> const std::vector<Alternative>& {
return alternatives;
}
private:
std::string name;
std::vector<std::pair<std::string, Nonnull<const Expression*>>> alternatives;
std::vector<Alternative> alternatives;
};
// Global variable definition implements the Declaration concept.