Skip to content

Commit 7660bb4

Browse files
committed
expr: Make eval Const Again
Also remove the unused clone() function.
1 parent 75c11e6 commit 7660bb4

12 files changed

Lines changed: 191 additions & 387 deletions

include/simfil/diagnostics.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@
99

1010
#include <tl/expected.hpp>
1111
#include <optional>
12-
#include <unistd.h>
1312
#include <vector>
1413
#include <string>
15-
#include <memory>
14+
#include <cstdlib>
1615

1716
namespace simfil
1817
{
@@ -92,7 +91,7 @@ struct Diagnostics
9291
/**
9392
* Build the exprIndex_ map for the AST.
9493
*/
95-
auto prepareIndizes(Expr& ast) -> void;
94+
auto prepareIndices(const Expr& ast) -> void;
9695

9796
/**
9897
* Build messages from this objecst diagnostics data.

include/simfil/expression-visitor.h

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#pragma once
44

5-
#include <cstdint>
5+
#include <cstdlib>
66

77
namespace simfil
88
{
@@ -42,29 +42,29 @@ class ExprVisitor
4242
ExprVisitor();
4343
virtual ~ExprVisitor();
4444

45-
virtual void visit(Expr& expr);
46-
virtual void visit(WildcardExpr& expr);
47-
virtual void visit(AnyChildExpr& expr);
48-
virtual void visit(MultiConstExpr& expr);
49-
virtual void visit(ConstExpr& expr);
50-
virtual void visit(SubscriptExpr& expr);
51-
virtual void visit(SubExpr& expr);
52-
virtual void visit(AnyExpr& expr);
53-
virtual void visit(EachExpr& expr);
54-
virtual void visit(CallExpression& expr);
55-
virtual void visit(PathExpr& expr);
56-
virtual void visit(FieldExpr& expr);
57-
virtual void visit(UnpackExpr& expr);
58-
virtual void visit(UnaryWordOpExpr& expr);
59-
virtual void visit(BinaryWordOpExpr& expr);
60-
virtual void visit(AndExpr& expr);
61-
virtual void visit(OrExpr& expr);
62-
virtual void visit(BinaryExpr<OperatorEq>& expr);
63-
virtual void visit(BinaryExpr<OperatorNeq>& expr);
64-
virtual void visit(BinaryExpr<OperatorLt>& expr);
65-
virtual void visit(BinaryExpr<OperatorLtEq>& expr);
66-
virtual void visit(BinaryExpr<OperatorGt>& expr);
67-
virtual void visit(BinaryExpr<OperatorGtEq>& expr);
45+
virtual void visit(const Expr& expr);
46+
virtual void visit(const WildcardExpr& expr);
47+
virtual void visit(const AnyChildExpr& expr);
48+
virtual void visit(const MultiConstExpr& expr);
49+
virtual void visit(const ConstExpr& expr);
50+
virtual void visit(const SubscriptExpr& expr);
51+
virtual void visit(const SubExpr& expr);
52+
virtual void visit(const AnyExpr& expr);
53+
virtual void visit(const EachExpr& expr);
54+
virtual void visit(const CallExpression& expr);
55+
virtual void visit(const PathExpr& expr);
56+
virtual void visit(const FieldExpr& expr);
57+
virtual void visit(const UnpackExpr& expr);
58+
virtual void visit(const UnaryWordOpExpr& expr);
59+
virtual void visit(const BinaryWordOpExpr& expr);
60+
virtual void visit(const AndExpr& expr);
61+
virtual void visit(const OrExpr& expr);
62+
virtual void visit(const BinaryExpr<OperatorEq>& expr);
63+
virtual void visit(const BinaryExpr<OperatorNeq>& expr);
64+
virtual void visit(const BinaryExpr<OperatorLt>& expr);
65+
virtual void visit(const BinaryExpr<OperatorLtEq>& expr);
66+
virtual void visit(const BinaryExpr<OperatorGt>& expr);
67+
virtual void visit(const BinaryExpr<OperatorGtEq>& expr);
6868

6969
protected:
7070
/* Returns the index of the current expression */

include/simfil/expression.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class Expr
5959
/* Debug */
6060
virtual auto toString() const -> std::string = 0;
6161

62-
auto eval(Context ctx, const Value& val, const ResultFn& res) -> tl::expected<Result, Error>
62+
auto eval(Context ctx, const Value& val, const ResultFn& res) const -> tl::expected<Result, Error>
6363
{
6464
if (ctx.canceled())
6565
return Result::Stop;
@@ -75,7 +75,7 @@ class Expr
7575
return ieval(ctx, val, res);
7676
}
7777

78-
auto eval(Context ctx, Value&& val, const ResultFn& res) -> tl::expected<Result, Error>
78+
auto eval(Context ctx, Value&& val, const ResultFn& res) const -> tl::expected<Result, Error>
7979
{
8080
if (ctx.canceled())
8181
return Result::Stop;
@@ -90,12 +90,8 @@ class Expr
9090
return ieval(ctx, std::move(val), res);
9191
}
9292

93-
/* Recursive clone */
94-
[[nodiscard]]
95-
virtual auto clone() const -> std::unique_ptr<Expr> = 0;
96-
9793
/* Accept expression visitor */
98-
virtual auto accept(ExprVisitor& v) -> void = 0;
94+
virtual auto accept(ExprVisitor& v) const -> void = 0;
9995

10096
/* Source location the expression got parsed from */
10197
[[nodiscard]]
@@ -106,10 +102,10 @@ class Expr
106102

107103
private:
108104
/* Abstract evaluation implementation */
109-
virtual auto ieval(Context ctx, const Value& value, const ResultFn& result) -> tl::expected<Result, Error> = 0;
105+
virtual auto ieval(Context ctx, const Value& value, const ResultFn& result) const -> tl::expected<Result, Error> = 0;
110106

111107
/* Move-optimized evaluation implementation */
112-
virtual auto ieval(Context ctx, Value&& value, const ResultFn& result) -> tl::expected<Result, Error>
108+
virtual auto ieval(Context ctx, Value&& value, const ResultFn& result) const -> tl::expected<Result, Error>
113109
{
114110
return ieval(ctx, value, result);
115111
}
@@ -130,7 +126,7 @@ class AST
130126

131127
~AST();
132128

133-
auto expr() const -> Expr&
129+
auto expr() const -> const Expr&
134130
{
135131
return *expr_;
136132
}

src/completion.cpp

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ auto CompletionFieldOrWordExpr::type() const -> Type
137137
return Type::FIELD;
138138
}
139139

