Refactor Pattern and Member accessors. (#889)

This commit is contained in:
Jon Meow
2021-10-18 10:25:52 -07:00
committed by GitHub
parent b278e4edcf
commit 8bda2ca432
7 changed files with 94 additions and 96 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ void Member::Print(llvm::raw_ostream& out) const {
switch (kind()) {
case Kind::FieldMember:
const auto& field = cast<FieldMember>(*this);
out << "var " << *field.Binding() << ";\n";
out << "var " << field.binding() << ";\n";
break;
}
}
+3 -3
View File
@@ -54,19 +54,19 @@ class Member {
class FieldMember : public Member {
public:
FieldMember(SourceLocation source_loc, Nonnull<const BindingPattern*> binding)
: Member(Kind::FieldMember, source_loc), binding(binding) {}
: Member(Kind::FieldMember, source_loc), binding_(binding) {}
static auto classof(const Member* member) -> bool {
return member->kind() == Kind::FieldMember;
}
auto Binding() const -> Nonnull<const BindingPattern*> { return binding; }
auto binding() const -> const BindingPattern& { return *binding_; }
private:
// TODO: split this into a non-optional name and a type, initialized by
// a constructor that takes a BindingPattern and handles errors like a
// missing name.
Nonnull<const BindingPattern*> binding;
Nonnull<const BindingPattern*> binding_;
};
} // namespace Carbon
+10 -10
View File
@@ -24,19 +24,19 @@ void Pattern::Print(llvm::raw_ostream& out) const {
break;
case Kind::BindingPattern: {
const auto& binding = cast<BindingPattern>(*this);
if (binding.Name().has_value()) {
out << *binding.Name();
if (binding.name().has_value()) {
out << *binding.name();
} else {
out << "_";
}
out << ": " << *binding.Type();
out << ": " << binding.type();
break;
}
case Kind::TuplePattern: {
const auto& tuple = cast<TuplePattern>(*this);
out << "(";
llvm::ListSeparator sep;
for (Nonnull<const Pattern*> field : tuple.Fields()) {
for (Nonnull<const Pattern*> field : tuple.fields()) {
out << sep << *field;
}
out << ")";
@@ -44,12 +44,12 @@ void Pattern::Print(llvm::raw_ostream& out) const {
}
case Kind::AlternativePattern: {
const auto& alternative = cast<AlternativePattern>(*this);
out << *alternative.ChoiceType() << "." << alternative.AlternativeName()
<< *alternative.Arguments();
out << alternative.choice_type() << "." << alternative.alternative_name()
<< alternative.arguments();
break;
}
case Kind::ExpressionPattern:
out << *cast<ExpressionPattern>(*this).Expression();
out << cast<ExpressionPattern>(*this).expression();
break;
}
}
@@ -88,9 +88,9 @@ AlternativePattern::AlternativePattern(SourceLocation source_loc,
Nonnull<Expression*> alternative,
Nonnull<TuplePattern*> arguments)
: Pattern(Kind::AlternativePattern, source_loc),
choice_type(&RequireFieldAccess(alternative).aggregate()),
alternative_name(RequireFieldAccess(alternative).field()),
arguments(arguments) {}
choice_type_(&RequireFieldAccess(alternative).aggregate()),
alternative_name_(RequireFieldAccess(alternative).field()),
arguments_(arguments) {}
auto ParenExpressionToParenPattern(Nonnull<Arena*> arena,
const ParenContents<Expression>& contents)
+28 -28
View File
@@ -92,42 +92,42 @@ class BindingPattern : public Pattern {
BindingPattern(SourceLocation source_loc, std::optional<std::string> name,
Nonnull<Pattern*> type)
: Pattern(Kind::BindingPattern, source_loc),
name(std::move(name)),
type(type) {}
name_(std::move(name)),
type_(type) {}
static auto classof(const Pattern* pattern) -> bool {
return pattern->kind() == Kind::BindingPattern;
}
// The name this pattern binds, if any.
auto Name() const -> const std::optional<std::string>& { return name; }
auto name() const -> const std::optional<std::string>& { return name_; }
// The pattern specifying the type of values that this pattern matches.
auto Type() const -> Nonnull<const Pattern*> { return type; }
auto Type() -> Nonnull<Pattern*> { return type; }
auto type() const -> const Pattern& { return *type_; }
auto type() -> Pattern& { return *type_; }
private:
std::optional<std::string> name;
Nonnull<Pattern*> type;
std::optional<std::string> name_;
Nonnull<Pattern*> type_;
};
// A pattern that matches a tuple value field-wise.
class TuplePattern : public Pattern {
public:
TuplePattern(SourceLocation source_loc, std::vector<Nonnull<Pattern*>> fields)
: Pattern(Kind::TuplePattern, source_loc), fields(std::move(fields)) {}
: Pattern(Kind::TuplePattern, source_loc), fields_(std::move(fields)) {}
static auto classof(const Pattern* pattern) -> bool {
return pattern->kind() == Kind::TuplePattern;
}
auto Fields() const -> llvm::ArrayRef<Nonnull<const Pattern*>> {
return fields;
auto fields() const -> llvm::ArrayRef<Nonnull<const Pattern*>> {
return fields_;
}
auto Fields() -> llvm::ArrayRef<Nonnull<Pattern*>> { return fields; }
auto fields() -> llvm::ArrayRef<Nonnull<Pattern*>> { return fields_; }
private:
std::vector<Nonnull<Pattern*>> fields;
std::vector<Nonnull<Pattern*>> fields_;
};
// Converts paren_contents to a Pattern, interpreting the parentheses as
@@ -161,9 +161,9 @@ class AlternativePattern : public Pattern {
std::string alternative_name,
Nonnull<TuplePattern*> arguments)
: Pattern(Kind::AlternativePattern, source_loc),
choice_type(choice_type),
alternative_name(std::move(alternative_name)),
arguments(arguments) {}
choice_type_(choice_type),
alternative_name_(std::move(alternative_name)),
arguments_(arguments) {}
// Constructs an AlternativePattern that matches the alternative specified
// by `alternative`, if its arguments match `arguments`.
@@ -175,18 +175,18 @@ class AlternativePattern : public Pattern {
return pattern->kind() == Kind::AlternativePattern;
}
auto ChoiceType() const -> Nonnull<const Expression*> { return choice_type; }
auto ChoiceType() -> Nonnull<Expression*> { return choice_type; }
auto AlternativeName() const -> const std::string& {
return alternative_name;
auto choice_type() const -> const Expression& { return *choice_type_; }
auto choice_type() -> Expression& { return *choice_type_; }
auto alternative_name() const -> const std::string& {
return alternative_name_;
}
auto Arguments() const -> Nonnull<const TuplePattern*> { return arguments; }
auto Arguments() -> Nonnull<TuplePattern*> { return arguments; }
auto arguments() const -> const TuplePattern& { return *arguments_; }
auto arguments() -> TuplePattern& { return *arguments_; }
private:
Nonnull<Expression*> choice_type;
std::string alternative_name;
Nonnull<TuplePattern*> arguments;
Nonnull<Expression*> choice_type_;
std::string alternative_name_;
Nonnull<TuplePattern*> arguments_;
};
// A pattern that matches a value if it is equal to the value of a given
@@ -195,17 +195,17 @@ class ExpressionPattern : public Pattern {
public:
ExpressionPattern(Nonnull<Expression*> expression)
: Pattern(Kind::ExpressionPattern, expression->source_loc()),
expression(expression) {}
expression_(expression) {}
static auto classof(const Pattern* pattern) -> bool {
return pattern->kind() == Kind::ExpressionPattern;
}
auto Expression() const -> Nonnull<const Expression*> { return expression; }
auto Expression() -> Nonnull<Carbon::Expression*> { return expression; }
auto expression() const -> const Expression& { return *expression_; }
auto expression() -> Expression& { return *expression_; }
private:
Nonnull<Carbon::Expression*> expression;
Nonnull<Expression*> expression_;
};
} // namespace Carbon
+7 -7
View File
@@ -38,7 +38,7 @@ TEST_F(PatternTest, EmptyAsPattern) {
PatternFromParenContents(&arena, FakeSourceLoc(1), contents);
EXPECT_EQ(pattern->source_loc(), FakeSourceLoc(1));
ASSERT_TRUE(isa<TuplePattern>(*pattern));
EXPECT_THAT(cast<TuplePattern>(*pattern).Fields(), IsEmpty());
EXPECT_THAT(cast<TuplePattern>(*pattern).fields(), IsEmpty());
}
TEST_F(PatternTest, EmptyAsTuplePattern) {
@@ -47,7 +47,7 @@ TEST_F(PatternTest, EmptyAsTuplePattern) {
Nonnull<const TuplePattern*> tuple =
TuplePatternFromParenContents(&arena, FakeSourceLoc(1), contents);
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
EXPECT_THAT(tuple->Fields(), IsEmpty());
EXPECT_THAT(tuple->fields(), IsEmpty());
}
TEST_F(PatternTest, UnaryNoCommaAsPattern) {
@@ -75,7 +75,7 @@ TEST_F(PatternTest, UnaryNoCommaAsTuplePattern) {
Nonnull<const TuplePattern*> tuple =
TuplePatternFromParenContents(&arena, FakeSourceLoc(1), contents);
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
EXPECT_THAT(tuple->Fields(), ElementsAre(AutoField()));
EXPECT_THAT(tuple->fields(), ElementsAre(AutoField()));
}
TEST_F(PatternTest, UnaryWithCommaAsPattern) {
@@ -87,7 +87,7 @@ TEST_F(PatternTest, UnaryWithCommaAsPattern) {
PatternFromParenContents(&arena, FakeSourceLoc(1), contents);
EXPECT_EQ(pattern->source_loc(), FakeSourceLoc(1));
ASSERT_TRUE(isa<TuplePattern>(*pattern));
EXPECT_THAT(cast<TuplePattern>(*pattern).Fields(), ElementsAre(AutoField()));
EXPECT_THAT(cast<TuplePattern>(*pattern).fields(), ElementsAre(AutoField()));
}
TEST_F(PatternTest, UnaryWithCommaAsTuplePattern) {
@@ -98,7 +98,7 @@ TEST_F(PatternTest, UnaryWithCommaAsTuplePattern) {
Nonnull<const TuplePattern*> tuple =
TuplePatternFromParenContents(&arena, FakeSourceLoc(1), contents);
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
EXPECT_THAT(tuple->Fields(), ElementsAre(AutoField()));
EXPECT_THAT(tuple->fields(), ElementsAre(AutoField()));
}
TEST_F(PatternTest, BinaryAsPattern) {
@@ -111,7 +111,7 @@ TEST_F(PatternTest, BinaryAsPattern) {
PatternFromParenContents(&arena, FakeSourceLoc(1), contents);
EXPECT_EQ(pattern->source_loc(), FakeSourceLoc(1));
ASSERT_TRUE(isa<TuplePattern>(*pattern));
EXPECT_THAT(cast<TuplePattern>(*pattern).Fields(),
EXPECT_THAT(cast<TuplePattern>(*pattern).fields(),
ElementsAre(AutoField(), AutoField()));
}
@@ -124,7 +124,7 @@ TEST_F(PatternTest, BinaryAsTuplePattern) {
Nonnull<const TuplePattern*> tuple =
TuplePatternFromParenContents(&arena, FakeSourceLoc(1), contents);
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
EXPECT_THAT(tuple->Fields(), ElementsAre(AutoField(), AutoField()));
EXPECT_THAT(tuple->fields(), ElementsAre(AutoField(), AutoField()));
}
} // namespace