mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 07:11:04 +01:00
* Make tuple/struct fields mutable. * Avoid ExpectType when we know it will fail.
This commit is contained in:
@@ -68,7 +68,7 @@ static void PrintFields(llvm::raw_ostream& out,
|
||||
std::string_view separator) {
|
||||
llvm::ListSeparator sep;
|
||||
for (const auto& field : fields) {
|
||||
out << sep << "." << field.name << separator << *field.expression;
|
||||
out << sep << "." << field.name() << separator << *field.expression();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ void Expression::Print(llvm::raw_ostream& out) const {
|
||||
}
|
||||
case Expression::Kind::TupleLiteral:
|
||||
out << "(";
|
||||
PrintFields(out, cast<TupleLiteral>(*this).Fields(), " = ");
|
||||
PrintFields(out, cast<TupleLiteral>(*this).fields(), " = ");
|
||||
out << ")";
|
||||
break;
|
||||
case Expression::Kind::StructLiteral:
|
||||
|
||||
@@ -76,16 +76,24 @@ auto TupleExpressionFromParenContents(
|
||||
Nonnull<Arena*> arena, SourceLocation source_loc,
|
||||
const ParenContents<Expression>& paren_contents) -> Nonnull<Expression*>;
|
||||
|
||||
// A FieldInitializer represents the initialization of a single tuple field.
|
||||
struct FieldInitializer {
|
||||
// A FieldInitializer represents the initialization of a single tuple or
|
||||
// struct field.
|
||||
class FieldInitializer {
|
||||
public:
|
||||
FieldInitializer(std::string name, Nonnull<Expression*> expression)
|
||||
: name(std::move(name)), expression(expression) {}
|
||||
: name_(std::move(name)), expression_(expression) {}
|
||||
|
||||
auto name() const -> const std::string& { return name_; }
|
||||
|
||||
auto expression() const -> Nonnull<const Expression*> { return expression_; }
|
||||
auto expression() -> Nonnull<Expression*> { return expression_; }
|
||||
|
||||
private:
|
||||
// The field name. Cannot be empty.
|
||||
std::string name;
|
||||
std::string name_;
|
||||
|
||||
// The expression that initializes the field.
|
||||
Nonnull<Expression*> expression;
|
||||
Nonnull<Expression*> expression_;
|
||||
};
|
||||
|
||||
enum class Operator {
|
||||
@@ -224,16 +232,18 @@ class TupleLiteral : public Expression {
|
||||
|
||||
explicit TupleLiteral(SourceLocation source_loc,
|
||||
std::vector<FieldInitializer> fields)
|
||||
: Expression(Kind::TupleLiteral, source_loc), fields(std::move(fields)) {}
|
||||
: Expression(Kind::TupleLiteral, source_loc),
|
||||
fields_(std::move(fields)) {}
|
||||
|
||||
static auto classof(const Expression* exp) -> bool {
|
||||
return exp->kind() == Kind::TupleLiteral;
|
||||
}
|
||||
|
||||
auto Fields() const -> const std::vector<FieldInitializer>& { return fields; }
|
||||
auto fields() const -> llvm::ArrayRef<FieldInitializer> { return fields_; }
|
||||
auto fields() -> llvm::MutableArrayRef<FieldInitializer> { return fields_; }
|
||||
|
||||
private:
|
||||
std::vector<FieldInitializer> fields;
|
||||
std::vector<FieldInitializer> fields_;
|
||||
};
|
||||
|
||||
// A non-empty literal value of a struct type.
|
||||
@@ -255,9 +265,8 @@ class StructLiteral : public Expression {
|
||||
return exp->kind() == Kind::StructLiteral;
|
||||
}
|
||||
|
||||
auto fields() const -> const std::vector<FieldInitializer>& {
|
||||
return fields_;
|
||||
}
|
||||
auto fields() const -> llvm::ArrayRef<FieldInitializer> { return fields_; }
|
||||
auto fields() -> llvm::MutableArrayRef<FieldInitializer> { return fields_; }
|
||||
|
||||
private:
|
||||
std::vector<FieldInitializer> fields_;
|
||||
@@ -279,9 +288,8 @@ class StructTypeLiteral : public Expression {
|
||||
return exp->kind() == Kind::StructTypeLiteral;
|
||||
}
|
||||
|
||||
auto fields() const -> const std::vector<FieldInitializer>& {
|
||||
return fields_;
|
||||
}
|
||||
auto fields() const -> llvm::ArrayRef<FieldInitializer> { return fields_; }
|
||||
auto fields() -> llvm::MutableArrayRef<FieldInitializer> { return fields_; }
|
||||
|
||||
private:
|
||||
std::vector<FieldInitializer> fields_;
|
||||
|
||||
@@ -22,8 +22,8 @@ using testing::IsEmpty;
|
||||
// Matches a FieldInitializer named `name` whose `expression` is an
|
||||
// `IntLiteral`
|
||||
MATCHER_P(IntFieldNamed, name, "") {
|
||||
return arg.name == std::string(name) &&
|
||||
arg.expression->kind() == Expression::Kind::IntLiteral;
|
||||
return arg.name() == std::string(name) &&
|
||||
arg.expression()->kind() == Expression::Kind::IntLiteral;
|
||||
}
|
||||
|
||||
static auto FakeSourceLoc(int line_num) -> SourceLocation {
|
||||
@@ -42,7 +42,7 @@ TEST_F(ExpressionTest, EmptyAsExpression) {
|
||||
ExpressionFromParenContents(&arena, FakeSourceLoc(1), contents);
|
||||
EXPECT_EQ(expression->source_loc(), FakeSourceLoc(1));
|
||||
ASSERT_EQ(expression->kind(), Expression::Kind::TupleLiteral);
|
||||
EXPECT_THAT(cast<TupleLiteral>(*expression).Fields(), IsEmpty());
|
||||
EXPECT_THAT(cast<TupleLiteral>(*expression).fields(), IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ExpressionTest, EmptyAsTuple) {
|
||||
@@ -52,7 +52,7 @@ TEST_F(ExpressionTest, EmptyAsTuple) {
|
||||
TupleExpressionFromParenContents(&arena, FakeSourceLoc(1), contents);
|
||||
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
|
||||
ASSERT_EQ(tuple->kind(), Expression::Kind::TupleLiteral);
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).Fields(), IsEmpty());
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).fields(), IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ExpressionTest, UnaryNoCommaAsExpression) {
|
||||
@@ -83,7 +83,7 @@ TEST_F(ExpressionTest, UnaryNoCommaAsTuple) {
|
||||
TupleExpressionFromParenContents(&arena, FakeSourceLoc(1), contents);
|
||||
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
|
||||
ASSERT_EQ(tuple->kind(), Expression::Kind::TupleLiteral);
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).Fields(),
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).fields(),
|
||||
ElementsAre(IntFieldNamed("0")));
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ TEST_F(ExpressionTest, UnaryWithCommaAsExpression) {
|
||||
ExpressionFromParenContents(&arena, FakeSourceLoc(1), contents);
|
||||
EXPECT_EQ(expression->source_loc(), FakeSourceLoc(1));
|
||||
ASSERT_EQ(expression->kind(), Expression::Kind::TupleLiteral);
|
||||
EXPECT_THAT(cast<TupleLiteral>(*expression).Fields(),
|
||||
EXPECT_THAT(cast<TupleLiteral>(*expression).fields(),
|
||||
ElementsAre(IntFieldNamed("0")));
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ TEST_F(ExpressionTest, UnaryWithCommaAsTuple) {
|
||||
TupleExpressionFromParenContents(&arena, FakeSourceLoc(1), contents);
|
||||
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
|
||||
ASSERT_EQ(tuple->kind(), Expression::Kind::TupleLiteral);
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).Fields(),
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).fields(),
|
||||
ElementsAre(IntFieldNamed("0")));
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ TEST_F(ExpressionTest, BinaryAsExpression) {
|
||||
ExpressionFromParenContents(&arena, FakeSourceLoc(1), contents);
|
||||
EXPECT_EQ(expression->source_loc(), FakeSourceLoc(1));
|
||||
ASSERT_EQ(expression->kind(), Expression::Kind::TupleLiteral);
|
||||
EXPECT_THAT(cast<TupleLiteral>(*expression).Fields(),
|
||||
EXPECT_THAT(cast<TupleLiteral>(*expression).fields(),
|
||||
ElementsAre(IntFieldNamed("0"), IntFieldNamed("1")));
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ TEST_F(ExpressionTest, BinaryAsTuple) {
|
||||
TupleExpressionFromParenContents(&arena, FakeSourceLoc(1), contents);
|
||||
EXPECT_EQ(tuple->source_loc(), FakeSourceLoc(1));
|
||||
ASSERT_EQ(tuple->kind(), Expression::Kind::TupleLiteral);
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).Fields(),
|
||||
EXPECT_THAT(cast<TupleLiteral>(*tuple).fields(),
|
||||
ElementsAre(IntFieldNamed("0"), IntFieldNamed("1")));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user