140-
auto CompletionFieldOrWordExpr::ieval(Context ctx, const Value& val, const ResultFn& res) -> tl::expected<Result, Error>
140+
auto CompletionFieldOrWordExpr::ieval(Context ctx, const Value& val, const ResultFn& res) const -> tl::expected<Result, Error>
141141
{
142142
if (ctx.phase == Context::Phase::Compilation)
143143
return res(ctx, Value::undef());
@@ -191,12 +191,7 @@ auto CompletionFieldOrWordExpr::toString() const -> std::string
191191
return prefix_;
192192
}
193193

194-
auto CompletionFieldOrWordExpr::clone() const -> std::unique_ptr<Expr>
195-
{
196-
throw std::runtime_error("Cannot clone CompletionFieldOrWordExpr");
197-
}
198-
199-
auto CompletionFieldOrWordExpr::accept(ExprVisitor& v) -> void
194+
auto CompletionFieldOrWordExpr::accept(ExprVisitor& v) const -> void
200195
{
201196
v.visit(*this);
202197
}
@@ -216,7 +211,7 @@ struct FindExpressionRange : ExprVisitor
216211

217212
using ExprVisitor::visit;
218213

219-
void visit(Expr& expr) override
214+
void visit(const Expr& expr) override
220215
{
221216
ExprVisitor::visit(expr);
222217

@@ -255,7 +250,7 @@ auto CompletionAndExpr::type() const -> Type
255250
return Type::VALUE;
256251
}
257252

