14
14
#include " executable_semantics/ast/paren_contents.h"
15
15
#include " executable_semantics/ast/source_location.h"
16
16
#include " executable_semantics/common/arena.h"
17
+ #include " llvm/ADT/ArrayRef.h"
17
18
#include " llvm/Support/Compiler.h"
18
19
19
20
namespace Carbon {
@@ -64,26 +65,24 @@ class Expression {
64
65
// tuple otherwise.
65
66
auto ExpressionFromParenContents (
66
67
Nonnull<Arena*> arena, SourceLocation loc,
67
- const ParenContents<Expression>& paren_contents)
68
- -> Nonnull<const Expression*>;
68
+ const ParenContents<Expression>& paren_contents) -> Nonnull<Expression*>;
69
69
70
70
// Converts paren_contents to an Expression, interpreting the parentheses as
71
71
// forming a tuple.
72
72
auto TupleExpressionFromParenContents (
73
73
Nonnull<Arena*> arena, SourceLocation loc,
74
- const ParenContents<Expression>& paren_contents)
75
- -> Nonnull<const Expression*>;
74
+ const ParenContents<Expression>& paren_contents) -> Nonnull<Expression*>;
76
75
77
76
// A FieldInitializer represents the initialization of a single tuple field.
78
77
struct FieldInitializer {
79
- FieldInitializer (std::string name, Nonnull<const Expression*> expression)
78
+ FieldInitializer (std::string name, Nonnull<Expression*> expression)
80
79
: name(std::move(name)), expression(expression) {}
81
80
82
81
// The field name. Cannot be empty.
83
82
std::string name;
84
83
85
84
// The expression that initializes the field.
86
- Nonnull<const Expression*> expression;
85
+ Nonnull<Expression*> expression;
87
86
};
88
87
89
88
enum class Operator {
@@ -117,7 +116,7 @@ class IdentifierExpression : public Expression {
117
116
class FieldAccessExpression : public Expression {
118
117
public:
119
118
explicit FieldAccessExpression (SourceLocation loc,
120
- Nonnull<const Expression*> aggregate,
119
+ Nonnull<Expression*> aggregate,
121
120
std::string field)
122
121
: Expression(Kind::FieldAccessExpression, loc),
123
122
aggregate(aggregate),
@@ -128,18 +127,18 @@ class FieldAccessExpression : public Expression {
128
127
}
129
128
130
129
auto Aggregate () const -> Nonnull<const Expression*> { return aggregate; }
130
+ auto Aggregate () -> Nonnull<Expression*> { return aggregate; }
131
131
auto Field () const -> const std::string& { return field; }
132
132
133
133
private:
134
- Nonnull<const Expression*> aggregate;
134
+ Nonnull<Expression*> aggregate;
135
135
std::string field;
136
136
};
137
137
138
138
class IndexExpression : public Expression {
139
139
public:
140
- explicit IndexExpression (SourceLocation loc,
141
- Nonnull<const Expression*> aggregate,
142
- Nonnull<const Expression*> offset)
140
+ explicit IndexExpression (SourceLocation loc, Nonnull<Expression*> aggregate,
141
+ Nonnull<Expression*> offset)
143
142
: Expression(Kind::IndexExpression, loc),
144
143
aggregate(aggregate),
145
144
offset(offset) {}
@@ -149,11 +148,13 @@ class IndexExpression : public Expression {
149
148
}
150
149
151
150
auto Aggregate () const -> Nonnull<const Expression*> { return aggregate; }
151
+ auto Aggregate () -> Nonnull<Expression*> { return aggregate; }
152
152
auto Offset () const -> Nonnull<const Expression*> { return offset; }
153
+ auto Offset () -> Nonnull<Expression*> { return offset; }
153
154
154
155
private:
155
- Nonnull<const Expression*> aggregate;
156
- Nonnull<const Expression*> offset;
156
+ Nonnull<Expression*> aggregate;
157
+ Nonnull<Expression*> offset;
157
158
};
158
159
159
160
class IntLiteral : public Expression {
@@ -233,7 +234,7 @@ class PrimitiveOperatorExpression : public Expression {
233
234
public:
234
235
explicit PrimitiveOperatorExpression (
235
236
SourceLocation loc, Operator op,
236
- std::vector<Nonnull<const Expression*>> arguments)
237
+ std::vector<Nonnull<Expression*>> arguments)
237
238
: Expression(Kind::PrimitiveOperatorExpression, loc),
238
239
op(op),
239
240
arguments(std::move(arguments)) {}
@@ -243,20 +244,22 @@ class PrimitiveOperatorExpression : public Expression {
243
244
}
244
245
245
246
auto Op () const -> Operator { return op; }
246
- auto Arguments () const -> const std::vector<Nonnull<const Expression*>>& {
247
+ auto Arguments () const -> llvm::ArrayRef<Nonnull<Expression*>> {
248
+ return arguments;
249
+ }
250
+ auto Arguments () -> llvm::MutableArrayRef<Nonnull<Expression*>> {
247
251
return arguments;
248
252
}
249
253
250
254
private:
251
255
Operator op;
252
- std::vector<Nonnull<const Expression*>> arguments;
256
+ std::vector<Nonnull<Expression*>> arguments;
253
257
};
254
258
255
259
class CallExpression : public Expression {
256
260
public:
257
- explicit CallExpression (SourceLocation loc,
258
- Nonnull<const Expression*> function,
259
- Nonnull<const Expression*> argument)
261
+ explicit CallExpression (SourceLocation loc, Nonnull<Expression*> function,
262
+ Nonnull<Expression*> argument)
260
263
: Expression(Kind::CallExpression, loc),
261
264
function(function),
262
265
argument(argument) {}
@@ -266,18 +269,20 @@ class CallExpression : public Expression {
266
269
}
267
270
268
271
auto Function () const -> Nonnull<const Expression*> { return function; }
272
+ auto Function () -> Nonnull<Expression*> { return function; }
269
273
auto Argument () const -> Nonnull<const Expression*> { return argument; }
274
+ auto Argument () -> Nonnull<Expression*> { return argument; }
270
275
271
276
private:
272
- Nonnull<const Expression*> function;
273
- Nonnull<const Expression*> argument;
277
+ Nonnull<Expression*> function;
278
+ Nonnull<Expression*> argument;
274
279
};
275
280
276
281
class FunctionTypeLiteral : public Expression {
277
282
public:
278
283
explicit FunctionTypeLiteral (SourceLocation loc,
279
- Nonnull<const Expression*> parameter,
280
- Nonnull<const Expression*> return_type,
284
+ Nonnull<Expression*> parameter,
285
+ Nonnull<Expression*> return_type,
281
286
bool is_omitted_return_type)
282
287
: Expression(Kind::FunctionTypeLiteral, loc),
283
288
parameter(parameter),
@@ -289,12 +294,14 @@ class FunctionTypeLiteral : public Expression {
289
294
}
290
295
291
296
auto Parameter () const -> Nonnull<const Expression*> { return parameter; }
297
+ auto Parameter () -> Nonnull<Expression*> { return parameter; }
292
298
auto ReturnType () const -> Nonnull<const Expression*> { return return_type; }
299
+ auto ReturnType () -> Nonnull<Expression*> { return return_type; }
293
300
auto IsOmittedReturnType () const -> bool { return is_omitted_return_type; }
294
301
295
302
private:
296
- Nonnull<const Expression*> parameter;
297
- Nonnull<const Expression*> return_type;
303
+ Nonnull<Expression*> parameter;
304
+ Nonnull<Expression*> return_type;
298
305
bool is_omitted_return_type;
299
306
};
300
307
0 commit comments