Private unions (#492)

* changed union of Statement to be private

* changed the union in Expression to be private

* changed union in Value to be private

* changed AST constructors to be static methods

* updates to syntax unit tests
This commit is contained in:
Jeremy G. Siek
2021-04-27 14:29:13 -04:00
committed by GitHub
parent 1933cfeeeb
commit 8924f5620b
11 changed files with 1105 additions and 780 deletions
@@ -14,7 +14,7 @@ TEST(ParenContentsTest, EmptyAsExpression) {
const Expression* expression = contents.AsExpression(/*line_num=*/1);
EXPECT_EQ(expression->line_num, 1);
ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
EXPECT_EQ(expression->u.tuple.fields->size(), 0);
EXPECT_EQ(expression->GetTuple().fields->size(), 0);
}
TEST(ParenContentsTest, EmptyAsTuple) {
@@ -22,7 +22,7 @@ TEST(ParenContentsTest, EmptyAsTuple) {
const Expression* tuple = contents.AsTuple(/*line_num=*/1);
EXPECT_EQ(tuple->line_num, 1);
ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
EXPECT_EQ(tuple->u.tuple.fields->size(), 0);
EXPECT_EQ(tuple->GetTuple().fields->size(), 0);
}
TEST(ParenContentsTest, UnaryNoCommaAsExpression) {
@@ -32,8 +32,9 @@ TEST(ParenContentsTest, UnaryNoCommaAsExpression) {
// 42
// )
// ```
ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::No);
ParenContents contents(
{{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::No);
const Expression* expression = contents.AsExpression(/*line_num=*/1);
EXPECT_EQ(expression->line_num, 2);
@@ -41,64 +42,69 @@ TEST(ParenContentsTest, UnaryNoCommaAsExpression) {
}
TEST(ParenContentsTest, UnaryNoCommaAsTuple) {
ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::No);
ParenContents contents(
{{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::No);
const Expression* tuple = contents.AsTuple(/*line_num=*/1);
EXPECT_EQ(tuple->line_num, 1);
ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
std::vector<FieldInitializer> fields = *tuple->u.tuple.fields;
std::vector<FieldInitializer> fields = *tuple->GetTuple().fields;
ASSERT_EQ(fields.size(), 1);
EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
}
TEST(ParenContentsTest, UnaryWithCommaAsExpression) {
ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::Yes);
ParenContents contents(
{{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::Yes);
const Expression* expression = contents.AsExpression(/*line_num=*/1);
EXPECT_EQ(expression->line_num, 1);
ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
std::vector<FieldInitializer> fields = *expression->u.tuple.fields;
std::vector<FieldInitializer> fields = *expression->GetTuple().fields;
ASSERT_EQ(fields.size(), 1);
EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
}
TEST(ParenContentsTest, UnaryWithCommaAsTuple) {
ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::Yes);
ParenContents contents(
{{.expression = Expression::MakeInt(/*line_num=*/2, 42)}},
ParenContents::HasTrailingComma::Yes);
const Expression* tuple = contents.AsTuple(/*line_num=*/1);
EXPECT_EQ(tuple->line_num, 1);
ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
std::vector<FieldInitializer> fields = *tuple->u.tuple.fields;
std::vector<FieldInitializer> fields = *tuple->GetTuple().fields;
ASSERT_EQ(fields.size(), 1);
EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
}
TEST(ParenContentsTest, BinaryAsExpression) {
ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)},
{.expression = MakeInt(/*line_num=*/3, 42)}},
ParenContents::HasTrailingComma::Yes);
ParenContents contents(
{{.expression = Expression::MakeInt(/*line_num=*/2, 42)},
{.expression = Expression::MakeInt(/*line_num=*/3, 42)}},
ParenContents::HasTrailingComma::Yes);
const Expression* expression = contents.AsExpression(/*line_num=*/1);
EXPECT_EQ(expression->line_num, 1);
ASSERT_EQ(expression->tag, ExpressionKind::Tuple);
std::vector<FieldInitializer> fields = *expression->u.tuple.fields;
std::vector<FieldInitializer> fields = *expression->GetTuple().fields;
ASSERT_EQ(fields.size(), 2);
EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
EXPECT_EQ(fields[1].expression->tag, ExpressionKind::Integer);
}
TEST(ParenContentsTest, BinaryAsTuple) {
ParenContents contents({{.expression = MakeInt(/*line_num=*/2, 42)},
{.expression = MakeInt(/*line_num=*/3, 42)}},
ParenContents::HasTrailingComma::Yes);
ParenContents contents(
{{.expression = Expression::MakeInt(/*line_num=*/2, 42)},
{.expression = Expression::MakeInt(/*line_num=*/3, 42)}},
ParenContents::HasTrailingComma::Yes);
const Expression* tuple = contents.AsTuple(/*line_num=*/1);
EXPECT_EQ(tuple->line_num, 1);
ASSERT_EQ(tuple->tag, ExpressionKind::Tuple);
std::vector<FieldInitializer> fields = *tuple->u.tuple.fields;
std::vector<FieldInitializer> fields = *tuple->GetTuple().fields;
ASSERT_EQ(fields.size(), 2);
EXPECT_EQ(fields[0].expression->tag, ExpressionKind::Integer);
EXPECT_EQ(fields[1].expression->tag, ExpressionKind::Integer);