258-
auto CompletionAndExpr::ieval(Context ctx, const Value& val, const ResultFn& res) -> tl::expected<Result, Error>
253+
auto CompletionAndExpr::ieval(Context ctx, const Value& val, const ResultFn& res) const -> tl::expected<Result, Error>
259254
{
260255
if (left_)
261256
(void)left_->eval(ctx, val, LambdaResultFn([](const Context&, const Value&) {
@@ -270,16 +265,11 @@ auto CompletionAndExpr::ieval(Context ctx, const Value& val, const ResultFn& res
270265
return Result::Continue;
271266
}
272267

273-
void CompletionAndExpr::accept(ExprVisitor& v)
268+
void CompletionAndExpr::accept(ExprVisitor& v) const
274269
{
275270
v.visit(*this);
276271
}
277272

278-
auto CompletionAndExpr::clone() const -> ExprPtr
279-
{
280-
throw std::runtime_error("Cannot clone CompletionAndExpr");
281-
}
282-
283273
auto CompletionAndExpr::toString() const -> std::string
284274
{
285275
if (left_ && right_)
@@ -316,7 +306,7 @@ auto CompletionOrExpr::type() const -> Type
316306
return Type::VALUE;
317307
}
318308

319-
auto CompletionOrExpr::ieval(Context ctx, const Value& val, const ResultFn& res) -> tl::expected<Result, Error>
309+
auto CompletionOrExpr::ieval(Context ctx, const Value& val, const ResultFn& res) const -> tl::expected<Result, Error>
320310
{
321311
if (left_)
322312
(void)left_->eval(ctx, val, LambdaResultFn([](const Context&, const Value&) {
@@ -331,16 +321,11 @@ auto CompletionOrExpr::ieval(Context ctx, const Value& val, const ResultFn& res)
331321
return Result::Continue;
332322
}
333323

334-
void CompletionOrExpr::accept(ExprVisitor& v)
324+
void CompletionOrExpr::accept(ExprVisitor& v) const
335325
{
336326
v.visit(*this);
337327
}
338328

339-
auto CompletionOrExpr::clone() const -> ExprPtr
340-
{
341-
throw std::runtime_error("Cannot clone CompletionOrExpr");
342-
}
343-
344329
auto CompletionOrExpr::toString() const -> std::string
345330
{
346331
if (left_ && right_)
@@ -368,7 +353,7 @@ auto CompletionWordExpr::constant() const -> bool
368353
return true;
369354
}
370355

371-
auto CompletionWordExpr::ieval(Context ctx, const Value& val, const ResultFn& res) -> tl::expected<Result, Error>
356+
auto CompletionWordExpr::ieval(Context ctx, const Value& val, const ResultFn& res) const -> tl::expected<Result, Error>
372357
{
373358
if (ctx.phase == Context::Phase::Compilation)
374359
return res(ctx, Value::undef());
@@ -384,12 +369,7 @@ auto CompletionWordExpr::toString() const -> std::string
384369
return prefix_;
385370
}
386371

387-
auto CompletionWordExpr::clone() const -> std::unique_ptr<Expr>
388-
{
389-
throw std::runtime_error("Cannot clone CompletionWordExpr");
390-
}
391-
392-
auto CompletionWordExpr::accept(ExprVisitor& v) -> void
372+
auto CompletionWordExpr::accept(ExprVisitor& v) const -> void
393373
{
394374
v.visit(*this);
395375
}
@@ -399,12 +379,7 @@ auto CompletionConstExpr::constant() const -> bool
399379
return false;
400380
}
401381

402-
auto CompletionConstExpr::clone() const -> ExprPtr
403-
{
404-
return std::make_unique<CompletionConstExpr>(id(), value_);
405-
}
406-
407-
auto CompletionConstExpr::ieval(Context ctx, const Value&, const ResultFn& res) -> tl::expected<Result, Error>
382+
auto CompletionConstExpr::ieval(Context ctx, const Value&, const ResultFn& res) const -> tl::expected<Result, Error>
408383
{
409384
if (ctx.phase == Context::Compilation)
410385
return res(ctx, Value::undef());

src/completion.h

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@ class CompletionFieldOrWordExpr : public Expr
4848
CompletionFieldOrWordExpr(ExprId id, std::string prefix, Completion* comp, const Token& token, bool inPath);
4949

5050
auto type() const -> Type override;
51-
auto ieval(Context ctx, const Value& value, const ResultFn& result) -> tl::expected<Result, Error> override;
52-
auto clone() const -> std::unique_ptr<Expr> override;
53-
auto accept(ExprVisitor& v) -> void override;
51+
auto ieval(Context ctx, const Value& value, const ResultFn& result) const -> tl::expected<Result, Error> override;
52+
auto accept(ExprVisitor& v) const -> void override;
5453
auto toString() const -> std::string override;
5554

5655
std::string prefix_;
@@ -64,9 +63,8 @@ class CompletionAndExpr : public Expr
6463
CompletionAndExpr(ExprId id, ExprPtr left, ExprPtr right, const Completion* comp);
6564

6665
auto type() const -> Type override;
67-
auto ieval(Context ctx, const Value& val, const ResultFn& res) -> tl::expected<Result, Error> override;
68-
void accept(ExprVisitor& v) override;
69-
auto clone() const -> ExprPtr override;
66+
auto ieval(Context ctx, const Value& val, const ResultFn& res) const -> tl::expected<Result, Error> override;
67+
void accept(ExprVisitor& v) const override;
7068
auto toString() const -> std::string override;
7169

7270
ExprPtr left_, right_;
@@ -78,9 +76,8 @@ class CompletionOrExpr : public Expr
7876
CompletionOrExpr(ExprId id, ExprPtr left, ExprPtr right, const Completion* comp);
7977

8078
auto type() const -> Type override;
81-
auto ieval(Context ctx, const Value& val, const ResultFn& res) -> tl::expected<Result, Error> override;
82-
void accept(ExprVisitor& v) override;
83-
auto clone() const -> ExprPtr override;
79+
auto ieval(Context ctx, const Value& val, const ResultFn& res) const -> tl::expected<Result, Error> override;
80+
void accept(ExprVisitor& v) const override;
8481
auto toString() const -> std::string override;
8582

8683
ExprPtr left_, right_;
@@ -93,9 +90,8 @@ class CompletionWordExpr : public Expr
9390

9491
auto type() const -> Type override;
9592
auto constant() const -> bool override;
96-
auto ieval(Context ctx, const Value& value, const ResultFn& result) -> tl::expected<Result, Error> override;
97-
auto clone() const -> std::unique_ptr<Expr> override;
98-
auto accept(ExprVisitor& v) -> void override;
93+
auto ieval(Context ctx, const Value& value, const ResultFn& result) const -> tl::expected<Result, Error> override;
94+
auto accept(ExprVisitor& v) const -> void override;
9995
auto toString() const -> std::string override;
10096

10197
std::string prefix_;
@@ -112,8 +108,7 @@ class CompletionConstExpr : public ConstExpr
112108
using ConstExpr::ConstExpr;
113109

114110
auto constant() const -> bool override;
115-
auto clone() const -> ExprPtr override;
116-
auto ieval(Context ctx, const Value&, const ResultFn& res) -> tl::expected<Result, Error> override;
111+
auto ieval(Context ctx, const Value&, const ResultFn& res) const -> tl::expected<Result, Error> override;
117112
};
118113

119114
}

src/diagnostics.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ auto Diagnostics::buildMessages(Environment& env, const AST& ast) const -> std::
165165
}
166166

167167
const auto intersection = leftTypes.flags & rightTypes.flags;
168-
if (true || intersection.none()) {
168+
if (intersection.none()) {
169169
const auto allTrue = data.trueResults > 0 && data.falseResults == 0;
170170
const auto allFalse = data.falseResults > 0 && data.trueResults == 0;
171171
const auto prefix =
@@ -182,7 +182,7 @@ auto Diagnostics::buildMessages(Environment& env, const AST& ast) const -> std::
182182
return messages;
183183
}
184184

185-
auto Diagnostics::prepareIndizes(Expr& ast) -> void
185+
auto Diagnostics::prepareIndices(const Expr& ast) -> void
186186
{
187187
struct Visitor : ExprVisitor
188188
{
@@ -197,7 +197,7 @@ auto Diagnostics::prepareIndizes(Expr& ast) -> void
197197

198198
using ExprVisitor::visit;
199199

200-
auto visit(FieldExpr& e) -> void override {
200+
auto visit(const FieldExpr& e) -> void override {
201201
ExprVisitor::visit(e);
202202
if (e.id() >= indices_.size())
203203
indices_.resize(e.id() + 1);
@@ -211,32 +211,32 @@ auto Diagnostics::prepareIndizes(Expr& ast) -> void
211211
indices_[e.id()] = comparisonIndex_++;
212212
}
213213

214-
auto visit(BinaryExpr<OperatorEq>& e) -> void override {
214+
auto visit(const BinaryExpr<OperatorEq>& e) -> void override {
215215
ExprVisitor::visit(e);
216216
visitComparisonOperator(e);
217217
}
218218

219-
auto visit(BinaryExpr<OperatorNeq>& e) -> void override {
219+
auto visit(const BinaryExpr<OperatorNeq>& e) -> void override {
220220
ExprVisitor::visit(e);
221221
visitComparisonOperator(e);
222222
}
223223

224-
auto visit(BinaryExpr<OperatorLt>& e) -> void override {
224+
auto visit(const BinaryExpr<OperatorLt>& e) -> void override {
225225
ExprVisitor::visit(e);
226226
visitComparisonOperator(e);
227227
}
228228

229-
auto visit(BinaryExpr<OperatorLtEq>& e) -> void override {
229+
auto visit(const BinaryExpr<OperatorLtEq>& e) -> void override {
230230
ExprVisitor::visit(e);
231231
visitComparisonOperator(e);
232232
}
233233

234-
auto visit(BinaryExpr<OperatorGt>& e) -> void override {
234+
auto visit(const BinaryExpr<OperatorGt>& e) -> void override {
235235
ExprVisitor::visit(e);
236236
visitComparisonOperator(e);
237237
}
238238

239-
auto visit(BinaryExpr<OperatorGtEq>& e) -> void override {
239+
auto visit(const BinaryExpr<OperatorGtEq>& e) -> void override {
240240
ExprVisitor::visit(e);
241241
visitComparisonOperator(e);
242242
}

0 commit comments

Comments
 (0)