mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 22:02:52 +01:00
Stop using std::pair in the implementation of tuples (#479)
This commit is contained in:
@@ -143,8 +143,7 @@ auto MakeGetField(int line_num, const Expression* exp, std::string field)
|
||||
return e;
|
||||
}
|
||||
|
||||
auto MakeTuple(int line_num,
|
||||
std::vector<std::pair<std::string, const Expression*>>* args)
|
||||
auto MakeTuple(int line_num, std::vector<FieldInitializer>* args)
|
||||
-> const Expression* {
|
||||
auto* e = new Expression();
|
||||
e->line_num = line_num;
|
||||
@@ -152,14 +151,14 @@ auto MakeTuple(int line_num,
|
||||
int i = 0;
|
||||
bool seen_named_member = false;
|
||||
for (auto& arg : *args) {
|
||||
if (arg.first == "") {
|
||||
if (arg.name == "") {
|
||||
if (seen_named_member) {
|
||||
std::cerr << line_num
|
||||
<< ": positional members must come before named members"
|
||||
<< std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
arg.first = std::to_string(i);
|
||||
arg.name = std::to_string(i);
|
||||
++i;
|
||||
} else {
|
||||
seen_named_member = true;
|
||||
@@ -176,7 +175,7 @@ auto MakeUnit(int line_num) -> const Expression* {
|
||||
auto* unit = new Expression();
|
||||
unit->line_num = line_num;
|
||||
unit->tag = ExpressionKind::Tuple;
|
||||
auto* args = new std::vector<std::pair<std::string, const Expression*>>();
|
||||
auto* args = new std::vector<FieldInitializer>();
|
||||
unit->u.tuple.fields = args;
|
||||
return unit;
|
||||
}
|
||||
@@ -217,15 +216,14 @@ static void PrintOp(Operator op) {
|
||||
}
|
||||
}
|
||||
|
||||
static void PrintFields(
|
||||
std::vector<std::pair<std::string, const Expression*>>* fields) {
|
||||
static void PrintFields(std::vector<FieldInitializer>* fields) {
|
||||
int i = 0;
|
||||
for (auto iter = fields->begin(); iter != fields->end(); ++iter, ++i) {
|
||||
if (i != 0) {
|
||||
std::cout << ", ";
|
||||
}
|
||||
std::cout << iter->first << " = ";
|
||||
PrintExp(iter->second);
|
||||
std::cout << iter->name << " = ";
|
||||
PrintExp(iter->expression);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,17 @@
|
||||
|
||||
namespace Carbon {
|
||||
|
||||
struct Expression;
|
||||
|
||||
// A FieldInitializer represents the initialization of a single tuple field.
|
||||
struct FieldInitializer {
|
||||
// The field name. For a positional field, this may be empty.
|
||||
std::string name;
|
||||
|
||||
// The expression that initializes the field.
|
||||
const Expression* expression;
|
||||
};
|
||||
|
||||
enum class ExpressionKind {
|
||||
AutoT,
|
||||
BoolT,
|
||||
@@ -65,7 +76,7 @@ struct Expression {
|
||||
bool boolean;
|
||||
|
||||
struct {
|
||||
std::vector<std::pair<std::string, const Expression*>>* fields;
|
||||
std::vector<FieldInitializer>* fields;
|
||||
} tuple;
|
||||
|
||||
struct {
|
||||
@@ -101,8 +112,7 @@ auto MakeCall(int line_num, const Expression* fun, const Expression* arg)
|
||||
-> const Expression*;
|
||||
auto MakeGetField(int line_num, const Expression* exp, std::string field)
|
||||
-> const Expression*;
|
||||
auto MakeTuple(int line_num,
|
||||
std::vector<std::pair<std::string, const Expression*>>* args)
|
||||
auto MakeTuple(int line_num, std::vector<FieldInitializer>* args)
|
||||
-> const Expression*;
|
||||
// Create an AST node for an empty tuple.
|
||||
auto MakeUnit(int line_num) -> const Expression*;
|
||||
|
||||
Reference in New Issue
Block a user