Skip to content

Commit

Permalink
Many improvements to ASTVisitor and supporting types
Browse files Browse the repository at this point in the history
  • Loading branch information
MikePopoloski committed Mar 21, 2020
1 parent 237eab5 commit 3957da7
Show file tree
Hide file tree
Showing 13 changed files with 305 additions and 28 deletions.
11 changes: 11 additions & 0 deletions include/slang/binding/AssignmentExpressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ class AssignmentExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::Assignment; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
left().visit(visitor);
right().visit(visitor);
}

private:
Expression* left_;
Expression* right_;
Expand Down Expand Up @@ -81,6 +87,11 @@ class ConversionExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::Conversion; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
operand().visit(visitor);
}

private:
Expression* operand_;
};
Expand Down
6 changes: 3 additions & 3 deletions include/slang/binding/Expression.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,10 +214,10 @@ class Expression {
}

template<typename TVisitor, typename... Args>
decltype(auto) visit(TVisitor& visitor, Args&&... args);
decltype(auto) visit(TVisitor&& visitor, Args&&... args);

template<typename TVisitor, typename... Args>
decltype(auto) visit(TVisitor& visitor, Args&&... args) const;
decltype(auto) visit(TVisitor&& visitor, Args&&... args) const;

protected:
Expression(ExpressionKind kind, const Type& type, SourceRange sourceRange) :
Expand Down Expand Up @@ -272,7 +272,7 @@ class Expression {
struct PropagationVisitor;

template<typename TExpression, typename TVisitor, typename... Args>
decltype(auto) visitExpression(TExpression* expr, TVisitor& visitor, Args&&... args) const;
decltype(auto) visitExpression(TExpression* expr, TVisitor&& visitor, Args&&... args) const;
};

/// Represents an invalid expression, which is usually generated and inserted
Expand Down
19 changes: 19 additions & 0 deletions include/slang/binding/MiscExpressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ class ElementSelectExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::ElementSelect; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
value().visit(visitor);
selector().visit(visitor);
}

private:
Expression* value_;
Expression* selector_;
Expand Down Expand Up @@ -104,6 +110,13 @@ class RangeSelectExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::RangeSelect; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
value().visit(visitor);
left().visit(visitor);
right().visit(visitor);
}

private:
static ConstantRange getIndexedRange(RangeSelectionKind kind, int32_t l, int32_t r,
bool littleEndian);
Expand Down Expand Up @@ -197,6 +210,12 @@ class CallExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::Call; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
for (auto arg : arguments())
arg->visit(visitor);
}

private:
static Expression& createSystemCall(Compilation& compilation,
const SystemSubroutine& subroutine,
Expand Down
43 changes: 43 additions & 0 deletions include/slang/binding/OperatorExpressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ class UnaryExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::UnaryOp; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
operand().visit(visitor);
}

private:
Expression* operand_;
};
Expand Down Expand Up @@ -75,6 +80,12 @@ class BinaryExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::BinaryOp; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
left().visit(visitor);
right().visit(visitor);
}

private:
Expression* left_;
Expression* right_;
Expand Down Expand Up @@ -111,6 +122,13 @@ class ConditionalExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::ConditionalOp; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
pred().visit(visitor);
left().visit(visitor);
right().visit(visitor);
}

private:
Expression* pred_;
Expression* left_;
Expand Down Expand Up @@ -141,6 +159,13 @@ class InsideExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::Inside; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
left().visit(visitor);
for (auto range : rangeList())
range->visit(visitor);
}

private:
const Expression* left_;
span<const Expression* const> rangeList_;
Expand Down Expand Up @@ -170,6 +195,12 @@ class ConcatenationExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::Concatenation; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
for (auto op : operands())
op->visit(visitor);
}

private:
span<const Expression* const> operands_;
};
Expand Down Expand Up @@ -200,6 +231,12 @@ class ReplicationExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::Replication; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
count().visit(visitor);
concat().visit(visitor);
}

private:
const Expression* count_;
Expression* concat_;
Expand Down Expand Up @@ -236,6 +273,12 @@ class OpenRangeExpression : public Expression {

static bool isKind(ExpressionKind kind) { return kind == ExpressionKind::OpenRange; }

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
left().visit(visitor);
right().visit(visitor);
}

private:
Expression* left_;
Expression* right_;
Expand Down
6 changes: 6 additions & 0 deletions include/slang/binding/PatternExpressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ class AssignmentPatternExpressionBase : public Expression {

void serializeTo(ASTSerializer& serializer) const;

template<typename TVisitor>
void visitExprs(TVisitor&& visitor) const {
for (auto elem : elements())
elem->visit(visitor);
}

protected:
AssignmentPatternExpressionBase(ExpressionKind kind, const Type& type,
span<const Expression* const> elements,
Expand Down
Loading

0 comments on commit 3957da7

Please sign in to comment.