Add list helpers
This CL adds various using statements for the std::vector<std::unique_ptr<CLASS>> constructs found in the AST. Change-Id: Ic9a2357cd73b2aafd99e961a38727f2f9874cde5 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/18920 Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
parent
a71e1a50c8
commit
3ffec80c63
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/literal.h"
|
#include "src/ast/literal.h"
|
||||||
|
|
|
@ -20,12 +20,12 @@ namespace ast {
|
||||||
CallExpression::CallExpression() : Expression() {}
|
CallExpression::CallExpression() : Expression() {}
|
||||||
|
|
||||||
CallExpression::CallExpression(std::unique_ptr<Expression> func,
|
CallExpression::CallExpression(std::unique_ptr<Expression> func,
|
||||||
std::vector<std::unique_ptr<Expression>> params)
|
ExpressionList params)
|
||||||
: Expression(), func_(std::move(func)), params_(std::move(params)) {}
|
: Expression(), func_(std::move(func)), params_(std::move(params)) {}
|
||||||
|
|
||||||
CallExpression::CallExpression(const Source& source,
|
CallExpression::CallExpression(const Source& source,
|
||||||
std::unique_ptr<Expression> func,
|
std::unique_ptr<Expression> func,
|
||||||
std::vector<std::unique_ptr<Expression>> params)
|
ExpressionList params)
|
||||||
: Expression(source), func_(std::move(func)), params_(std::move(params)) {}
|
: Expression(source), func_(std::move(func)), params_(std::move(params)) {}
|
||||||
|
|
||||||
CallExpression::~CallExpression() = default;
|
CallExpression::~CallExpression() = default;
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/literal.h"
|
#include "src/ast/literal.h"
|
||||||
|
@ -33,15 +32,14 @@ class CallExpression : public Expression {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param func the function
|
/// @param func the function
|
||||||
/// @param params the parameters
|
/// @param params the parameters
|
||||||
CallExpression(std::unique_ptr<Expression> func,
|
CallExpression(std::unique_ptr<Expression> func, ExpressionList params);
|
||||||
std::vector<std::unique_ptr<Expression>> params);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the call expression source
|
/// @param source the call expression source
|
||||||
/// @param func the function
|
/// @param func the function
|
||||||
/// @param params the parameters
|
/// @param params the parameters
|
||||||
CallExpression(const Source& source,
|
CallExpression(const Source& source,
|
||||||
std::unique_ptr<Expression> func,
|
std::unique_ptr<Expression> func,
|
||||||
std::vector<std::unique_ptr<Expression>> params);
|
ExpressionList params);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
CallExpression(CallExpression&&) = default;
|
CallExpression(CallExpression&&) = default;
|
||||||
~CallExpression() override;
|
~CallExpression() override;
|
||||||
|
@ -54,13 +52,9 @@ class CallExpression : public Expression {
|
||||||
|
|
||||||
/// Sets the parameters
|
/// Sets the parameters
|
||||||
/// @param params the parameters
|
/// @param params the parameters
|
||||||
void set_params(std::vector<std::unique_ptr<Expression>> params) {
|
void set_params(ExpressionList params) { params_ = std::move(params); }
|
||||||
params_ = std::move(params);
|
|
||||||
}
|
|
||||||
/// @returns the parameters
|
/// @returns the parameters
|
||||||
const std::vector<std::unique_ptr<Expression>>& params() const {
|
const ExpressionList& params() const { return params_; }
|
||||||
return params_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if this is a call expression
|
/// @returns true if this is a call expression
|
||||||
bool IsCall() const override { return true; }
|
bool IsCall() const override { return true; }
|
||||||
|
@ -77,7 +71,7 @@ class CallExpression : public Expression {
|
||||||
CallExpression(const CallExpression&) = delete;
|
CallExpression(const CallExpression&) = delete;
|
||||||
|
|
||||||
std::unique_ptr<Expression> func_;
|
std::unique_ptr<Expression> func_;
|
||||||
std::vector<std::unique_ptr<Expression>> params_;
|
ExpressionList params_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -25,7 +25,7 @@ using CallExpressionTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(CallExpressionTest, Creation) {
|
TEST_F(CallExpressionTest, Creation) {
|
||||||
auto func = std::make_unique<IdentifierExpression>("func");
|
auto func = std::make_unique<IdentifierExpression>("func");
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("param2"));
|
params.push_back(std::make_unique<IdentifierExpression>("param2"));
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ TEST_F(CallExpressionTest, IsValid_MissingFunction) {
|
||||||
|
|
||||||
TEST_F(CallExpressionTest, IsValid_NullParam) {
|
TEST_F(CallExpressionTest, IsValid_NullParam) {
|
||||||
auto func = std::make_unique<IdentifierExpression>("func");
|
auto func = std::make_unique<IdentifierExpression>("func");
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
||||||
params.push_back(nullptr);
|
params.push_back(nullptr);
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("param2"));
|
params.push_back(std::make_unique<IdentifierExpression>("param2"));
|
||||||
|
@ -80,7 +80,7 @@ TEST_F(CallExpressionTest, IsValid_NullParam) {
|
||||||
|
|
||||||
TEST_F(CallExpressionTest, IsValid_InvalidFunction) {
|
TEST_F(CallExpressionTest, IsValid_InvalidFunction) {
|
||||||
auto func = std::make_unique<IdentifierExpression>("");
|
auto func = std::make_unique<IdentifierExpression>("");
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
||||||
|
|
||||||
CallExpression stmt(std::move(func), std::move(params));
|
CallExpression stmt(std::move(func), std::move(params));
|
||||||
|
@ -89,7 +89,7 @@ TEST_F(CallExpressionTest, IsValid_InvalidFunction) {
|
||||||
|
|
||||||
TEST_F(CallExpressionTest, IsValid_InvalidParam) {
|
TEST_F(CallExpressionTest, IsValid_InvalidParam) {
|
||||||
auto func = std::make_unique<IdentifierExpression>("func");
|
auto func = std::make_unique<IdentifierExpression>("func");
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>(""));
|
params.push_back(std::make_unique<IdentifierExpression>(""));
|
||||||
|
|
||||||
CallExpression stmt(std::move(func), std::move(params));
|
CallExpression stmt(std::move(func), std::move(params));
|
||||||
|
@ -111,7 +111,7 @@ TEST_F(CallExpressionTest, ToStr_NoParams) {
|
||||||
|
|
||||||
TEST_F(CallExpressionTest, ToStr_WithParams) {
|
TEST_F(CallExpressionTest, ToStr_WithParams) {
|
||||||
auto func = std::make_unique<IdentifierExpression>("func");
|
auto func = std::make_unique<IdentifierExpression>("func");
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
params.push_back(std::make_unique<IdentifierExpression>("param1"));
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("param2"));
|
params.push_back(std::make_unique<IdentifierExpression>("param2"));
|
||||||
|
|
||||||
|
|
|
@ -20,12 +20,12 @@ namespace ast {
|
||||||
CaseStatement::CaseStatement() : Statement() {}
|
CaseStatement::CaseStatement() : Statement() {}
|
||||||
|
|
||||||
CaseStatement::CaseStatement(std::unique_ptr<Literal> condition,
|
CaseStatement::CaseStatement(std::unique_ptr<Literal> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
||||||
|
|
||||||
CaseStatement::CaseStatement(const Source& source,
|
CaseStatement::CaseStatement(const Source& source,
|
||||||
std::unique_ptr<Literal> condition,
|
std::unique_ptr<Literal> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(source),
|
: Statement(source),
|
||||||
condition_(std::move(condition)),
|
condition_(std::move(condition)),
|
||||||
body_(std::move(body)) {}
|
body_(std::move(body)) {}
|
||||||
|
|
|
@ -35,15 +35,14 @@ class CaseStatement : public Statement {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param condition the case condition
|
/// @param condition the case condition
|
||||||
/// @param body the case body
|
/// @param body the case body
|
||||||
CaseStatement(std::unique_ptr<Literal> condition,
|
CaseStatement(std::unique_ptr<Literal> condition, StatementList body);
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param condition the case condition
|
/// @param condition the case condition
|
||||||
/// @param body the case body
|
/// @param body the case body
|
||||||
CaseStatement(const Source& source,
|
CaseStatement(const Source& source,
|
||||||
std::unique_ptr<Literal> condition,
|
std::unique_ptr<Literal> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
StatementList body);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
CaseStatement(CaseStatement&&) = default;
|
CaseStatement(CaseStatement&&) = default;
|
||||||
~CaseStatement() override;
|
~CaseStatement() override;
|
||||||
|
@ -60,11 +59,9 @@ class CaseStatement : public Statement {
|
||||||
|
|
||||||
/// Sets the case body
|
/// Sets the case body
|
||||||
/// @param body the case body
|
/// @param body the case body
|
||||||
void set_body(std::vector<std::unique_ptr<Statement>> body) {
|
void set_body(StatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the case body
|
/// @returns the case body
|
||||||
const std::vector<std::unique_ptr<Statement>>& body() const { return body_; }
|
const StatementList& body() const { return body_; }
|
||||||
|
|
||||||
/// @returns true if this is a case statement
|
/// @returns true if this is a case statement
|
||||||
bool IsCase() const override { return true; }
|
bool IsCase() const override { return true; }
|
||||||
|
@ -81,9 +78,12 @@ class CaseStatement : public Statement {
|
||||||
CaseStatement(const CaseStatement&) = delete;
|
CaseStatement(const CaseStatement&) = delete;
|
||||||
|
|
||||||
std::unique_ptr<Literal> condition_;
|
std::unique_ptr<Literal> condition_;
|
||||||
std::vector<std::unique_ptr<Statement>> body_;
|
StatementList body_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique case statements
|
||||||
|
using CaseStatementList = std::vector<std::unique_ptr<CaseStatement>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ using CaseStatementTest = testing::Test;
|
||||||
TEST_F(CaseStatementTest, Creation) {
|
TEST_F(CaseStatementTest, Creation) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<NopStatement>());
|
stmts.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
auto bool_ptr = b.get();
|
auto bool_ptr = b.get();
|
||||||
|
@ -44,7 +44,7 @@ TEST_F(CaseStatementTest, Creation) {
|
||||||
TEST_F(CaseStatementTest, Creation_WithSource) {
|
TEST_F(CaseStatementTest, Creation_WithSource) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<NopStatement>());
|
stmts.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
CaseStatement c(Source{20, 2}, std::move(b), std::move(stmts));
|
CaseStatement c(Source{20, 2}, std::move(b), std::move(stmts));
|
||||||
|
@ -54,7 +54,7 @@ TEST_F(CaseStatementTest, Creation_WithSource) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CaseStatementTest, IsDefault_WithoutCondition) {
|
TEST_F(CaseStatementTest, IsDefault_WithoutCondition) {
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<NopStatement>());
|
stmts.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
CaseStatement c;
|
CaseStatement c;
|
||||||
|
@ -83,7 +83,7 @@ TEST_F(CaseStatementTest, IsValid) {
|
||||||
TEST_F(CaseStatementTest, IsValid_NullBodyStatement) {
|
TEST_F(CaseStatementTest, IsValid_NullBodyStatement) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<NopStatement>());
|
stmts.push_back(std::make_unique<NopStatement>());
|
||||||
stmts.push_back(nullptr);
|
stmts.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ TEST_F(CaseStatementTest, IsValid_NullBodyStatement) {
|
||||||
TEST_F(CaseStatementTest, IsValid_InvalidBodyStatement) {
|
TEST_F(CaseStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<IfStatement>());
|
stmts.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
CaseStatement c(std::move(b), std::move(stmts));
|
CaseStatement c(std::move(b), std::move(stmts));
|
||||||
|
@ -104,7 +104,7 @@ TEST_F(CaseStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
TEST_F(CaseStatementTest, ToStr_WithCondition) {
|
TEST_F(CaseStatementTest, ToStr_WithCondition) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto b = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<NopStatement>());
|
stmts.push_back(std::make_unique<NopStatement>());
|
||||||
CaseStatement c(std::move(b), std::move(stmts));
|
CaseStatement c(std::move(b), std::move(stmts));
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ TEST_F(CaseStatementTest, ToStr_WithCondition) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CaseStatementTest, ToStr_WithoutCondition) {
|
TEST_F(CaseStatementTest, ToStr_WithoutCondition) {
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<NopStatement>());
|
stmts.push_back(std::make_unique<NopStatement>());
|
||||||
CaseStatement c(nullptr, std::move(stmts));
|
CaseStatement c(nullptr, std::move(stmts));
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/literal.h"
|
#include "src/ast/literal.h"
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/variable.h"
|
#include "src/ast/variable.h"
|
||||||
#include "src/ast/variable_decoration.h"
|
#include "src/ast/variable_decoration.h"
|
||||||
|
@ -40,13 +39,11 @@ class DecoratedVariable : public Variable {
|
||||||
|
|
||||||
/// Sets a decoration to the variable
|
/// Sets a decoration to the variable
|
||||||
/// @param decos the decorations to set
|
/// @param decos the decorations to set
|
||||||
void set_decorations(std::vector<std::unique_ptr<VariableDecoration>> decos) {
|
void set_decorations(VariableDecorationList decos) {
|
||||||
decorations_ = std::move(decos);
|
decorations_ = std::move(decos);
|
||||||
}
|
}
|
||||||
/// @returns the decorations attached to this variable
|
/// @returns the decorations attached to this variable
|
||||||
const std::vector<std::unique_ptr<VariableDecoration>>& decorations() const {
|
const VariableDecorationList& decorations() const { return decorations_; }
|
||||||
return decorations_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if this is a decorated variable
|
/// @returns true if this is a decorated variable
|
||||||
bool IsDecorated() const override { return true; }
|
bool IsDecorated() const override { return true; }
|
||||||
|
@ -61,7 +58,7 @@ class DecoratedVariable : public Variable {
|
||||||
private:
|
private:
|
||||||
DecoratedVariable(const DecoratedVariable&) = delete;
|
DecoratedVariable(const DecoratedVariable&) = delete;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<VariableDecoration>> decorations_;
|
VariableDecorationList decorations_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -72,7 +72,7 @@ TEST_F(DecoratedVariableTest, to_str) {
|
||||||
DecoratedVariable dv(std::move(var));
|
DecoratedVariable dv(std::move(var));
|
||||||
dv.set_constructor(std::make_unique<IdentifierExpression>("expr"));
|
dv.set_constructor(std::make_unique<IdentifierExpression>("expr"));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<VariableDecoration>> decos;
|
VariableDecorationList decos;
|
||||||
decos.push_back(std::make_unique<BindingDecoration>(2));
|
decos.push_back(std::make_unique<BindingDecoration>(2));
|
||||||
decos.push_back(std::make_unique<SetDecoration>(1));
|
decos.push_back(std::make_unique<SetDecoration>(1));
|
||||||
|
|
||||||
|
|
|
@ -19,20 +19,19 @@ namespace ast {
|
||||||
|
|
||||||
ElseStatement::ElseStatement() : Statement() {}
|
ElseStatement::ElseStatement() : Statement() {}
|
||||||
|
|
||||||
ElseStatement::ElseStatement(std::vector<std::unique_ptr<Statement>> body)
|
ElseStatement::ElseStatement(StatementList body)
|
||||||
: Statement(), body_(std::move(body)) {}
|
: Statement(), body_(std::move(body)) {}
|
||||||
|
|
||||||
ElseStatement::ElseStatement(std::unique_ptr<Expression> condition,
|
ElseStatement::ElseStatement(std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
||||||
|
|
||||||
ElseStatement::ElseStatement(const Source& source,
|
ElseStatement::ElseStatement(const Source& source, StatementList body)
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
|
||||||
: Statement(source), body_(std::move(body)) {}
|
: Statement(source), body_(std::move(body)) {}
|
||||||
|
|
||||||
ElseStatement::ElseStatement(const Source& source,
|
ElseStatement::ElseStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(source),
|
: Statement(source),
|
||||||
condition_(std::move(condition)),
|
condition_(std::move(condition)),
|
||||||
body_(std::move(body)) {}
|
body_(std::move(body)) {}
|
||||||
|
|
|
@ -32,24 +32,22 @@ class ElseStatement : public Statement {
|
||||||
ElseStatement();
|
ElseStatement();
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param body the else body
|
/// @param body the else body
|
||||||
explicit ElseStatement(std::vector<std::unique_ptr<Statement>> body);
|
explicit ElseStatement(StatementList body);
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param condition the else condition
|
/// @param condition the else condition
|
||||||
/// @param body the else body
|
/// @param body the else body
|
||||||
ElseStatement(std::unique_ptr<Expression> condition,
|
ElseStatement(std::unique_ptr<Expression> condition, StatementList body);
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param body the else body
|
/// @param body the else body
|
||||||
ElseStatement(const Source& source,
|
ElseStatement(const Source& source, StatementList body);
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param condition the else condition
|
/// @param condition the else condition
|
||||||
/// @param body the else body
|
/// @param body the else body
|
||||||
ElseStatement(const Source& source,
|
ElseStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
StatementList body);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
ElseStatement(ElseStatement&&) = default;
|
ElseStatement(ElseStatement&&) = default;
|
||||||
~ElseStatement() override;
|
~ElseStatement() override;
|
||||||
|
@ -66,11 +64,9 @@ class ElseStatement : public Statement {
|
||||||
|
|
||||||
/// Sets the else body
|
/// Sets the else body
|
||||||
/// @param body the else body
|
/// @param body the else body
|
||||||
void set_body(std::vector<std::unique_ptr<Statement>> body) {
|
void set_body(StatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the else body
|
/// @returns the else body
|
||||||
const std::vector<std::unique_ptr<Statement>>& body() const { return body_; }
|
const StatementList& body() const { return body_; }
|
||||||
|
|
||||||
/// @returns true if this is a else statement
|
/// @returns true if this is a else statement
|
||||||
bool IsElse() const override { return true; }
|
bool IsElse() const override { return true; }
|
||||||
|
@ -87,9 +83,12 @@ class ElseStatement : public Statement {
|
||||||
ElseStatement(const ElseStatement&) = delete;
|
ElseStatement(const ElseStatement&) = delete;
|
||||||
|
|
||||||
std::unique_ptr<Expression> condition_;
|
std::unique_ptr<Expression> condition_;
|
||||||
std::vector<std::unique_ptr<Statement>> body_;
|
StatementList body_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique else statements
|
||||||
|
using ElseStatementList = std::vector<std::unique_ptr<ElseStatement>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ TEST_F(ElseStatementTest, Creation) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto cond = std::make_unique<ScalarConstructorExpression>(
|
auto cond = std::make_unique<ScalarConstructorExpression>(
|
||||||
std::make_unique<BoolLiteral>(&bool_type, true));
|
std::make_unique<BoolLiteral>(&bool_type, true));
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
auto cond_ptr = cond.get();
|
auto cond_ptr = cond.get();
|
||||||
|
@ -74,7 +74,7 @@ TEST_F(ElseStatementTest, IsValid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ElseStatementTest, IsValid_WithBody) {
|
TEST_F(ElseStatementTest, IsValid_WithBody) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
ElseStatement e(std::move(body));
|
ElseStatement e(std::move(body));
|
||||||
|
@ -82,7 +82,7 @@ TEST_F(ElseStatementTest, IsValid_WithBody) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ElseStatementTest, IsValid_WithNullBodyStatement) {
|
TEST_F(ElseStatementTest, IsValid_WithNullBodyStatement) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
body.push_back(nullptr);
|
body.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ TEST_F(ElseStatementTest, IsValid_InvalidCondition) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ElseStatementTest, IsValid_InvalidBodyStatement) {
|
TEST_F(ElseStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<IfStatement>());
|
body.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
ElseStatement e(std::move(body));
|
ElseStatement e(std::move(body));
|
||||||
|
@ -108,7 +108,7 @@ TEST_F(ElseStatementTest, ToStr) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto cond = std::make_unique<ScalarConstructorExpression>(
|
auto cond = std::make_unique<ScalarConstructorExpression>(
|
||||||
std::make_unique<BoolLiteral>(&bool_type, true));
|
std::make_unique<BoolLiteral>(&bool_type, true));
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
ElseStatement e(std::move(cond), std::move(body));
|
ElseStatement e(std::move(cond), std::move(body));
|
||||||
|
@ -126,7 +126,7 @@ TEST_F(ElseStatementTest, ToStr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ElseStatementTest, ToStr_NoCondition) {
|
TEST_F(ElseStatementTest, ToStr_NoCondition) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
ElseStatement e(std::move(body));
|
ElseStatement e(std::move(body));
|
||||||
|
|
|
@ -15,8 +15,10 @@
|
||||||
#ifndef SRC_AST_ENTRY_POINT_H_
|
#ifndef SRC_AST_ENTRY_POINT_H_
|
||||||
#define SRC_AST_ENTRY_POINT_H_
|
#define SRC_AST_ENTRY_POINT_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "src/ast/node.h"
|
#include "src/ast/node.h"
|
||||||
#include "src/ast/pipeline_stage.h"
|
#include "src/ast/pipeline_stage.h"
|
||||||
|
@ -83,6 +85,9 @@ class EntryPoint : public Node {
|
||||||
std::string fn_name_;
|
std::string fn_name_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique entry points.
|
||||||
|
using EntryPointList = std::vector<std::unique_ptr<EntryPoint>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
#ifndef SRC_AST_EXPRESSION_H_
|
#ifndef SRC_AST_EXPRESSION_H_
|
||||||
#define SRC_AST_EXPRESSION_H_
|
#define SRC_AST_EXPRESSION_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "src/ast/node.h"
|
#include "src/ast/node.h"
|
||||||
#include "src/ast/type/type.h"
|
#include "src/ast/type/type.h"
|
||||||
|
|
||||||
|
@ -105,6 +108,9 @@ class Expression : public Node {
|
||||||
type::Type* result_type_ = nullptr;
|
type::Type* result_type_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique expressions
|
||||||
|
using ExpressionList = std::vector<std::unique_ptr<Expression>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,6 @@
|
||||||
#ifndef SRC_AST_FALLTHROUGH_STATEMENT_H_
|
#ifndef SRC_AST_FALLTHROUGH_STATEMENT_H_
|
||||||
#define SRC_AST_FALLTHROUGH_STATEMENT_H_
|
#define SRC_AST_FALLTHROUGH_STATEMENT_H_
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/statement.h"
|
#include "src/ast/statement.h"
|
||||||
#include "src/ast/statement_condition.h"
|
#include "src/ast/statement_condition.h"
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
Function::Function(const std::string& name,
|
Function::Function(const std::string& name,
|
||||||
std::vector<std::unique_ptr<Variable>> params,
|
VariableList params,
|
||||||
type::Type* return_type)
|
type::Type* return_type)
|
||||||
: Node(),
|
: Node(),
|
||||||
name_(name),
|
name_(name),
|
||||||
|
@ -29,7 +29,7 @@ Function::Function(const std::string& name,
|
||||||
|
|
||||||
Function::Function(const Source& source,
|
Function::Function(const Source& source,
|
||||||
const std::string& name,
|
const std::string& name,
|
||||||
std::vector<std::unique_ptr<Variable>> params,
|
VariableList params,
|
||||||
type::Type* return_type)
|
type::Type* return_type)
|
||||||
: Node(source),
|
: Node(source),
|
||||||
name_(name),
|
name_(name),
|
||||||
|
|
|
@ -40,7 +40,7 @@ class Function : public Node {
|
||||||
/// @param params the function parameters
|
/// @param params the function parameters
|
||||||
/// @param return_type the return type
|
/// @param return_type the return type
|
||||||
Function(const std::string& name,
|
Function(const std::string& name,
|
||||||
std::vector<std::unique_ptr<Variable>> params,
|
VariableList params,
|
||||||
type::Type* return_type);
|
type::Type* return_type);
|
||||||
/// Create a function
|
/// Create a function
|
||||||
/// @param source the variable source
|
/// @param source the variable source
|
||||||
|
@ -49,7 +49,7 @@ class Function : public Node {
|
||||||
/// @param return_type the return type
|
/// @param return_type the return type
|
||||||
Function(const Source& source,
|
Function(const Source& source,
|
||||||
const std::string& name,
|
const std::string& name,
|
||||||
std::vector<std::unique_ptr<Variable>> params,
|
VariableList params,
|
||||||
type::Type* return_type);
|
type::Type* return_type);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
Function(Function&&) = default;
|
Function(Function&&) = default;
|
||||||
|
@ -64,13 +64,9 @@ class Function : public Node {
|
||||||
|
|
||||||
/// Sets the function parameters
|
/// Sets the function parameters
|
||||||
/// @param params the function parameters
|
/// @param params the function parameters
|
||||||
void set_params(std::vector<std::unique_ptr<Variable>> params) {
|
void set_params(VariableList params) { params_ = std::move(params); }
|
||||||
params_ = std::move(params);
|
|
||||||
}
|
|
||||||
/// @returns the function params
|
/// @returns the function params
|
||||||
const std::vector<std::unique_ptr<Variable>>& params() const {
|
const VariableList& params() const { return params_; }
|
||||||
return params_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets the return type of the function
|
/// Sets the return type of the function
|
||||||
/// @param type the return type
|
/// @param type the return type
|
||||||
|
@ -80,11 +76,9 @@ class Function : public Node {
|
||||||
|
|
||||||
/// Sets the body of the function
|
/// Sets the body of the function
|
||||||
/// @param body the function body
|
/// @param body the function body
|
||||||
void set_body(std::vector<std::unique_ptr<Statement>> body) {
|
void set_body(StatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the function body
|
/// @returns the function body
|
||||||
const std::vector<std::unique_ptr<Statement>>& body() const { return body_; }
|
const StatementList& body() const { return body_; }
|
||||||
|
|
||||||
/// @returns true if the name and type are both present
|
/// @returns true if the name and type are both present
|
||||||
bool IsValid() const override;
|
bool IsValid() const override;
|
||||||
|
@ -101,11 +95,14 @@ class Function : public Node {
|
||||||
Function(const Function&) = delete;
|
Function(const Function&) = delete;
|
||||||
|
|
||||||
std::string name_;
|
std::string name_;
|
||||||
std::vector<std::unique_ptr<Variable>> params_;
|
VariableList params_;
|
||||||
type::Type* return_type_ = nullptr;
|
type::Type* return_type_ = nullptr;
|
||||||
std::vector<std::unique_ptr<Statement>> body_;
|
StatementList body_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique functions
|
||||||
|
using FunctionList = std::vector<std::unique_ptr<Function>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ TEST_F(FunctionTest, Creation) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
auto var_ptr = params[0].get();
|
auto var_ptr = params[0].get();
|
||||||
|
@ -47,7 +47,7 @@ TEST_F(FunctionTest, Creation_WithSource) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
|
|
||||||
|
@ -61,11 +61,11 @@ TEST_F(FunctionTest, IsValid) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
Function f("func", std::move(params), &void_type);
|
Function f("func", std::move(params), &void_type);
|
||||||
|
@ -77,7 +77,7 @@ TEST_F(FunctionTest, IsValid_EmptyName) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ TEST_F(FunctionTest, IsValid_EmptyName) {
|
||||||
TEST_F(FunctionTest, IsValid_MissingReturnType) {
|
TEST_F(FunctionTest, IsValid_MissingReturnType) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ TEST_F(FunctionTest, IsValid_NullParam) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
params.push_back(nullptr);
|
params.push_back(nullptr);
|
||||||
|
@ -112,7 +112,7 @@ TEST_F(FunctionTest, IsValid_NullParam) {
|
||||||
TEST_F(FunctionTest, IsValid_InvalidParam) {
|
TEST_F(FunctionTest, IsValid_InvalidParam) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, nullptr));
|
std::make_unique<Variable>("var", StorageClass::kNone, nullptr));
|
||||||
|
|
||||||
|
@ -124,11 +124,11 @@ TEST_F(FunctionTest, IsValid_NullBodyStatement) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
body.push_back(nullptr);
|
body.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -141,11 +141,11 @@ TEST_F(FunctionTest, IsValid_InvalidBodyStatement) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
body.push_back(nullptr);
|
body.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ TEST_F(FunctionTest, ToStr) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
Function f("func", {}, &void_type);
|
Function f("func", {}, &void_type);
|
||||||
|
@ -178,11 +178,11 @@ TEST_F(FunctionTest, ToStr_WithParams) {
|
||||||
type::VoidType void_type;
|
type::VoidType void_type;
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var", StorageClass::kNone, &i32));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
Function f("func", std::move(params), &void_type);
|
Function f("func", std::move(params), &void_type);
|
||||||
|
@ -216,7 +216,7 @@ TEST_F(FunctionTest, TypeName_WithParams) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Variable>> params;
|
VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<Variable>("var1", StorageClass::kNone, &i32));
|
std::make_unique<Variable>("var1", StorageClass::kNone, &i32));
|
||||||
params.push_back(
|
params.push_back(
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#ifndef SRC_AST_IDENTIFIER_EXPRESSION_H_
|
#ifndef SRC_AST_IDENTIFIER_EXPRESSION_H_
|
||||||
#define SRC_AST_IDENTIFIER_EXPRESSION_H_
|
#define SRC_AST_IDENTIFIER_EXPRESSION_H_
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
|
@ -22,12 +22,12 @@ namespace ast {
|
||||||
IfStatement::IfStatement() : Statement() {}
|
IfStatement::IfStatement() : Statement() {}
|
||||||
|
|
||||||
IfStatement::IfStatement(std::unique_ptr<Expression> condition,
|
IfStatement::IfStatement(std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
||||||
|
|
||||||
IfStatement::IfStatement(const Source& source,
|
IfStatement::IfStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(source),
|
: Statement(source),
|
||||||
condition_(std::move(condition)),
|
condition_(std::move(condition)),
|
||||||
body_(std::move(body)) {}
|
body_(std::move(body)) {}
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/else_statement.h"
|
#include "src/ast/else_statement.h"
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
|
@ -34,15 +33,14 @@ class IfStatement : public Statement {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param condition the if condition
|
/// @param condition the if condition
|
||||||
/// @param body the if body
|
/// @param body the if body
|
||||||
IfStatement(std::unique_ptr<Expression> condition,
|
IfStatement(std::unique_ptr<Expression> condition, StatementList body);
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param condition the if condition
|
/// @param condition the if condition
|
||||||
/// @param body the if body
|
/// @param body the if body
|
||||||
IfStatement(const Source& source,
|
IfStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
StatementList body);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
IfStatement(IfStatement&&) = default;
|
IfStatement(IfStatement&&) = default;
|
||||||
~IfStatement() override;
|
~IfStatement() override;
|
||||||
|
@ -57,32 +55,23 @@ class IfStatement : public Statement {
|
||||||
|
|
||||||
/// Sets the if body
|
/// Sets the if body
|
||||||
/// @param body the if body
|
/// @param body the if body
|
||||||
void set_body(std::vector<std::unique_ptr<Statement>> body) {
|
void set_body(StatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the if body
|
/// @returns the if body
|
||||||
const std::vector<std::unique_ptr<Statement>>& body() const { return body_; }
|
const StatementList& body() const { return body_; }
|
||||||
|
|
||||||
/// Sets the else statements
|
/// Sets the else statements
|
||||||
/// @param else_statements the else statements to set
|
/// @param else_statements the else statements to set
|
||||||
void set_else_statements(
|
void set_else_statements(ElseStatementList else_statements) {
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_statements) {
|
|
||||||
else_statements_ = std::move(else_statements);
|
else_statements_ = std::move(else_statements);
|
||||||
}
|
}
|
||||||
/// @returns the else statements
|
/// @returns the else statements
|
||||||
const std::vector<std::unique_ptr<ElseStatement>>& else_statements() const {
|
const ElseStatementList& else_statements() const { return else_statements_; }
|
||||||
return else_statements_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets the premerge statements
|
/// Sets the premerge statements
|
||||||
/// @param premerge the premerge statements
|
/// @param premerge the premerge statements
|
||||||
void set_premerge(std::vector<std::unique_ptr<Statement>> premerge) {
|
void set_premerge(StatementList premerge) { premerge_ = std::move(premerge); }
|
||||||
premerge_ = std::move(premerge);
|
|
||||||
}
|
|
||||||
/// @returns the premerge statements
|
/// @returns the premerge statements
|
||||||
const std::vector<std::unique_ptr<Statement>>& premerge() const {
|
const StatementList& premerge() const { return premerge_; }
|
||||||
return premerge_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if this is a if statement
|
/// @returns true if this is a if statement
|
||||||
bool IsIf() const override { return true; }
|
bool IsIf() const override { return true; }
|
||||||
|
@ -99,9 +88,9 @@ class IfStatement : public Statement {
|
||||||
IfStatement(const IfStatement&) = delete;
|
IfStatement(const IfStatement&) = delete;
|
||||||
|
|
||||||
std::unique_ptr<Expression> condition_;
|
std::unique_ptr<Expression> condition_;
|
||||||
std::vector<std::unique_ptr<Statement>> body_;
|
StatementList body_;
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_statements_;
|
ElseStatementList else_statements_;
|
||||||
std::vector<std::unique_ptr<Statement>> premerge_;
|
StatementList premerge_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -27,7 +27,7 @@ using IfStatementTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(IfStatementTest, Creation) {
|
TEST_F(IfStatementTest, Creation) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
auto cond_ptr = cond.get();
|
auto cond_ptr = cond.get();
|
||||||
|
@ -41,7 +41,7 @@ TEST_F(IfStatementTest, Creation) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, Creation_WithSource) {
|
TEST_F(IfStatementTest, Creation_WithSource) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(Source{20, 2}, std::move(cond), std::move(body));
|
IfStatement stmt(Source{20, 2}, std::move(cond), std::move(body));
|
||||||
|
@ -57,7 +57,7 @@ TEST_F(IfStatementTest, IsIf) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid) {
|
TEST_F(IfStatementTest, IsValid) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
@ -66,10 +66,10 @@ TEST_F(IfStatementTest, IsValid) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_WithElseStatements) {
|
TEST_F(IfStatementTest, IsValid_WithElseStatements) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("Ident"));
|
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("Ident"));
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
|
@ -81,13 +81,13 @@ TEST_F(IfStatementTest, IsValid_WithElseStatements) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_WithPremerge) {
|
TEST_F(IfStatementTest, IsValid_WithPremerge) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> premerge;
|
StatementList premerge;
|
||||||
premerge.push_back(std::make_unique<NopStatement>());
|
premerge.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
@ -97,7 +97,7 @@ TEST_F(IfStatementTest, IsValid_WithPremerge) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_MissingCondition) {
|
TEST_F(IfStatementTest, IsValid_MissingCondition) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(nullptr, std::move(body));
|
IfStatement stmt(nullptr, std::move(body));
|
||||||
|
@ -106,7 +106,7 @@ TEST_F(IfStatementTest, IsValid_MissingCondition) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_InvalidCondition) {
|
TEST_F(IfStatementTest, IsValid_InvalidCondition) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("");
|
auto cond = std::make_unique<IdentifierExpression>("");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
@ -115,7 +115,7 @@ TEST_F(IfStatementTest, IsValid_InvalidCondition) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_NullBodyStatement) {
|
TEST_F(IfStatementTest, IsValid_NullBodyStatement) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
body.push_back(nullptr);
|
body.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ TEST_F(IfStatementTest, IsValid_NullBodyStatement) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_InvalidBodyStatement) {
|
TEST_F(IfStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
body.push_back(std::make_unique<IfStatement>());
|
body.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
|
@ -135,10 +135,10 @@ TEST_F(IfStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_NullElseStatement) {
|
TEST_F(IfStatementTest, IsValid_NullElseStatement) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("Ident"));
|
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("Ident"));
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
|
@ -151,10 +151,10 @@ TEST_F(IfStatementTest, IsValid_NullElseStatement) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_InvalidElseStatement) {
|
TEST_F(IfStatementTest, IsValid_InvalidElseStatement) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>(""));
|
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>(""));
|
||||||
|
|
||||||
|
@ -165,13 +165,13 @@ TEST_F(IfStatementTest, IsValid_InvalidElseStatement) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_NullPremergeStatement) {
|
TEST_F(IfStatementTest, IsValid_NullPremergeStatement) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> premerge;
|
StatementList premerge;
|
||||||
premerge.push_back(std::make_unique<NopStatement>());
|
premerge.push_back(std::make_unique<NopStatement>());
|
||||||
premerge.push_back(nullptr);
|
premerge.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -183,13 +183,13 @@ TEST_F(IfStatementTest, IsValid_NullPremergeStatement) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_InvalidPremergeStatement) {
|
TEST_F(IfStatementTest, IsValid_InvalidPremergeStatement) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> premerge;
|
StatementList premerge;
|
||||||
premerge.push_back(std::make_unique<IfStatement>());
|
premerge.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
@ -200,14 +200,14 @@ TEST_F(IfStatementTest, IsValid_InvalidPremergeStatement) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_PremergeWithElseIf) {
|
TEST_F(IfStatementTest, IsValid_PremergeWithElseIf) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("ident"));
|
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("ident"));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> premerge;
|
StatementList premerge;
|
||||||
premerge.push_back(std::make_unique<NopStatement>());
|
premerge.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
@ -218,10 +218,10 @@ TEST_F(IfStatementTest, IsValid_PremergeWithElseIf) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_PremergeWithoutElse) {
|
TEST_F(IfStatementTest, IsValid_PremergeWithoutElse) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> premerge;
|
StatementList premerge;
|
||||||
premerge.push_back(std::make_unique<NopStatement>());
|
premerge.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
@ -231,10 +231,10 @@ TEST_F(IfStatementTest, IsValid_PremergeWithoutElse) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_MultipleElseWiththoutCondition) {
|
TEST_F(IfStatementTest, IsValid_MultipleElseWiththoutCondition) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
|
|
||||||
|
@ -245,10 +245,10 @@ TEST_F(IfStatementTest, IsValid_MultipleElseWiththoutCondition) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, IsValid_ElseNotLast) {
|
TEST_F(IfStatementTest, IsValid_ElseNotLast) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts[1]->set_condition(std::make_unique<IdentifierExpression>("ident"));
|
else_stmts[1]->set_condition(std::make_unique<IdentifierExpression>("ident"));
|
||||||
|
@ -260,7 +260,7 @@ TEST_F(IfStatementTest, IsValid_ElseNotLast) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, ToStr) {
|
TEST_F(IfStatementTest, ToStr) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
@ -280,17 +280,17 @@ TEST_F(IfStatementTest, ToStr) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, ToStr_WithElseStatements) {
|
TEST_F(IfStatementTest, ToStr_WithElseStatements) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> else_if_body;
|
StatementList else_if_body;
|
||||||
else_if_body.push_back(std::make_unique<KillStatement>());
|
else_if_body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> else_body;
|
StatementList else_body;
|
||||||
else_body.push_back(std::make_unique<NopStatement>());
|
else_body.push_back(std::make_unique<NopStatement>());
|
||||||
else_body.push_back(std::make_unique<KillStatement>());
|
else_body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("ident"));
|
else_stmts[0]->set_condition(std::make_unique<IdentifierExpression>("ident"));
|
||||||
else_stmts[0]->set_body(std::move(else_if_body));
|
else_stmts[0]->set_body(std::move(else_if_body));
|
||||||
|
@ -329,13 +329,13 @@ TEST_F(IfStatementTest, ToStr_WithElseStatements) {
|
||||||
|
|
||||||
TEST_F(IfStatementTest, ToStr_WithPremerge) {
|
TEST_F(IfStatementTest, ToStr_WithPremerge) {
|
||||||
auto cond = std::make_unique<IdentifierExpression>("cond");
|
auto cond = std::make_unique<IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ElseStatement>> else_stmts;
|
ElseStatementList else_stmts;
|
||||||
else_stmts.push_back(std::make_unique<ElseStatement>());
|
else_stmts.push_back(std::make_unique<ElseStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> premerge;
|
StatementList premerge;
|
||||||
premerge.push_back(std::make_unique<NopStatement>());
|
premerge.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
IfStatement stmt(std::move(cond), std::move(body));
|
IfStatement stmt(std::move(cond), std::move(body));
|
||||||
|
|
|
@ -15,8 +15,10 @@
|
||||||
#ifndef SRC_AST_IMPORT_H_
|
#ifndef SRC_AST_IMPORT_H_
|
||||||
#define SRC_AST_IMPORT_H_
|
#define SRC_AST_IMPORT_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "src/ast/node.h"
|
#include "src/ast/node.h"
|
||||||
|
|
||||||
|
@ -70,6 +72,9 @@ class Import : public Node {
|
||||||
std::string name_;
|
std::string name_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique imports
|
||||||
|
using ImportList = std::vector<std::unique_ptr<Import>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -19,13 +19,12 @@ namespace ast {
|
||||||
|
|
||||||
LoopStatement::LoopStatement() : Statement() {}
|
LoopStatement::LoopStatement() : Statement() {}
|
||||||
|
|
||||||
LoopStatement::LoopStatement(std::vector<std::unique_ptr<Statement>> body,
|
LoopStatement::LoopStatement(StatementList body, StatementList continuing)
|
||||||
std::vector<std::unique_ptr<Statement>> continuing)
|
|
||||||
: Statement(), body_(std::move(body)), continuing_(std::move(continuing)) {}
|
: Statement(), body_(std::move(body)), continuing_(std::move(continuing)) {}
|
||||||
|
|
||||||
LoopStatement::LoopStatement(const Source& source,
|
LoopStatement::LoopStatement(const Source& source,
|
||||||
std::vector<std::unique_ptr<Statement>> body,
|
StatementList body,
|
||||||
std::vector<std::unique_ptr<Statement>> continuing)
|
StatementList continuing)
|
||||||
: Statement(source),
|
: Statement(source),
|
||||||
body_(std::move(body)),
|
body_(std::move(body)),
|
||||||
continuing_(std::move(continuing)) {}
|
continuing_(std::move(continuing)) {}
|
||||||
|
|
|
@ -15,9 +15,7 @@
|
||||||
#ifndef SRC_AST_LOOP_STATEMENT_H_
|
#ifndef SRC_AST_LOOP_STATEMENT_H_
|
||||||
#define SRC_AST_LOOP_STATEMENT_H_
|
#define SRC_AST_LOOP_STATEMENT_H_
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/statement.h"
|
#include "src/ast/statement.h"
|
||||||
|
|
||||||
|
@ -32,36 +30,31 @@ class LoopStatement : public Statement {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
/// @param continuing the continuing statements
|
/// @param continuing the continuing statements
|
||||||
LoopStatement(std::vector<std::unique_ptr<Statement>> body,
|
LoopStatement(StatementList body, StatementList continuing);
|
||||||
std::vector<std::unique_ptr<Statement>> continuing);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the loop statement source
|
/// @param source the loop statement source
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
/// @param continuing the continuing statements
|
/// @param continuing the continuing statements
|
||||||
LoopStatement(const Source& source,
|
LoopStatement(const Source& source,
|
||||||
std::vector<std::unique_ptr<Statement>> body,
|
StatementList body,
|
||||||
std::vector<std::unique_ptr<Statement>> continuing);
|
StatementList continuing);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
LoopStatement(LoopStatement&&) = default;
|
LoopStatement(LoopStatement&&) = default;
|
||||||
~LoopStatement() override;
|
~LoopStatement() override;
|
||||||
|
|
||||||
/// Sets the body statements
|
/// Sets the body statements
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
void set_body(std::vector<std::unique_ptr<Statement>> body) {
|
void set_body(StatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the body statements
|
/// @returns the body statements
|
||||||
const std::vector<std::unique_ptr<Statement>>& body() const { return body_; }
|
const StatementList& body() const { return body_; }
|
||||||
|
|
||||||
/// Sets the continuing statements
|
/// Sets the continuing statements
|
||||||
/// @param continuing the continuing statements
|
/// @param continuing the continuing statements
|
||||||
void set_continuing(std::vector<std::unique_ptr<Statement>> continuing) {
|
void set_continuing(StatementList continuing) {
|
||||||
continuing_ = std::move(continuing);
|
continuing_ = std::move(continuing);
|
||||||
}
|
}
|
||||||
/// @returns the continuing statements
|
/// @returns the continuing statements
|
||||||
const std::vector<std::unique_ptr<Statement>>& continuing() const {
|
const StatementList& continuing() const { return continuing_; }
|
||||||
return continuing_;
|
|
||||||
}
|
|
||||||
/// @returns true if there are continuing statements in the loop
|
/// @returns true if there are continuing statements in the loop
|
||||||
bool has_continuing() const { return !continuing_.empty(); }
|
bool has_continuing() const { return !continuing_.empty(); }
|
||||||
|
|
||||||
|
@ -79,8 +72,8 @@ class LoopStatement : public Statement {
|
||||||
private:
|
private:
|
||||||
LoopStatement(const LoopStatement&) = delete;
|
LoopStatement(const LoopStatement&) = delete;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> body_;
|
StatementList body_;
|
||||||
std::vector<std::unique_ptr<Statement>> continuing_;
|
StatementList continuing_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "src/ast/loop_statement.h"
|
#include "src/ast/loop_statement.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
@ -28,11 +29,11 @@ namespace {
|
||||||
using LoopStatementTest = testing::Test;
|
using LoopStatementTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, Creation) {
|
TEST_F(LoopStatementTest, Creation) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
auto b_ptr = body[0].get();
|
auto b_ptr = body[0].get();
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
auto c_ptr = continuing[0].get();
|
auto c_ptr = continuing[0].get();
|
||||||
|
|
||||||
|
@ -44,10 +45,10 @@ TEST_F(LoopStatementTest, Creation) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, Creation_WithSource) {
|
TEST_F(LoopStatementTest, Creation_WithSource) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
LoopStatement l(Source{20, 2}, std::move(body), std::move(continuing));
|
LoopStatement l(Source{20, 2}, std::move(body), std::move(continuing));
|
||||||
|
@ -62,7 +63,7 @@ TEST_F(LoopStatementTest, IsLoop) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, HasContinuing_WithoutContinuing) {
|
TEST_F(LoopStatementTest, HasContinuing_WithoutContinuing) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), {});
|
LoopStatement l(std::move(body), {});
|
||||||
|
@ -70,10 +71,10 @@ TEST_F(LoopStatementTest, HasContinuing_WithoutContinuing) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, HasContinuing_WithContinuing) {
|
TEST_F(LoopStatementTest, HasContinuing_WithContinuing) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), std::move(continuing));
|
LoopStatement l(std::move(body), std::move(continuing));
|
||||||
|
@ -81,10 +82,10 @@ TEST_F(LoopStatementTest, HasContinuing_WithContinuing) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, IsValid) {
|
TEST_F(LoopStatementTest, IsValid) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), std::move(continuing));
|
LoopStatement l(std::move(body), std::move(continuing));
|
||||||
|
@ -92,7 +93,7 @@ TEST_F(LoopStatementTest, IsValid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, IsValid_WithoutContinuing) {
|
TEST_F(LoopStatementTest, IsValid_WithoutContinuing) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), {});
|
LoopStatement l(std::move(body), {});
|
||||||
|
@ -105,11 +106,11 @@ TEST_F(LoopStatementTest, IsValid_WithoutBody) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, IsValid_NullBodyStatement) {
|
TEST_F(LoopStatementTest, IsValid_NullBodyStatement) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
body.push_back(nullptr);
|
body.push_back(nullptr);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), std::move(continuing));
|
LoopStatement l(std::move(body), std::move(continuing));
|
||||||
|
@ -117,11 +118,11 @@ TEST_F(LoopStatementTest, IsValid_NullBodyStatement) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, IsValid_InvalidBodyStatement) {
|
TEST_F(LoopStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
body.push_back(std::make_unique<IfStatement>());
|
body.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), std::move(continuing));
|
LoopStatement l(std::move(body), std::move(continuing));
|
||||||
|
@ -129,10 +130,10 @@ TEST_F(LoopStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, IsValid_NullContinuingStatement) {
|
TEST_F(LoopStatementTest, IsValid_NullContinuingStatement) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
continuing.push_back(nullptr);
|
continuing.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -141,10 +142,10 @@ TEST_F(LoopStatementTest, IsValid_NullContinuingStatement) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, IsValid_InvalidContinuingStatement) {
|
TEST_F(LoopStatementTest, IsValid_InvalidContinuingStatement) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
continuing.push_back(std::make_unique<IfStatement>());
|
continuing.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
|
@ -153,7 +154,7 @@ TEST_F(LoopStatementTest, IsValid_InvalidContinuingStatement) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, ToStr) {
|
TEST_F(LoopStatementTest, ToStr) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), {});
|
LoopStatement l(std::move(body), {});
|
||||||
|
@ -166,10 +167,10 @@ TEST_F(LoopStatementTest, ToStr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LoopStatementTest, ToStr_WithContinuing) {
|
TEST_F(LoopStatementTest, ToStr_WithContinuing) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<KillStatement>());
|
body.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> continuing;
|
StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<NopStatement>());
|
continuing.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
LoopStatement l(std::move(body), std::move(continuing));
|
LoopStatement l(std::move(body), std::move(continuing));
|
||||||
|
|
|
@ -43,9 +43,7 @@ class Module {
|
||||||
imports_.push_back(std::move(import));
|
imports_.push_back(std::move(import));
|
||||||
}
|
}
|
||||||
/// @returns the imports for this module
|
/// @returns the imports for this module
|
||||||
const std::vector<std::unique_ptr<Import>>& imports() const {
|
const ImportList& imports() const { return imports_; }
|
||||||
return imports_;
|
|
||||||
}
|
|
||||||
/// Find the import of the given name
|
/// Find the import of the given name
|
||||||
/// @param name The import name to search for
|
/// @param name The import name to search for
|
||||||
/// @returns the import with the given name if found, nullptr otherwise.
|
/// @returns the import with the given name if found, nullptr otherwise.
|
||||||
|
@ -57,9 +55,7 @@ class Module {
|
||||||
global_variables_.push_back(std::move(var));
|
global_variables_.push_back(std::move(var));
|
||||||
}
|
}
|
||||||
/// @returns the global variables for the module
|
/// @returns the global variables for the module
|
||||||
const std::vector<std::unique_ptr<Variable>>& global_variables() const {
|
const VariableList& global_variables() const { return global_variables_; }
|
||||||
return global_variables_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Adds an entry point to the module
|
/// Adds an entry point to the module
|
||||||
/// @param ep the entry point to add
|
/// @param ep the entry point to add
|
||||||
|
@ -67,9 +63,7 @@ class Module {
|
||||||
entry_points_.push_back(std::move(ep));
|
entry_points_.push_back(std::move(ep));
|
||||||
}
|
}
|
||||||
/// @returns the entry points in the module
|
/// @returns the entry points in the module
|
||||||
const std::vector<std::unique_ptr<EntryPoint>>& entry_points() const {
|
const EntryPointList& entry_points() const { return entry_points_; }
|
||||||
return entry_points_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Adds a type alias to the module
|
/// Adds a type alias to the module
|
||||||
/// @param type the alias to add
|
/// @param type the alias to add
|
||||||
|
@ -85,9 +79,7 @@ class Module {
|
||||||
functions_.push_back(std::move(func));
|
functions_.push_back(std::move(func));
|
||||||
}
|
}
|
||||||
/// @returns the modules functions
|
/// @returns the modules functions
|
||||||
const std::vector<std::unique_ptr<Function>>& functions() const {
|
const FunctionList& functions() const { return functions_; }
|
||||||
return functions_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if all required fields in the AST are present.
|
/// @returns true if all required fields in the AST are present.
|
||||||
bool IsValid() const;
|
bool IsValid() const;
|
||||||
|
@ -98,12 +90,12 @@ class Module {
|
||||||
private:
|
private:
|
||||||
Module(const Module&) = delete;
|
Module(const Module&) = delete;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Import>> imports_;
|
ImportList imports_;
|
||||||
std::vector<std::unique_ptr<Variable>> global_variables_;
|
VariableList global_variables_;
|
||||||
std::vector<std::unique_ptr<EntryPoint>> entry_points_;
|
EntryPointList entry_points_;
|
||||||
// The alias types are owned by the type manager
|
// The alias types are owned by the type manager
|
||||||
std::vector<type::AliasType*> alias_types_;
|
std::vector<type::AliasType*> alias_types_;
|
||||||
std::vector<std::unique_ptr<Function>> functions_;
|
FunctionList functions_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -163,8 +163,7 @@ TEST_F(ModuleTest, IsValid_Null_Alias) {
|
||||||
|
|
||||||
TEST_F(ModuleTest, IsValid_Function) {
|
TEST_F(ModuleTest, IsValid_Function) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
auto func = std::make_unique<Function>(
|
auto func = std::make_unique<Function>("main", VariableList(), &f32);
|
||||||
"main", std::vector<std::unique_ptr<Variable>>(), &f32);
|
|
||||||
|
|
||||||
Module m;
|
Module m;
|
||||||
m.AddFunction(std::move(func));
|
m.AddFunction(std::move(func));
|
||||||
|
|
|
@ -19,15 +19,13 @@ namespace ast {
|
||||||
|
|
||||||
RegardlessStatement::RegardlessStatement() : Statement() {}
|
RegardlessStatement::RegardlessStatement() : Statement() {}
|
||||||
|
|
||||||
RegardlessStatement::RegardlessStatement(
|
RegardlessStatement::RegardlessStatement(std::unique_ptr<Expression> condition,
|
||||||
std::unique_ptr<Expression> condition,
|
StatementList body)
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
|
||||||
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
||||||
|
|
||||||
RegardlessStatement::RegardlessStatement(
|
RegardlessStatement::RegardlessStatement(const Source& source,
|
||||||
const Source& source,
|
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(source),
|
: Statement(source),
|
||||||
condition_(std::move(condition)),
|
condition_(std::move(condition)),
|
||||||
body_(std::move(body)) {}
|
body_(std::move(body)) {}
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/statement.h"
|
#include "src/ast/statement.h"
|
||||||
|
@ -34,14 +33,14 @@ class RegardlessStatement : public Statement {
|
||||||
/// @param condition the condition expression
|
/// @param condition the condition expression
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
RegardlessStatement(std::unique_ptr<Expression> condition,
|
RegardlessStatement(std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
StatementList body);
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the regardless statement source
|
/// @param source the regardless statement source
|
||||||
/// @param condition the condition expression
|
/// @param condition the condition expression
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
RegardlessStatement(const Source& source,
|
RegardlessStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
StatementList body);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
RegardlessStatement(RegardlessStatement&&) = default;
|
RegardlessStatement(RegardlessStatement&&) = default;
|
||||||
~RegardlessStatement() override;
|
~RegardlessStatement() override;
|
||||||
|
@ -56,11 +55,9 @@ class RegardlessStatement : public Statement {
|
||||||
|
|
||||||
/// Sets the body statements
|
/// Sets the body statements
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
void set_body(std::vector<std::unique_ptr<Statement>> body) {
|
void set_body(StatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the body statements
|
/// @returns the body statements
|
||||||
const std::vector<std::unique_ptr<Statement>>& body() const { return body_; }
|
const StatementList& body() const { return body_; }
|
||||||
|
|
||||||
/// @returns true if this is an regardless statement
|
/// @returns true if this is an regardless statement
|
||||||
bool IsRegardless() const override { return true; }
|
bool IsRegardless() const override { return true; }
|
||||||
|
@ -77,7 +74,7 @@ class RegardlessStatement : public Statement {
|
||||||
RegardlessStatement(const RegardlessStatement&) = delete;
|
RegardlessStatement(const RegardlessStatement&) = delete;
|
||||||
|
|
||||||
std::unique_ptr<Expression> condition_;
|
std::unique_ptr<Expression> condition_;
|
||||||
std::vector<std::unique_ptr<Statement>> body_;
|
StatementList body_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -29,7 +29,7 @@ using RegardlessStatementTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, Creation) {
|
TEST_F(RegardlessStatementTest, Creation) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
auto ident_ptr = ident.get();
|
auto ident_ptr = ident.get();
|
||||||
|
@ -43,7 +43,7 @@ TEST_F(RegardlessStatementTest, Creation) {
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, Creation_WithSource) {
|
TEST_F(RegardlessStatementTest, Creation_WithSource) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
RegardlessStatement r(Source{20, 2}, std::move(ident), std::move(stmts));
|
RegardlessStatement r(Source{20, 2}, std::move(ident), std::move(stmts));
|
||||||
|
@ -59,7 +59,7 @@ TEST_F(RegardlessStatementTest, IsRegardless) {
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, IsValid) {
|
TEST_F(RegardlessStatementTest, IsValid) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
RegardlessStatement r(std::move(ident), std::move(stmts));
|
RegardlessStatement r(std::move(ident), std::move(stmts));
|
||||||
|
@ -67,7 +67,7 @@ TEST_F(RegardlessStatementTest, IsValid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, IsValid_NullCondition) {
|
TEST_F(RegardlessStatementTest, IsValid_NullCondition) {
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
RegardlessStatement r;
|
RegardlessStatement r;
|
||||||
|
@ -77,7 +77,7 @@ TEST_F(RegardlessStatementTest, IsValid_NullCondition) {
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, IsValid_InvalidCondition) {
|
TEST_F(RegardlessStatementTest, IsValid_InvalidCondition) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("");
|
auto ident = std::make_unique<IdentifierExpression>("");
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
RegardlessStatement r(std::move(ident), std::move(stmts));
|
RegardlessStatement r(std::move(ident), std::move(stmts));
|
||||||
|
@ -86,7 +86,7 @@ TEST_F(RegardlessStatementTest, IsValid_InvalidCondition) {
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, IsValid_NullBodyStatement) {
|
TEST_F(RegardlessStatementTest, IsValid_NullBodyStatement) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
stmts.push_back(nullptr);
|
stmts.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ TEST_F(RegardlessStatementTest, IsValid_NullBodyStatement) {
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, IsValid_InvalidBodyStatement) {
|
TEST_F(RegardlessStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
stmts.push_back(std::make_unique<IfStatement>());
|
stmts.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ TEST_F(RegardlessStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
|
|
||||||
TEST_F(RegardlessStatementTest, ToStr) {
|
TEST_F(RegardlessStatementTest, ToStr) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> stmts;
|
StatementList stmts;
|
||||||
stmts.push_back(std::make_unique<KillStatement>());
|
stmts.push_back(std::make_unique<KillStatement>());
|
||||||
|
|
||||||
RegardlessStatement r(std::move(ident), std::move(stmts));
|
RegardlessStatement r(std::move(ident), std::move(stmts));
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
#ifndef SRC_AST_STATEMENT_H_
|
#ifndef SRC_AST_STATEMENT_H_
|
||||||
#define SRC_AST_STATEMENT_H_
|
#define SRC_AST_STATEMENT_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "src/ast/node.h"
|
#include "src/ast/node.h"
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
|
@ -116,6 +119,9 @@ class Statement : public Node {
|
||||||
Statement(const Statement&) = delete;
|
Statement(const Statement&) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique statements
|
||||||
|
using StatementList = std::vector<std::unique_ptr<Statement>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -19,13 +19,12 @@ namespace ast {
|
||||||
|
|
||||||
Struct::Struct() : Node() {}
|
Struct::Struct() : Node() {}
|
||||||
|
|
||||||
Struct::Struct(StructDecoration decoration,
|
Struct::Struct(StructDecoration decoration, StructMemberList members)
|
||||||
std::vector<std::unique_ptr<StructMember>> members)
|
|
||||||
: Node(), decoration_(decoration), members_(std::move(members)) {}
|
: Node(), decoration_(decoration), members_(std::move(members)) {}
|
||||||
|
|
||||||
Struct::Struct(const Source& source,
|
Struct::Struct(const Source& source,
|
||||||
StructDecoration decoration,
|
StructDecoration decoration,
|
||||||
std::vector<std::unique_ptr<StructMember>> members)
|
StructMemberList members)
|
||||||
: Node(source), decoration_(decoration), members_(std::move(members)) {}
|
: Node(source), decoration_(decoration), members_(std::move(members)) {}
|
||||||
|
|
||||||
Struct::~Struct() = default;
|
Struct::~Struct() = default;
|
||||||
|
|
|
@ -15,11 +15,9 @@
|
||||||
#ifndef SRC_AST_STRUCT_H_
|
#ifndef SRC_AST_STRUCT_H_
|
||||||
#define SRC_AST_STRUCT_H_
|
#define SRC_AST_STRUCT_H_
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/node.h"
|
#include "src/ast/node.h"
|
||||||
#include "src/ast/struct_decoration.h"
|
#include "src/ast/struct_decoration.h"
|
||||||
|
@ -36,15 +34,14 @@ class Struct : public Node {
|
||||||
/// Create a new struct statement
|
/// Create a new struct statement
|
||||||
/// @param decoration The struct decorations
|
/// @param decoration The struct decorations
|
||||||
/// @param members The struct members
|
/// @param members The struct members
|
||||||
Struct(StructDecoration decoration,
|
Struct(StructDecoration decoration, StructMemberList members);
|
||||||
std::vector<std::unique_ptr<StructMember>> members);
|
|
||||||
/// Create a new struct statement
|
/// Create a new struct statement
|
||||||
/// @param source The input source for the import statement
|
/// @param source The input source for the import statement
|
||||||
/// @param decoration The struct decorations
|
/// @param decoration The struct decorations
|
||||||
/// @param members The struct members
|
/// @param members The struct members
|
||||||
Struct(const Source& source,
|
Struct(const Source& source,
|
||||||
StructDecoration decoration,
|
StructDecoration decoration,
|
||||||
std::vector<std::unique_ptr<StructMember>> members);
|
StructMemberList members);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
Struct(Struct&&) = default;
|
Struct(Struct&&) = default;
|
||||||
|
|
||||||
|
@ -58,13 +55,9 @@ class Struct : public Node {
|
||||||
|
|
||||||
/// Sets the struct members
|
/// Sets the struct members
|
||||||
/// @param members the members to set
|
/// @param members the members to set
|
||||||
void set_members(std::vector<std::unique_ptr<StructMember>> members) {
|
void set_members(StructMemberList members) { members_ = std::move(members); }
|
||||||
members_ = std::move(members);
|
|
||||||
}
|
|
||||||
/// @returns the members
|
/// @returns the members
|
||||||
const std::vector<std::unique_ptr<StructMember>>& members() const {
|
const StructMemberList& members() const { return members_; }
|
||||||
return members_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if the node is valid
|
/// @returns true if the node is valid
|
||||||
bool IsValid() const override;
|
bool IsValid() const override;
|
||||||
|
@ -78,7 +71,7 @@ class Struct : public Node {
|
||||||
Struct(const Struct&) = delete;
|
Struct(const Struct&) = delete;
|
||||||
|
|
||||||
StructDecoration decoration_ = StructDecoration::kNone;
|
StructDecoration decoration_ = StructDecoration::kNone;
|
||||||
std::vector<std::unique_ptr<StructMember>> members_;
|
StructMemberList members_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -17,17 +17,15 @@
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
|
||||||
StructMember::StructMember(
|
StructMember::StructMember(const std::string& name,
|
||||||
const std::string& name,
|
|
||||||
type::Type* type,
|
type::Type* type,
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations)
|
StructMemberDecorationList decorations)
|
||||||
: Node(), name_(name), type_(type), decorations_(std::move(decorations)) {}
|
: Node(), name_(name), type_(type), decorations_(std::move(decorations)) {}
|
||||||
|
|
||||||
StructMember::StructMember(
|
StructMember::StructMember(const Source& source,
|
||||||
const Source& source,
|
|
||||||
const std::string& name,
|
const std::string& name,
|
||||||
type::Type* type,
|
type::Type* type,
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations)
|
StructMemberDecorationList decorations)
|
||||||
: Node(source),
|
: Node(source),
|
||||||
name_(name),
|
name_(name),
|
||||||
type_(type),
|
type_(type),
|
||||||
|
|
|
@ -37,20 +37,18 @@ class StructMember : public Node {
|
||||||
/// @param name The struct member name
|
/// @param name The struct member name
|
||||||
/// @param type The struct member type
|
/// @param type The struct member type
|
||||||
/// @param decorations The struct member decorations
|
/// @param decorations The struct member decorations
|
||||||
StructMember(
|
StructMember(const std::string& name,
|
||||||
const std::string& name,
|
|
||||||
type::Type* type,
|
type::Type* type,
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations);
|
StructMemberDecorationList decorations);
|
||||||
/// Create a new struct member statement
|
/// Create a new struct member statement
|
||||||
/// @param source The input source for the struct member statement
|
/// @param source The input source for the struct member statement
|
||||||
/// @param name The struct member name
|
/// @param name The struct member name
|
||||||
/// @param type The struct member type
|
/// @param type The struct member type
|
||||||
/// @param decorations The struct member decorations
|
/// @param decorations The struct member decorations
|
||||||
StructMember(
|
StructMember(const Source& source,
|
||||||
const Source& source,
|
|
||||||
const std::string& name,
|
const std::string& name,
|
||||||
type::Type* type,
|
type::Type* type,
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations);
|
StructMemberDecorationList decorations);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
StructMember(StructMember&&) = default;
|
StructMember(StructMember&&) = default;
|
||||||
|
|
||||||
|
@ -68,15 +66,11 @@ class StructMember : public Node {
|
||||||
type::Type* type() const { return type_; }
|
type::Type* type() const { return type_; }
|
||||||
/// Sets the decorations
|
/// Sets the decorations
|
||||||
/// @param decorations the decorations
|
/// @param decorations the decorations
|
||||||
void set_decorations(
|
void set_decorations(StructMemberDecorationList decorations) {
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations) {
|
|
||||||
decorations_ = std::move(decorations);
|
decorations_ = std::move(decorations);
|
||||||
}
|
}
|
||||||
/// @returns the decorations
|
/// @returns the decorations
|
||||||
const std::vector<std::unique_ptr<StructMemberDecoration>>& decorations()
|
const StructMemberDecorationList& decorations() const { return decorations_; }
|
||||||
const {
|
|
||||||
return decorations_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if the node is valid
|
/// @returns true if the node is valid
|
||||||
bool IsValid() const override;
|
bool IsValid() const override;
|
||||||
|
@ -91,9 +85,12 @@ class StructMember : public Node {
|
||||||
|
|
||||||
std::string name_;
|
std::string name_;
|
||||||
type::Type* type_ = nullptr;
|
type::Type* type_ = nullptr;
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations_;
|
StructMemberDecorationList decorations_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique struct members
|
||||||
|
using StructMemberList = std::vector<std::unique_ptr<StructMember>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,9 @@
|
||||||
#ifndef SRC_AST_STRUCT_MEMBER_DECORATION_H_
|
#ifndef SRC_AST_STRUCT_MEMBER_DECORATION_H_
|
||||||
#define SRC_AST_STRUCT_MEMBER_DECORATION_H_
|
#define SRC_AST_STRUCT_MEMBER_DECORATION_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
@ -40,6 +42,10 @@ class StructMemberDecoration {
|
||||||
StructMemberDecoration();
|
StructMemberDecoration();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique struct member decorations
|
||||||
|
using StructMemberDecorationList =
|
||||||
|
std::vector<std::unique_ptr<StructMemberDecoration>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ using StructMemberTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(StructMemberTest, Creation) {
|
TEST_F(StructMemberTest, Creation) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations;
|
StructMemberDecorationList decorations;
|
||||||
decorations.emplace_back(std::make_unique<StructMemberOffsetDecoration>(4));
|
decorations.emplace_back(std::make_unique<StructMemberOffsetDecoration>(4));
|
||||||
|
|
||||||
StructMember st{"a", &i32, std::move(decorations)};
|
StructMember st{"a", &i32, std::move(decorations)};
|
||||||
|
@ -72,7 +72,7 @@ TEST_F(StructMemberTest, IsValid_NullType) {
|
||||||
|
|
||||||
TEST_F(StructMemberTest, IsValid_Null_Decoration) {
|
TEST_F(StructMemberTest, IsValid_Null_Decoration) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations;
|
StructMemberDecorationList decorations;
|
||||||
decorations.emplace_back(std::make_unique<StructMemberOffsetDecoration>(4));
|
decorations.emplace_back(std::make_unique<StructMemberOffsetDecoration>(4));
|
||||||
decorations.push_back(nullptr);
|
decorations.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ TEST_F(StructMemberTest, IsValid_Null_Decoration) {
|
||||||
|
|
||||||
TEST_F(StructMemberTest, ToStr) {
|
TEST_F(StructMemberTest, ToStr) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
std::vector<std::unique_ptr<StructMemberDecoration>> decorations;
|
StructMemberDecorationList decorations;
|
||||||
decorations.emplace_back(std::make_unique<StructMemberOffsetDecoration>(4));
|
decorations.emplace_back(std::make_unique<StructMemberOffsetDecoration>(4));
|
||||||
|
|
||||||
StructMember st{"a", &i32, std::move(decorations)};
|
StructMember st{"a", &i32, std::move(decorations)};
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "src/ast/struct.h"
|
#include "src/ast/struct.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -30,9 +31,9 @@ using StructTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(StructTest, Creation) {
|
TEST_F(StructTest, Creation) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
std::vector<std::unique_ptr<StructMember>> members;
|
StructMemberList members;
|
||||||
members.push_back(std::make_unique<StructMember>(
|
members.push_back(
|
||||||
"a", &i32, std::vector<std::unique_ptr<StructMemberDecoration>>()));
|
std::make_unique<StructMember>("a", &i32, StructMemberDecorationList()));
|
||||||
|
|
||||||
Struct s{StructDecoration::kNone, std::move(members)};
|
Struct s{StructDecoration::kNone, std::move(members)};
|
||||||
EXPECT_EQ(s.members().size(), 1);
|
EXPECT_EQ(s.members().size(), 1);
|
||||||
|
@ -44,9 +45,9 @@ TEST_F(StructTest, Creation) {
|
||||||
TEST_F(StructTest, CreationWithSource) {
|
TEST_F(StructTest, CreationWithSource) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
Source source{27, 4};
|
Source source{27, 4};
|
||||||
std::vector<std::unique_ptr<StructMember>> members;
|
StructMemberList members;
|
||||||
members.emplace_back(std::make_unique<StructMember>(
|
members.emplace_back(
|
||||||
"a", &i32, std::vector<std::unique_ptr<StructMemberDecoration>>()));
|
std::make_unique<StructMember>("a", &i32, StructMemberDecorationList()));
|
||||||
|
|
||||||
Struct s{source, StructDecoration::kNone, std::move(members)};
|
Struct s{source, StructDecoration::kNone, std::move(members)};
|
||||||
EXPECT_EQ(s.members().size(), 1);
|
EXPECT_EQ(s.members().size(), 1);
|
||||||
|
@ -62,9 +63,9 @@ TEST_F(StructTest, IsValid) {
|
||||||
|
|
||||||
TEST_F(StructTest, IsValid_Null_StructMember) {
|
TEST_F(StructTest, IsValid_Null_StructMember) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
std::vector<std::unique_ptr<StructMember>> members;
|
StructMemberList members;
|
||||||
members.push_back(std::make_unique<StructMember>(
|
members.push_back(
|
||||||
"a", &i32, std::vector<std::unique_ptr<StructMemberDecoration>>()));
|
std::make_unique<StructMember>("a", &i32, StructMemberDecorationList()));
|
||||||
members.push_back(nullptr);
|
members.push_back(nullptr);
|
||||||
|
|
||||||
Struct s{StructDecoration::kNone, std::move(members)};
|
Struct s{StructDecoration::kNone, std::move(members)};
|
||||||
|
@ -73,9 +74,9 @@ TEST_F(StructTest, IsValid_Null_StructMember) {
|
||||||
|
|
||||||
TEST_F(StructTest, IsValid_Invalid_StructMember) {
|
TEST_F(StructTest, IsValid_Invalid_StructMember) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
std::vector<std::unique_ptr<StructMember>> members;
|
StructMemberList members;
|
||||||
members.push_back(std::make_unique<StructMember>(
|
members.push_back(
|
||||||
"", &i32, std::vector<std::unique_ptr<StructMemberDecoration>>()));
|
std::make_unique<StructMember>("", &i32, StructMemberDecorationList()));
|
||||||
|
|
||||||
Struct s{StructDecoration::kNone, std::move(members)};
|
Struct s{StructDecoration::kNone, std::move(members)};
|
||||||
EXPECT_FALSE(s.IsValid());
|
EXPECT_FALSE(s.IsValid());
|
||||||
|
@ -84,9 +85,9 @@ TEST_F(StructTest, IsValid_Invalid_StructMember) {
|
||||||
TEST_F(StructTest, ToStr) {
|
TEST_F(StructTest, ToStr) {
|
||||||
type::I32Type i32;
|
type::I32Type i32;
|
||||||
Source source{27, 4};
|
Source source{27, 4};
|
||||||
std::vector<std::unique_ptr<StructMember>> members;
|
StructMemberList members;
|
||||||
members.emplace_back(std::make_unique<StructMember>(
|
members.emplace_back(
|
||||||
"a", &i32, std::vector<std::unique_ptr<StructMemberDecoration>>()));
|
std::make_unique<StructMember>("a", &i32, StructMemberDecorationList()));
|
||||||
|
|
||||||
Struct s{source, StructDecoration::kNone, std::move(members)};
|
Struct s{source, StructDecoration::kNone, std::move(members)};
|
||||||
|
|
||||||
|
|
|
@ -21,15 +21,13 @@ namespace ast {
|
||||||
|
|
||||||
SwitchStatement::SwitchStatement() : Statement() {}
|
SwitchStatement::SwitchStatement() : Statement() {}
|
||||||
|
|
||||||
SwitchStatement::SwitchStatement(
|
SwitchStatement::SwitchStatement(std::unique_ptr<Expression> condition,
|
||||||
std::unique_ptr<Expression> condition,
|
CaseStatementList body)
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body)
|
|
||||||
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
||||||
|
|
||||||
SwitchStatement::SwitchStatement(
|
SwitchStatement::SwitchStatement(const Source& source,
|
||||||
const Source& source,
|
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body)
|
CaseStatementList body)
|
||||||
: Statement(source),
|
: Statement(source),
|
||||||
condition_(std::move(condition)),
|
condition_(std::move(condition)),
|
||||||
body_(std::move(body)) {}
|
body_(std::move(body)) {}
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
|
#include "src/ast/case_statement.h"
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/literal.h"
|
#include "src/ast/literal.h"
|
||||||
#include "src/ast/statement.h"
|
#include "src/ast/statement.h"
|
||||||
|
@ -36,14 +36,14 @@ class SwitchStatement : public Statement {
|
||||||
/// @param condition the switch condition
|
/// @param condition the switch condition
|
||||||
/// @param body the switch body
|
/// @param body the switch body
|
||||||
SwitchStatement(std::unique_ptr<Expression> condition,
|
SwitchStatement(std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body);
|
CaseStatementList body);
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the source information
|
/// @param source the source information
|
||||||
/// @param condition the switch condition
|
/// @param condition the switch condition
|
||||||
/// @param body the switch body
|
/// @param body the switch body
|
||||||
SwitchStatement(const Source& source,
|
SwitchStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body);
|
CaseStatementList body);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
SwitchStatement(SwitchStatement&&) = default;
|
SwitchStatement(SwitchStatement&&) = default;
|
||||||
~SwitchStatement() override;
|
~SwitchStatement() override;
|
||||||
|
@ -60,13 +60,9 @@ class SwitchStatement : public Statement {
|
||||||
|
|
||||||
/// Sets the switch body
|
/// Sets the switch body
|
||||||
/// @param body the switch body
|
/// @param body the switch body
|
||||||
void set_body(std::vector<std::unique_ptr<CaseStatement>> body) {
|
void set_body(CaseStatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the Switch body
|
/// @returns the Switch body
|
||||||
const std::vector<std::unique_ptr<CaseStatement>>& body() const {
|
const CaseStatementList& body() const { return body_; }
|
||||||
return body_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if this is a switch statement
|
/// @returns true if this is a switch statement
|
||||||
bool IsSwitch() const override { return true; }
|
bool IsSwitch() const override { return true; }
|
||||||
|
@ -83,7 +79,7 @@ class SwitchStatement : public Statement {
|
||||||
SwitchStatement(const SwitchStatement&) = delete;
|
SwitchStatement(const SwitchStatement&) = delete;
|
||||||
|
|
||||||
std::unique_ptr<Expression> condition_;
|
std::unique_ptr<Expression> condition_;
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body_;
|
CaseStatementList body_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -32,9 +32,9 @@ TEST_F(SwitchStatementTest, Creation) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body;
|
CaseStatementList body;
|
||||||
body.push_back(std::make_unique<CaseStatement>(
|
body.push_back(
|
||||||
std::move(lit), std::vector<std::unique_ptr<Statement>>()));
|
std::make_unique<CaseStatement>(std::move(lit), StatementList()));
|
||||||
|
|
||||||
auto ident_ptr = ident.get();
|
auto ident_ptr = ident.get();
|
||||||
auto case_ptr = body[0].get();
|
auto case_ptr = body[0].get();
|
||||||
|
@ -48,8 +48,7 @@ TEST_F(SwitchStatementTest, Creation) {
|
||||||
TEST_F(SwitchStatementTest, Creation_WithSource) {
|
TEST_F(SwitchStatementTest, Creation_WithSource) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
|
|
||||||
SwitchStatement stmt(Source{20, 2}, std::move(ident),
|
SwitchStatement stmt(Source{20, 2}, std::move(ident), CaseStatementList());
|
||||||
std::vector<std::unique_ptr<CaseStatement>>());
|
|
||||||
auto src = stmt.source();
|
auto src = stmt.source();
|
||||||
EXPECT_EQ(src.line, 20);
|
EXPECT_EQ(src.line, 20);
|
||||||
EXPECT_EQ(src.column, 2);
|
EXPECT_EQ(src.column, 2);
|
||||||
|
@ -64,9 +63,9 @@ TEST_F(SwitchStatementTest, IsValid) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body;
|
CaseStatementList body;
|
||||||
body.push_back(std::make_unique<CaseStatement>(
|
body.push_back(
|
||||||
std::move(lit), std::vector<std::unique_ptr<Statement>>()));
|
std::make_unique<CaseStatement>(std::move(lit), StatementList()));
|
||||||
|
|
||||||
SwitchStatement stmt(std::move(ident), std::move(body));
|
SwitchStatement stmt(std::move(ident), std::move(body));
|
||||||
EXPECT_TRUE(stmt.IsValid());
|
EXPECT_TRUE(stmt.IsValid());
|
||||||
|
@ -75,9 +74,9 @@ TEST_F(SwitchStatementTest, IsValid) {
|
||||||
TEST_F(SwitchStatementTest, IsValid_Null_Condition) {
|
TEST_F(SwitchStatementTest, IsValid_Null_Condition) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body;
|
CaseStatementList body;
|
||||||
body.push_back(std::make_unique<CaseStatement>(
|
body.push_back(
|
||||||
std::move(lit), std::vector<std::unique_ptr<Statement>>()));
|
std::make_unique<CaseStatement>(std::move(lit), StatementList()));
|
||||||
|
|
||||||
SwitchStatement stmt;
|
SwitchStatement stmt;
|
||||||
stmt.set_body(std::move(body));
|
stmt.set_body(std::move(body));
|
||||||
|
@ -88,9 +87,9 @@ TEST_F(SwitchStatementTest, IsValid_Invalid_Condition) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
auto ident = std::make_unique<IdentifierExpression>("");
|
auto ident = std::make_unique<IdentifierExpression>("");
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body;
|
CaseStatementList body;
|
||||||
body.push_back(std::make_unique<CaseStatement>(
|
body.push_back(
|
||||||
std::move(lit), std::vector<std::unique_ptr<Statement>>()));
|
std::make_unique<CaseStatement>(std::move(lit), StatementList()));
|
||||||
|
|
||||||
SwitchStatement stmt(std::move(ident), std::move(body));
|
SwitchStatement stmt(std::move(ident), std::move(body));
|
||||||
EXPECT_FALSE(stmt.IsValid());
|
EXPECT_FALSE(stmt.IsValid());
|
||||||
|
@ -100,9 +99,9 @@ TEST_F(SwitchStatementTest, IsValid_Null_BodyStatement) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body;
|
CaseStatementList body;
|
||||||
body.push_back(std::make_unique<CaseStatement>(
|
body.push_back(
|
||||||
std::move(lit), std::vector<std::unique_ptr<Statement>>()));
|
std::make_unique<CaseStatement>(std::move(lit), StatementList()));
|
||||||
body.push_back(nullptr);
|
body.push_back(nullptr);
|
||||||
|
|
||||||
SwitchStatement stmt(std::move(ident), std::move(body));
|
SwitchStatement stmt(std::move(ident), std::move(body));
|
||||||
|
@ -112,10 +111,10 @@ TEST_F(SwitchStatementTest, IsValid_Null_BodyStatement) {
|
||||||
TEST_F(SwitchStatementTest, IsValid_Invalid_BodyStatement) {
|
TEST_F(SwitchStatementTest, IsValid_Invalid_BodyStatement) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Statement>> case_body;
|
StatementList case_body;
|
||||||
case_body.push_back(nullptr);
|
case_body.push_back(nullptr);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body;
|
CaseStatementList body;
|
||||||
body.push_back(
|
body.push_back(
|
||||||
std::make_unique<CaseStatement>(nullptr, std::move(case_body)));
|
std::make_unique<CaseStatement>(nullptr, std::move(case_body)));
|
||||||
|
|
||||||
|
@ -141,9 +140,9 @@ TEST_F(SwitchStatementTest, ToStr) {
|
||||||
ast::type::BoolType bool_type;
|
ast::type::BoolType bool_type;
|
||||||
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
auto lit = std::make_unique<BoolLiteral>(&bool_type, true);
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<CaseStatement>> body;
|
CaseStatementList body;
|
||||||
body.push_back(std::make_unique<CaseStatement>(
|
body.push_back(
|
||||||
std::move(lit), std::vector<std::unique_ptr<Statement>>()));
|
std::make_unique<CaseStatement>(std::move(lit), StatementList()));
|
||||||
|
|
||||||
SwitchStatement stmt(std::move(ident), std::move(body));
|
SwitchStatement stmt(std::move(ident), std::move(body));
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
|
|
|
@ -20,15 +20,13 @@ namespace ast {
|
||||||
TypeConstructorExpression::TypeConstructorExpression()
|
TypeConstructorExpression::TypeConstructorExpression()
|
||||||
: ConstructorExpression() {}
|
: ConstructorExpression() {}
|
||||||
|
|
||||||
TypeConstructorExpression::TypeConstructorExpression(
|
TypeConstructorExpression::TypeConstructorExpression(type::Type* type,
|
||||||
type::Type* type,
|
ExpressionList values)
|
||||||
std::vector<std::unique_ptr<Expression>> values)
|
|
||||||
: ConstructorExpression(), type_(type), values_(std::move(values)) {}
|
: ConstructorExpression(), type_(type), values_(std::move(values)) {}
|
||||||
|
|
||||||
TypeConstructorExpression::TypeConstructorExpression(
|
TypeConstructorExpression::TypeConstructorExpression(const Source& source,
|
||||||
const Source& source,
|
|
||||||
type::Type* type,
|
type::Type* type,
|
||||||
std::vector<std::unique_ptr<Expression>> values)
|
ExpressionList values)
|
||||||
: ConstructorExpression(source), type_(type), values_(std::move(values)) {}
|
: ConstructorExpression(source), type_(type), values_(std::move(values)) {}
|
||||||
|
|
||||||
TypeConstructorExpression::~TypeConstructorExpression() = default;
|
TypeConstructorExpression::~TypeConstructorExpression() = default;
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/constructor_expression.h"
|
#include "src/ast/constructor_expression.h"
|
||||||
#include "src/ast/type/type.h"
|
#include "src/ast/type/type.h"
|
||||||
|
@ -32,16 +31,14 @@ class TypeConstructorExpression : public ConstructorExpression {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param type the type
|
/// @param type the type
|
||||||
/// @param values the values
|
/// @param values the values
|
||||||
explicit TypeConstructorExpression(
|
explicit TypeConstructorExpression(type::Type* type, ExpressionList values);
|
||||||
type::Type* type,
|
|
||||||
std::vector<std::unique_ptr<Expression>> values);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the constructor source
|
/// @param source the constructor source
|
||||||
/// @param type the type
|
/// @param type the type
|
||||||
/// @param values the constructor values
|
/// @param values the constructor values
|
||||||
TypeConstructorExpression(const Source& source,
|
TypeConstructorExpression(const Source& source,
|
||||||
type::Type* type,
|
type::Type* type,
|
||||||
std::vector<std::unique_ptr<Expression>> values);
|
ExpressionList values);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
TypeConstructorExpression(TypeConstructorExpression&&) = default;
|
TypeConstructorExpression(TypeConstructorExpression&&) = default;
|
||||||
~TypeConstructorExpression() override;
|
~TypeConstructorExpression() override;
|
||||||
|
@ -57,13 +54,9 @@ class TypeConstructorExpression : public ConstructorExpression {
|
||||||
|
|
||||||
/// Set the values
|
/// Set the values
|
||||||
/// @param values the values
|
/// @param values the values
|
||||||
void set_values(std::vector<std::unique_ptr<Expression>> values) {
|
void set_values(ExpressionList values) { values_ = std::move(values); }
|
||||||
values_ = std::move(values);
|
|
||||||
}
|
|
||||||
/// @returns the values
|
/// @returns the values
|
||||||
const std::vector<std::unique_ptr<Expression>>& values() const {
|
const ExpressionList& values() const { return values_; }
|
||||||
return values_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if the node is valid
|
/// @returns true if the node is valid
|
||||||
bool IsValid() const override;
|
bool IsValid() const override;
|
||||||
|
@ -77,7 +70,7 @@ class TypeConstructorExpression : public ConstructorExpression {
|
||||||
TypeConstructorExpression(const TypeConstructorExpression&) = delete;
|
TypeConstructorExpression(const TypeConstructorExpression&) = delete;
|
||||||
|
|
||||||
type::Type* type_ = nullptr;
|
type::Type* type_ = nullptr;
|
||||||
std::vector<std::unique_ptr<Expression>> values_;
|
ExpressionList values_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/constructor_expression.h"
|
#include "src/ast/constructor_expression.h"
|
||||||
|
@ -32,7 +31,7 @@ using TypeConstructorExpressionTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(TypeConstructorExpressionTest, Creation) {
|
TEST_F(TypeConstructorExpressionTest, Creation) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
||||||
auto expr_ptr = expr[0].get();
|
auto expr_ptr = expr[0].get();
|
||||||
|
|
||||||
|
@ -44,7 +43,7 @@ TEST_F(TypeConstructorExpressionTest, Creation) {
|
||||||
|
|
||||||
TEST_F(TypeConstructorExpressionTest, Creation_WithSource) {
|
TEST_F(TypeConstructorExpressionTest, Creation_WithSource) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
||||||
|
|
||||||
TypeConstructorExpression t(Source{20, 2}, &f32, std::move(expr));
|
TypeConstructorExpression t(Source{20, 2}, &f32, std::move(expr));
|
||||||
|
@ -60,7 +59,7 @@ TEST_F(TypeConstructorExpressionTest, IsTypeConstructor) {
|
||||||
|
|
||||||
TEST_F(TypeConstructorExpressionTest, IsValid) {
|
TEST_F(TypeConstructorExpressionTest, IsValid) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
||||||
|
|
||||||
TypeConstructorExpression t(&f32, std::move(expr));
|
TypeConstructorExpression t(&f32, std::move(expr));
|
||||||
|
@ -68,7 +67,7 @@ TEST_F(TypeConstructorExpressionTest, IsValid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TypeConstructorExpressionTest, IsValid_NullType) {
|
TEST_F(TypeConstructorExpressionTest, IsValid_NullType) {
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
||||||
|
|
||||||
TypeConstructorExpression t;
|
TypeConstructorExpression t;
|
||||||
|
@ -78,7 +77,7 @@ TEST_F(TypeConstructorExpressionTest, IsValid_NullType) {
|
||||||
|
|
||||||
TEST_F(TypeConstructorExpressionTest, IsValid_NullValue) {
|
TEST_F(TypeConstructorExpressionTest, IsValid_NullValue) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr"));
|
||||||
expr.push_back(nullptr);
|
expr.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -88,7 +87,7 @@ TEST_F(TypeConstructorExpressionTest, IsValid_NullValue) {
|
||||||
|
|
||||||
TEST_F(TypeConstructorExpressionTest, IsValid_InvalidValue) {
|
TEST_F(TypeConstructorExpressionTest, IsValid_InvalidValue) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>(""));
|
expr.push_back(std::make_unique<IdentifierExpression>(""));
|
||||||
|
|
||||||
TypeConstructorExpression t(&f32, std::move(expr));
|
TypeConstructorExpression t(&f32, std::move(expr));
|
||||||
|
@ -97,7 +96,7 @@ TEST_F(TypeConstructorExpressionTest, IsValid_InvalidValue) {
|
||||||
|
|
||||||
TEST_F(TypeConstructorExpressionTest, IsValid_EmptyValue) {
|
TEST_F(TypeConstructorExpressionTest, IsValid_EmptyValue) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
|
|
||||||
TypeConstructorExpression t(&f32, std::move(expr));
|
TypeConstructorExpression t(&f32, std::move(expr));
|
||||||
EXPECT_FALSE(t.IsValid());
|
EXPECT_FALSE(t.IsValid());
|
||||||
|
@ -106,7 +105,7 @@ TEST_F(TypeConstructorExpressionTest, IsValid_EmptyValue) {
|
||||||
TEST_F(TypeConstructorExpressionTest, ToStr) {
|
TEST_F(TypeConstructorExpressionTest, ToStr) {
|
||||||
type::F32Type f32;
|
type::F32Type f32;
|
||||||
type::VectorType vec(&f32, 3);
|
type::VectorType vec(&f32, 3);
|
||||||
std::vector<std::unique_ptr<Expression>> expr;
|
ExpressionList expr;
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr_1"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr_1"));
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr_2"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr_2"));
|
||||||
expr.push_back(std::make_unique<IdentifierExpression>("expr_3"));
|
expr.push_back(std::make_unique<IdentifierExpression>("expr_3"));
|
||||||
|
|
|
@ -19,15 +19,13 @@ namespace ast {
|
||||||
|
|
||||||
UnaryMethodExpression::UnaryMethodExpression() : Expression() {}
|
UnaryMethodExpression::UnaryMethodExpression() : Expression() {}
|
||||||
|
|
||||||
UnaryMethodExpression::UnaryMethodExpression(
|
UnaryMethodExpression::UnaryMethodExpression(UnaryMethod op,
|
||||||
UnaryMethod op,
|
ExpressionList params)
|
||||||
std::vector<std::unique_ptr<Expression>> params)
|
|
||||||
: Expression(), op_(op), params_(std::move(params)) {}
|
: Expression(), op_(op), params_(std::move(params)) {}
|
||||||
|
|
||||||
UnaryMethodExpression::UnaryMethodExpression(
|
UnaryMethodExpression::UnaryMethodExpression(const Source& source,
|
||||||
const Source& source,
|
|
||||||
UnaryMethod op,
|
UnaryMethod op,
|
||||||
std::vector<std::unique_ptr<Expression>> params)
|
ExpressionList params)
|
||||||
: Expression(source), op_(op), params_(std::move(params)) {}
|
: Expression(source), op_(op), params_(std::move(params)) {}
|
||||||
|
|
||||||
UnaryMethodExpression::~UnaryMethodExpression() = default;
|
UnaryMethodExpression::~UnaryMethodExpression() = default;
|
||||||
|
|
|
@ -15,9 +15,7 @@
|
||||||
#ifndef SRC_AST_UNARY_METHOD_EXPRESSION_H_
|
#ifndef SRC_AST_UNARY_METHOD_EXPRESSION_H_
|
||||||
#define SRC_AST_UNARY_METHOD_EXPRESSION_H_
|
#define SRC_AST_UNARY_METHOD_EXPRESSION_H_
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/literal.h"
|
#include "src/ast/literal.h"
|
||||||
|
@ -34,15 +32,14 @@ class UnaryMethodExpression : public Expression {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param op the op
|
/// @param op the op
|
||||||
/// @param params the params
|
/// @param params the params
|
||||||
UnaryMethodExpression(UnaryMethod op,
|
UnaryMethodExpression(UnaryMethod op, ExpressionList params);
|
||||||
std::vector<std::unique_ptr<Expression>> params);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the unary method source
|
/// @param source the unary method source
|
||||||
/// @param op the op
|
/// @param op the op
|
||||||
/// @param params the params
|
/// @param params the params
|
||||||
UnaryMethodExpression(const Source& source,
|
UnaryMethodExpression(const Source& source,
|
||||||
UnaryMethod op,
|
UnaryMethod op,
|
||||||
std::vector<std::unique_ptr<Expression>> params);
|
ExpressionList params);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
UnaryMethodExpression(UnaryMethodExpression&&) = default;
|
UnaryMethodExpression(UnaryMethodExpression&&) = default;
|
||||||
~UnaryMethodExpression() override;
|
~UnaryMethodExpression() override;
|
||||||
|
@ -55,13 +52,9 @@ class UnaryMethodExpression : public Expression {
|
||||||
|
|
||||||
/// Sets the params
|
/// Sets the params
|
||||||
/// @param params the parameters
|
/// @param params the parameters
|
||||||
void set_params(std::vector<std::unique_ptr<Expression>> params) {
|
void set_params(ExpressionList params) { params_ = std::move(params); }
|
||||||
params_ = std::move(params);
|
|
||||||
}
|
|
||||||
/// @returns the params
|
/// @returns the params
|
||||||
const std::vector<std::unique_ptr<Expression>>& params() const {
|
const ExpressionList& params() const { return params_; }
|
||||||
return params_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @returns true if this is an as expression
|
/// @returns true if this is an as expression
|
||||||
bool IsUnaryMethod() const override { return true; }
|
bool IsUnaryMethod() const override { return true; }
|
||||||
|
@ -78,7 +71,7 @@ class UnaryMethodExpression : public Expression {
|
||||||
UnaryMethodExpression(const UnaryMethodExpression&) = delete;
|
UnaryMethodExpression(const UnaryMethodExpression&) = delete;
|
||||||
|
|
||||||
UnaryMethod op_ = UnaryMethod::kAny;
|
UnaryMethod op_ = UnaryMethod::kAny;
|
||||||
std::vector<std::unique_ptr<Expression>> params_;
|
ExpressionList params_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "src/ast/unary_method_expression.h"
|
#include "src/ast/unary_method_expression.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
@ -26,7 +27,7 @@ namespace {
|
||||||
using UnaryMethodExpressionTest = testing::Test;
|
using UnaryMethodExpressionTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(UnaryMethodExpressionTest, Creation) {
|
TEST_F(UnaryMethodExpressionTest, Creation) {
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
||||||
|
|
||||||
auto ident_ptr = params[0].get();
|
auto ident_ptr = params[0].get();
|
||||||
|
@ -38,7 +39,7 @@ TEST_F(UnaryMethodExpressionTest, Creation) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(UnaryMethodExpressionTest, Creation_WithSource) {
|
TEST_F(UnaryMethodExpressionTest, Creation_WithSource) {
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
||||||
|
|
||||||
UnaryMethodExpression u(Source{20, 2}, UnaryMethod::kAll, std::move(params));
|
UnaryMethodExpression u(Source{20, 2}, UnaryMethod::kAll, std::move(params));
|
||||||
|
@ -53,7 +54,7 @@ TEST_F(UnaryMethodExpressionTest, IsUnaryMethod) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(UnaryMethodExpressionTest, IsValid) {
|
TEST_F(UnaryMethodExpressionTest, IsValid) {
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
||||||
|
|
||||||
UnaryMethodExpression u(UnaryMethod::kAll, std::move(params));
|
UnaryMethodExpression u(UnaryMethod::kAll, std::move(params));
|
||||||
|
@ -61,7 +62,7 @@ TEST_F(UnaryMethodExpressionTest, IsValid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(UnaryMethodExpressionTest, IsValid_NullParam) {
|
TEST_F(UnaryMethodExpressionTest, IsValid_NullParam) {
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
||||||
params.push_back(nullptr);
|
params.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -70,7 +71,7 @@ TEST_F(UnaryMethodExpressionTest, IsValid_NullParam) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(UnaryMethodExpressionTest, IsValid_InvalidParam) {
|
TEST_F(UnaryMethodExpressionTest, IsValid_InvalidParam) {
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>(""));
|
params.push_back(std::make_unique<IdentifierExpression>(""));
|
||||||
|
|
||||||
UnaryMethodExpression u(UnaryMethod::kAll, std::move(params));
|
UnaryMethodExpression u(UnaryMethod::kAll, std::move(params));
|
||||||
|
@ -84,7 +85,7 @@ TEST_F(UnaryMethodExpressionTest, IsValid_EmptyParams) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(UnaryMethodExpressionTest, ToStr) {
|
TEST_F(UnaryMethodExpressionTest, ToStr) {
|
||||||
std::vector<std::unique_ptr<Expression>> params;
|
ExpressionList params;
|
||||||
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
params.push_back(std::make_unique<IdentifierExpression>("ident"));
|
||||||
|
|
||||||
UnaryMethodExpression u(UnaryMethod::kAll, std::move(params));
|
UnaryMethodExpression u(UnaryMethod::kAll, std::move(params));
|
||||||
|
|
|
@ -20,12 +20,12 @@ namespace ast {
|
||||||
UnlessStatement::UnlessStatement() : Statement() {}
|
UnlessStatement::UnlessStatement() : Statement() {}
|
||||||
|
|
||||||
UnlessStatement::UnlessStatement(std::unique_ptr<Expression> condition,
|
UnlessStatement::UnlessStatement(std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
: Statement(), condition_(std::move(condition)), body_(std::move(body)) {}
|
||||||
|
|
||||||
UnlessStatement::UnlessStatement(const Source& source,
|
UnlessStatement::UnlessStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body)
|
StatementList body)
|
||||||
: Statement(source),
|
: Statement(source),
|
||||||
condition_(std::move(condition)),
|
condition_(std::move(condition)),
|
||||||
body_(std::move(body)) {}
|
body_(std::move(body)) {}
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/statement.h"
|
#include "src/ast/statement.h"
|
||||||
|
@ -33,15 +32,14 @@ class UnlessStatement : public Statement {
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param condition the condition expression
|
/// @param condition the condition expression
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
UnlessStatement(std::unique_ptr<Expression> condition,
|
UnlessStatement(std::unique_ptr<Expression> condition, StatementList body);
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// @param source the unless statement source
|
/// @param source the unless statement source
|
||||||
/// @param condition the condition expression
|
/// @param condition the condition expression
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
UnlessStatement(const Source& source,
|
UnlessStatement(const Source& source,
|
||||||
std::unique_ptr<Expression> condition,
|
std::unique_ptr<Expression> condition,
|
||||||
std::vector<std::unique_ptr<Statement>> body);
|
StatementList body);
|
||||||
/// Move constructor
|
/// Move constructor
|
||||||
UnlessStatement(UnlessStatement&&) = default;
|
UnlessStatement(UnlessStatement&&) = default;
|
||||||
~UnlessStatement() override;
|
~UnlessStatement() override;
|
||||||
|
@ -56,11 +54,9 @@ class UnlessStatement : public Statement {
|
||||||
|
|
||||||
/// Sets the body statements
|
/// Sets the body statements
|
||||||
/// @param body the body statements
|
/// @param body the body statements
|
||||||
void set_body(std::vector<std::unique_ptr<Statement>> body) {
|
void set_body(StatementList body) { body_ = std::move(body); }
|
||||||
body_ = std::move(body);
|
|
||||||
}
|
|
||||||
/// @returns the body statements
|
/// @returns the body statements
|
||||||
const std::vector<std::unique_ptr<Statement>>& body() const { return body_; }
|
const StatementList& body() const { return body_; }
|
||||||
|
|
||||||
/// @returns true if this is an unless statement
|
/// @returns true if this is an unless statement
|
||||||
bool IsUnless() const override { return true; }
|
bool IsUnless() const override { return true; }
|
||||||
|
@ -77,7 +73,7 @@ class UnlessStatement : public Statement {
|
||||||
UnlessStatement(const UnlessStatement&) = delete;
|
UnlessStatement(const UnlessStatement&) = delete;
|
||||||
|
|
||||||
std::unique_ptr<Expression> condition_;
|
std::unique_ptr<Expression> condition_;
|
||||||
std::vector<std::unique_ptr<Statement>> body_;
|
StatementList body_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
|
|
|
@ -27,7 +27,7 @@ using UnlessStatementTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, Creation) {
|
TEST_F(UnlessStatementTest, Creation) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
auto ident_ptr = ident.get();
|
auto ident_ptr = ident.get();
|
||||||
|
@ -41,7 +41,7 @@ TEST_F(UnlessStatementTest, Creation) {
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, Creation_WithSource) {
|
TEST_F(UnlessStatementTest, Creation_WithSource) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
UnlessStatement u(Source{20, 2}, std::move(ident), std::move(body));
|
UnlessStatement u(Source{20, 2}, std::move(ident), std::move(body));
|
||||||
|
@ -57,7 +57,7 @@ TEST_F(UnlessStatementTest, IsUnless) {
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, IsValid) {
|
TEST_F(UnlessStatementTest, IsValid) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
UnlessStatement u(std::move(ident), std::move(body));
|
UnlessStatement u(std::move(ident), std::move(body));
|
||||||
|
@ -65,7 +65,7 @@ TEST_F(UnlessStatementTest, IsValid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, IsValid_NullCondition) {
|
TEST_F(UnlessStatementTest, IsValid_NullCondition) {
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
UnlessStatement u;
|
UnlessStatement u;
|
||||||
|
@ -75,7 +75,7 @@ TEST_F(UnlessStatementTest, IsValid_NullCondition) {
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, IsValid_InvalidCondition) {
|
TEST_F(UnlessStatementTest, IsValid_InvalidCondition) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("");
|
auto ident = std::make_unique<IdentifierExpression>("");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
UnlessStatement u(std::move(ident), std::move(body));
|
UnlessStatement u(std::move(ident), std::move(body));
|
||||||
|
@ -84,7 +84,7 @@ TEST_F(UnlessStatementTest, IsValid_InvalidCondition) {
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, IsValid_NullBodyStatement) {
|
TEST_F(UnlessStatementTest, IsValid_NullBodyStatement) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
body.push_back(nullptr);
|
body.push_back(nullptr);
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ TEST_F(UnlessStatementTest, IsValid_NullBodyStatement) {
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, IsValid_InvalidBodyStatement) {
|
TEST_F(UnlessStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
body.push_back(std::make_unique<IfStatement>());
|
body.push_back(std::make_unique<IfStatement>());
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ TEST_F(UnlessStatementTest, IsValid_InvalidBodyStatement) {
|
||||||
|
|
||||||
TEST_F(UnlessStatementTest, ToStr) {
|
TEST_F(UnlessStatementTest, ToStr) {
|
||||||
auto ident = std::make_unique<IdentifierExpression>("ident");
|
auto ident = std::make_unique<IdentifierExpression>("ident");
|
||||||
std::vector<std::unique_ptr<Statement>> body;
|
StatementList body;
|
||||||
body.push_back(std::make_unique<NopStatement>());
|
body.push_back(std::make_unique<NopStatement>());
|
||||||
|
|
||||||
UnlessStatement u(std::move(ident), std::move(body));
|
UnlessStatement u(std::move(ident), std::move(body));
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "src/ast/expression.h"
|
#include "src/ast/expression.h"
|
||||||
#include "src/ast/node.h"
|
#include "src/ast/node.h"
|
||||||
|
@ -170,6 +171,9 @@ class Variable : public Node {
|
||||||
std::unique_ptr<Expression> constructor_;
|
std::unique_ptr<Expression> constructor_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique variables
|
||||||
|
using VariableList = std::vector<std::unique_ptr<Variable>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,10 @@
|
||||||
#ifndef SRC_AST_VARIABLE_DECORATION_H_
|
#ifndef SRC_AST_VARIABLE_DECORATION_H_
|
||||||
#define SRC_AST_VARIABLE_DECORATION_H_
|
#define SRC_AST_VARIABLE_DECORATION_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace ast {
|
namespace ast {
|
||||||
|
@ -57,6 +59,9 @@ class VariableDecoration {
|
||||||
VariableDecoration();
|
VariableDecoration();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A list of unique variable decorations
|
||||||
|
using VariableDecorationList = std::vector<std::unique_ptr<VariableDecoration>>;
|
||||||
|
|
||||||
} // namespace ast
|
} // namespace ast
|
||||||
} // namespace tint
|
} // namespace tint
|
||||||
|
|
||||||
|
|
|
@ -549,7 +549,7 @@ ast::type::Type* ParserImpl::ConvertType(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute members
|
// Compute members
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> ast_members;
|
ast::StructMemberList ast_members;
|
||||||
const auto members = struct_ty->element_types();
|
const auto members = struct_ty->element_types();
|
||||||
for (uint32_t member_index = 0; member_index < members.size();
|
for (uint32_t member_index = 0; member_index < members.size();
|
||||||
++member_index) {
|
++member_index) {
|
||||||
|
@ -558,8 +558,7 @@ ast::type::Type* ParserImpl::ConvertType(
|
||||||
// Already emitted diagnostics.
|
// Already emitted diagnostics.
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>>
|
ast::StructMemberDecorationList ast_member_decorations;
|
||||||
ast_member_decorations;
|
|
||||||
for (auto& deco : GetDecorationsForMember(type_id, member_index)) {
|
for (auto& deco : GetDecorationsForMember(type_id, member_index)) {
|
||||||
auto ast_member_decoration = ConvertMemberDecoration(deco);
|
auto ast_member_decoration = ConvertMemberDecoration(deco);
|
||||||
if (ast_member_decoration == nullptr) {
|
if (ast_member_decoration == nullptr) {
|
||||||
|
@ -710,7 +709,7 @@ std::unique_ptr<ast::Variable> ParserImpl::MakeVariable(uint32_t id,
|
||||||
|
|
||||||
auto ast_var = std::make_unique<ast::Variable>(Name(id), sc, type);
|
auto ast_var = std::make_unique<ast::Variable>(Name(id), sc, type);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>> ast_decorations;
|
ast::VariableDecorationList ast_decorations;
|
||||||
for (auto& deco : GetDecorationsFor(id)) {
|
for (auto& deco : GetDecorationsFor(id)) {
|
||||||
if (deco.empty()) {
|
if (deco.empty()) {
|
||||||
Fail() << "malformed decoration on ID " << id << ": it is empty";
|
Fail() << "malformed decoration on ID " << id << ": it is empty";
|
||||||
|
@ -774,7 +773,7 @@ bool ParserImpl::EmitFunction(const spvtools::opt::Function& f) {
|
||||||
<< f.result_id();
|
<< f.result_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Variable>> ast_params;
|
ast::VariableList ast_params;
|
||||||
f.ForEachParam([this, &ast_params](const spvtools::opt::Instruction* param) {
|
f.ForEachParam([this, &ast_params](const spvtools::opt::Instruction* param) {
|
||||||
auto* ast_type = ConvertType(param->type_id());
|
auto* ast_type = ConvertType(param->type_id());
|
||||||
if (ast_type != nullptr) {
|
if (ast_type != nullptr) {
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "src/reader/wgsl/parser_impl.h"
|
#include "src/reader/wgsl/parser_impl.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "src/ast/array_accessor_expression.h"
|
#include "src/ast/array_accessor_expression.h"
|
||||||
#include "src/ast/as_expression.h"
|
#include "src/ast/as_expression.h"
|
||||||
|
@ -396,9 +397,8 @@ std::unique_ptr<ast::Variable> ParserImpl::global_constant_decl() {
|
||||||
|
|
||||||
// variable_decoration_list
|
// variable_decoration_list
|
||||||
// : ATTR_LEFT variable_decoration (COMMA variable_decoration)* ATTR_RIGHT
|
// : ATTR_LEFT variable_decoration (COMMA variable_decoration)* ATTR_RIGHT
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>>
|
ast::VariableDecorationList ParserImpl::variable_decoration_list() {
|
||||||
ParserImpl::variable_decoration_list() {
|
ast::VariableDecorationList decos;
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>> decos;
|
|
||||||
|
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (!t.IsAttrLeft())
|
if (!t.IsAttrLeft())
|
||||||
|
@ -1045,7 +1045,7 @@ ast::StructDecoration ParserImpl::struct_decoration() {
|
||||||
|
|
||||||
// struct_body_decl
|
// struct_body_decl
|
||||||
// : BRACKET_LEFT struct_member* BRACKET_RIGHT
|
// : BRACKET_LEFT struct_member* BRACKET_RIGHT
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> ParserImpl::struct_body_decl() {
|
ast::StructMemberList ParserImpl::struct_body_decl() {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (!t.IsBracketLeft())
|
if (!t.IsBracketLeft())
|
||||||
return {};
|
return {};
|
||||||
|
@ -1056,7 +1056,7 @@ std::vector<std::unique_ptr<ast::StructMember>> ParserImpl::struct_body_decl() {
|
||||||
if (t.IsBracketRight())
|
if (t.IsBracketRight())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> members;
|
ast::StructMemberList members;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
auto mem = struct_member();
|
auto mem = struct_member();
|
||||||
if (has_error())
|
if (has_error())
|
||||||
|
@ -1116,8 +1116,7 @@ std::unique_ptr<ast::StructMember> ParserImpl::struct_member() {
|
||||||
// :
|
// :
|
||||||
// | ATTR_LEFT (struct_member_decoration COMMA)*
|
// | ATTR_LEFT (struct_member_decoration COMMA)*
|
||||||
// struct_member_decoration ATTR_RIGHT
|
// struct_member_decoration ATTR_RIGHT
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>>
|
ast::StructMemberDecorationList ParserImpl::struct_member_decoration_decl() {
|
||||||
ParserImpl::struct_member_decoration_decl() {
|
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (!t.IsAttrLeft())
|
if (!t.IsAttrLeft())
|
||||||
return {};
|
return {};
|
||||||
|
@ -1130,7 +1129,7 @@ ParserImpl::struct_member_decoration_decl() {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> decos;
|
ast::StructMemberDecorationList decos;
|
||||||
bool found_offset = false;
|
bool found_offset = false;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
auto deco = struct_member_decoration();
|
auto deco = struct_member_decoration();
|
||||||
|
@ -1266,11 +1265,11 @@ std::unique_ptr<ast::Function> ParserImpl::function_header() {
|
||||||
// param_list
|
// param_list
|
||||||
// :
|
// :
|
||||||
// | (variable_ident_decl COMMA)* variable_ident_decl
|
// | (variable_ident_decl COMMA)* variable_ident_decl
|
||||||
std::vector<std::unique_ptr<ast::Variable>> ParserImpl::param_list() {
|
ast::VariableList ParserImpl::param_list() {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
auto source = t.source();
|
auto source = t.source();
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Variable>> ret;
|
ast::VariableList ret;
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
ast::type::Type* type;
|
ast::type::Type* type;
|
||||||
|
@ -1380,7 +1379,7 @@ ast::PipelineStage ParserImpl::pipeline_stage() {
|
||||||
|
|
||||||
// body_stmt
|
// body_stmt
|
||||||
// : BRACKET_LEFT statements BRACKET_RIGHT
|
// : BRACKET_LEFT statements BRACKET_RIGHT
|
||||||
std::vector<std::unique_ptr<ast::Statement>> ParserImpl::body_stmt() {
|
ast::StatementList ParserImpl::body_stmt() {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (!t.IsBracketLeft())
|
if (!t.IsBracketLeft())
|
||||||
return {};
|
return {};
|
||||||
|
@ -1429,8 +1428,8 @@ std::unique_ptr<ast::Expression> ParserImpl::paren_rhs_stmt() {
|
||||||
|
|
||||||
// statements
|
// statements
|
||||||
// : statement*
|
// : statement*
|
||||||
std::vector<std::unique_ptr<ast::Statement>> ParserImpl::statements() {
|
ast::StatementList ParserImpl::statements() {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> ret;
|
ast::StatementList ret;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
auto stmt = statement();
|
auto stmt = statement();
|
||||||
|
@ -1782,12 +1781,12 @@ std::unique_ptr<ast::IfStatement> ParserImpl::if_stmt() {
|
||||||
|
|
||||||
// elseif_stmt
|
// elseif_stmt
|
||||||
// : ELSE_IF paren_rhs_stmt body_stmt elseif_stmt?
|
// : ELSE_IF paren_rhs_stmt body_stmt elseif_stmt?
|
||||||
std::vector<std::unique_ptr<ast::ElseStatement>> ParserImpl::elseif_stmt() {
|
ast::ElseStatementList ParserImpl::elseif_stmt() {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (!t.IsElseIf())
|
if (!t.IsElseIf())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::ElseStatement>> ret;
|
ast::ElseStatementList ret;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
auto source = t.source();
|
auto source = t.source();
|
||||||
next(); // Consume the peek
|
next(); // Consume the peek
|
||||||
|
@ -1846,7 +1845,7 @@ std::unique_ptr<ast::ElseStatement> ParserImpl::else_stmt() {
|
||||||
|
|
||||||
// premerge_stmt
|
// premerge_stmt
|
||||||
// : PREMERGE body_stmt
|
// : PREMERGE body_stmt
|
||||||
std::vector<std::unique_ptr<ast::Statement>> ParserImpl::premerge_stmt() {
|
ast::StatementList ParserImpl::premerge_stmt() {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (!t.IsPremerge())
|
if (!t.IsPremerge())
|
||||||
return {};
|
return {};
|
||||||
|
@ -1931,7 +1930,7 @@ std::unique_ptr<ast::SwitchStatement> ParserImpl::switch_stmt() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::CaseStatement>> body;
|
ast::CaseStatementList body;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
auto stmt = switch_body();
|
auto stmt = switch_body();
|
||||||
if (has_error())
|
if (has_error())
|
||||||
|
@ -2006,8 +2005,8 @@ std::unique_ptr<ast::CaseStatement> ParserImpl::switch_body() {
|
||||||
// :
|
// :
|
||||||
// | statement case_body
|
// | statement case_body
|
||||||
// | FALLTHROUGH SEMICOLON
|
// | FALLTHROUGH SEMICOLON
|
||||||
std::vector<std::unique_ptr<ast::Statement>> ParserImpl::case_body() {
|
ast::StatementList ParserImpl::case_body() {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> ret;
|
ast::StatementList ret;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (t.IsFallthrough()) {
|
if (t.IsFallthrough()) {
|
||||||
|
@ -2072,7 +2071,7 @@ std::unique_ptr<ast::LoopStatement> ParserImpl::loop_stmt() {
|
||||||
|
|
||||||
// continuing_stmt
|
// continuing_stmt
|
||||||
// : CONTINUING body_stmt
|
// : CONTINUING body_stmt
|
||||||
std::vector<std::unique_ptr<ast::Statement>> ParserImpl::continuing_stmt() {
|
ast::StatementList ParserImpl::continuing_stmt() {
|
||||||
auto t = peek();
|
auto t = peek();
|
||||||
if (!t.IsContinuing())
|
if (!t.IsContinuing())
|
||||||
return {};
|
return {};
|
||||||
|
@ -2148,7 +2147,7 @@ std::unique_ptr<ast::ConstructorExpression> ParserImpl::const_expr() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> params;
|
ast::ExpressionList params;
|
||||||
auto param = const_expr();
|
auto param = const_expr();
|
||||||
if (has_error())
|
if (has_error())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -2313,8 +2312,7 @@ std::unique_ptr<ast::Expression> ParserImpl::primary_expression() {
|
||||||
|
|
||||||
// argument_expression_list
|
// argument_expression_list
|
||||||
// : (logical_or_expression COMMA)* logical_or_expression
|
// : (logical_or_expression COMMA)* logical_or_expression
|
||||||
std::vector<std::unique_ptr<ast::Expression>>
|
ast::ExpressionList ParserImpl::argument_expression_list() {
|
||||||
ParserImpl::argument_expression_list() {
|
|
||||||
auto arg = logical_or_expression();
|
auto arg = logical_or_expression();
|
||||||
if (has_error())
|
if (has_error())
|
||||||
return {};
|
return {};
|
||||||
|
@ -2323,7 +2321,7 @@ ParserImpl::argument_expression_list() {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> ret;
|
ast::ExpressionList ret;
|
||||||
ret.push_back(std::move(arg));
|
ret.push_back(std::move(arg));
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -2379,7 +2377,7 @@ std::unique_ptr<ast::Expression> ParserImpl::postfix_expr(
|
||||||
next(); // Consume the peek
|
next(); // Consume the peek
|
||||||
|
|
||||||
t = peek();
|
t = peek();
|
||||||
std::vector<std::unique_ptr<ast::Expression>> params;
|
ast::ExpressionList params;
|
||||||
if (!t.IsParenRight() && !t.IsEof()) {
|
if (!t.IsParenRight() && !t.IsEof()) {
|
||||||
params = argument_expression_list();
|
params = argument_expression_list();
|
||||||
if (has_error())
|
if (has_error())
|
||||||
|
@ -2501,7 +2499,7 @@ std::unique_ptr<ast::Expression> ParserImpl::unary_expression() {
|
||||||
set_error(t, "missing identifier for method call");
|
set_error(t, "missing identifier for method call");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
std::vector<std::unique_ptr<ast::Expression>> ident;
|
ast::ExpressionList ident;
|
||||||
ident.push_back(
|
ident.push_back(
|
||||||
std::make_unique<ast::IdentifierExpression>(source, t.to_str()));
|
std::make_unique<ast::IdentifierExpression>(source, t.to_str()));
|
||||||
|
|
||||||
|
@ -2531,7 +2529,7 @@ std::unique_ptr<ast::Expression> ParserImpl::unary_expression() {
|
||||||
set_error(t, "missing identifier for method call");
|
set_error(t, "missing identifier for method call");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
std::vector<std::unique_ptr<ast::Expression>> ident;
|
ast::ExpressionList ident;
|
||||||
ident.push_back(
|
ident.push_back(
|
||||||
std::make_unique<ast::IdentifierExpression>(source, t.to_str()));
|
std::make_unique<ast::IdentifierExpression>(source, t.to_str()));
|
||||||
|
|
||||||
|
|
|
@ -20,12 +20,12 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/assignment_statement.h"
|
#include "src/ast/assignment_statement.h"
|
||||||
#include "src/ast/builtin.h"
|
#include "src/ast/builtin.h"
|
||||||
#include "src/ast/constructor_expression.h"
|
#include "src/ast/constructor_expression.h"
|
||||||
#include "src/ast/derivative_modifier.h"
|
#include "src/ast/derivative_modifier.h"
|
||||||
|
#include "src/ast/else_statement.h"
|
||||||
#include "src/ast/entry_point.h"
|
#include "src/ast/entry_point.h"
|
||||||
#include "src/ast/function.h"
|
#include "src/ast/function.h"
|
||||||
#include "src/ast/import.h"
|
#include "src/ast/import.h"
|
||||||
|
@ -113,9 +113,8 @@ class ParserImpl {
|
||||||
/// @returns the const object or nullptr
|
/// @returns the const object or nullptr
|
||||||
std::unique_ptr<ast::Variable> global_constant_decl();
|
std::unique_ptr<ast::Variable> global_constant_decl();
|
||||||
/// Parses a `variable_decoration_list` grammar element
|
/// Parses a `variable_decoration_list` grammar element
|
||||||
/// @returns a vector of parsed variable decorations
|
/// @returns the parsed variable decorations
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>>
|
ast::VariableDecorationList variable_decoration_list();
|
||||||
variable_decoration_list();
|
|
||||||
/// Parses a `variable_decoration` grammar element
|
/// Parses a `variable_decoration` grammar element
|
||||||
/// @returns the variable decoration or nullptr if an error is encountered
|
/// @returns the variable decoration or nullptr if an error is encountered
|
||||||
std::unique_ptr<ast::VariableDecoration> variable_decoration();
|
std::unique_ptr<ast::VariableDecoration> variable_decoration();
|
||||||
|
@ -152,14 +151,13 @@ class ParserImpl {
|
||||||
ast::StructDecoration struct_decoration();
|
ast::StructDecoration struct_decoration();
|
||||||
/// Parses a `struct_body_decl` grammar element
|
/// Parses a `struct_body_decl` grammar element
|
||||||
/// @returns the struct members
|
/// @returns the struct members
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> struct_body_decl();
|
ast::StructMemberList struct_body_decl();
|
||||||
/// Parses a `struct_member` grammar element
|
/// Parses a `struct_member` grammar element
|
||||||
/// @returns the struct member or nullptr
|
/// @returns the struct member or nullptr
|
||||||
std::unique_ptr<ast::StructMember> struct_member();
|
std::unique_ptr<ast::StructMember> struct_member();
|
||||||
/// Parses a `struct_member_decoration_decl` grammar element
|
/// Parses a `struct_member_decoration_decl` grammar element
|
||||||
/// @returns the list of decorations
|
/// @returns the list of decorations
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>>
|
ast::StructMemberDecorationList struct_member_decoration_decl();
|
||||||
struct_member_decoration_decl();
|
|
||||||
/// Parses a `struct_member_decoration` grammar element
|
/// Parses a `struct_member_decoration` grammar element
|
||||||
/// @returns the decoration or nullptr if none found
|
/// @returns the decoration or nullptr if none found
|
||||||
std::unique_ptr<ast::StructMemberDecoration> struct_member_decoration();
|
std::unique_ptr<ast::StructMemberDecoration> struct_member_decoration();
|
||||||
|
@ -174,7 +172,7 @@ class ParserImpl {
|
||||||
std::unique_ptr<ast::Function> function_header();
|
std::unique_ptr<ast::Function> function_header();
|
||||||
/// Parses a `param_list` grammar element
|
/// Parses a `param_list` grammar element
|
||||||
/// @returns the parsed variables
|
/// @returns the parsed variables
|
||||||
std::vector<std::unique_ptr<ast::Variable>> param_list();
|
ast::VariableList param_list();
|
||||||
/// Parses a `entry_point_decl` grammar element
|
/// Parses a `entry_point_decl` grammar element
|
||||||
/// @returns the EntryPoint or nullptr on error
|
/// @returns the EntryPoint or nullptr on error
|
||||||
std::unique_ptr<ast::EntryPoint> entry_point_decl();
|
std::unique_ptr<ast::EntryPoint> entry_point_decl();
|
||||||
|
@ -183,13 +181,13 @@ class ParserImpl {
|
||||||
ast::PipelineStage pipeline_stage();
|
ast::PipelineStage pipeline_stage();
|
||||||
/// Parses a `body_stmt` grammar element
|
/// Parses a `body_stmt` grammar element
|
||||||
/// @returns the parsed statements
|
/// @returns the parsed statements
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body_stmt();
|
ast::StatementList body_stmt();
|
||||||
/// Parses a `paren_rhs_stmt` grammar element
|
/// Parses a `paren_rhs_stmt` grammar element
|
||||||
/// @returns the parsed element or nullptr
|
/// @returns the parsed element or nullptr
|
||||||
std::unique_ptr<ast::Expression> paren_rhs_stmt();
|
std::unique_ptr<ast::Expression> paren_rhs_stmt();
|
||||||
/// Parses a `statements` grammar element
|
/// Parses a `statements` grammar element
|
||||||
/// @returns the statements parsed
|
/// @returns the statements parsed
|
||||||
std::vector<std::unique_ptr<ast::Statement>> statements();
|
ast::StatementList statements();
|
||||||
/// Parses a `statement` grammar element
|
/// Parses a `statement` grammar element
|
||||||
/// @returns the parsed statement or nullptr
|
/// @returns the parsed statement or nullptr
|
||||||
std::unique_ptr<ast::Statement> statement();
|
std::unique_ptr<ast::Statement> statement();
|
||||||
|
@ -207,13 +205,13 @@ class ParserImpl {
|
||||||
std::unique_ptr<ast::IfStatement> if_stmt();
|
std::unique_ptr<ast::IfStatement> if_stmt();
|
||||||
/// Parses a `elseif_stmt` grammar element
|
/// Parses a `elseif_stmt` grammar element
|
||||||
/// @returns the parsed elements
|
/// @returns the parsed elements
|
||||||
std::vector<std::unique_ptr<ast::ElseStatement>> elseif_stmt();
|
ast::ElseStatementList elseif_stmt();
|
||||||
/// Parses a `else_stmt` grammar element
|
/// Parses a `else_stmt` grammar element
|
||||||
/// @returns the parsed statement or nullptr
|
/// @returns the parsed statement or nullptr
|
||||||
std::unique_ptr<ast::ElseStatement> else_stmt();
|
std::unique_ptr<ast::ElseStatement> else_stmt();
|
||||||
/// Parses a `premerge_stmt` grammar element
|
/// Parses a `premerge_stmt` grammar element
|
||||||
/// @returns the parsed statements
|
/// @returns the parsed statements
|
||||||
std::vector<std::unique_ptr<ast::Statement>> premerge_stmt();
|
ast::StatementList premerge_stmt();
|
||||||
/// Parses a `unless_stmt` grammar element
|
/// Parses a `unless_stmt` grammar element
|
||||||
/// @returns the parsed element or nullptr
|
/// @returns the parsed element or nullptr
|
||||||
std::unique_ptr<ast::UnlessStatement> unless_stmt();
|
std::unique_ptr<ast::UnlessStatement> unless_stmt();
|
||||||
|
@ -228,13 +226,13 @@ class ParserImpl {
|
||||||
std::unique_ptr<ast::CaseStatement> switch_body();
|
std::unique_ptr<ast::CaseStatement> switch_body();
|
||||||
/// Parses a `case_body` grammar element
|
/// Parses a `case_body` grammar element
|
||||||
/// @returns the parsed statements
|
/// @returns the parsed statements
|
||||||
std::vector<std::unique_ptr<ast::Statement>> case_body();
|
ast::StatementList case_body();
|
||||||
/// Parses a `loop_stmt` grammar element
|
/// Parses a `loop_stmt` grammar element
|
||||||
/// @returns the parsed loop or nullptr
|
/// @returns the parsed loop or nullptr
|
||||||
std::unique_ptr<ast::LoopStatement> loop_stmt();
|
std::unique_ptr<ast::LoopStatement> loop_stmt();
|
||||||
/// Parses a `continuing_stmt` grammar element
|
/// Parses a `continuing_stmt` grammar element
|
||||||
/// @returns the parsed statements
|
/// @returns the parsed statements
|
||||||
std::vector<std::unique_ptr<ast::Statement>> continuing_stmt();
|
ast::StatementList continuing_stmt();
|
||||||
/// Parses a `const_literal` grammar element
|
/// Parses a `const_literal` grammar element
|
||||||
/// @returns the const literal parsed or nullptr if none found
|
/// @returns the const literal parsed or nullptr if none found
|
||||||
std::unique_ptr<ast::Literal> const_literal();
|
std::unique_ptr<ast::Literal> const_literal();
|
||||||
|
@ -246,7 +244,7 @@ class ParserImpl {
|
||||||
std::unique_ptr<ast::Expression> primary_expression();
|
std::unique_ptr<ast::Expression> primary_expression();
|
||||||
/// Parses a `argument_expression_list` grammar element
|
/// Parses a `argument_expression_list` grammar element
|
||||||
/// @returns the list of arguments
|
/// @returns the list of arguments
|
||||||
std::vector<std::unique_ptr<ast::Expression>> argument_expression_list();
|
ast::ExpressionList argument_expression_list();
|
||||||
/// Parses the recursive portion of the postfix_expression
|
/// Parses the recursive portion of the postfix_expression
|
||||||
/// @param prefix the left side of the expression
|
/// @param prefix the left side of the expression
|
||||||
/// @returns the parsed expression or nullptr
|
/// @returns the parsed expression or nullptr
|
||||||
|
|
|
@ -51,7 +51,7 @@ TEST_F(BuilderTest, Constructor_Type) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
@ -77,7 +77,7 @@ TEST_F(BuilderTest, Constructor_Type_Dedups) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
@ -103,7 +103,7 @@ TEST_F(BuilderTest, Constructor_NonConst_Type_Fails) {
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(
|
std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::move(rel));
|
vals.push_back(std::move(rel));
|
||||||
|
|
|
@ -62,7 +62,7 @@ TEST_F(BuilderTest, FunctionVar_WithConstantConstructor) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
@ -109,7 +109,7 @@ TEST_F(BuilderTest, DISABLED_FunctionVar_WithNonConstantConstructor) {
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(
|
std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::move(rel));
|
vals.push_back(std::move(rel));
|
||||||
|
@ -147,7 +147,7 @@ TEST_F(BuilderTest, FunctionVar_Const) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
|
|
@ -71,7 +71,7 @@ TEST_F(BuilderTest, GlobalVar_WithConstructor) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
@ -105,7 +105,7 @@ TEST_F(BuilderTest, GlobalVar_Const) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
@ -136,7 +136,7 @@ TEST_F(BuilderTest, GlobalVar_WithLocation) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
auto v =
|
auto v =
|
||||||
std::make_unique<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
|
std::make_unique<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>> decos;
|
ast::VariableDecorationList decos;
|
||||||
decos.push_back(std::make_unique<ast::LocationDecoration>(5));
|
decos.push_back(std::make_unique<ast::LocationDecoration>(5));
|
||||||
|
|
||||||
ast::DecoratedVariable dv(std::move(v));
|
ast::DecoratedVariable dv(std::move(v));
|
||||||
|
@ -157,7 +157,7 @@ TEST_F(BuilderTest, GlobalVar_WithBindingAndSet) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
auto v =
|
auto v =
|
||||||
std::make_unique<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
|
std::make_unique<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>> decos;
|
ast::VariableDecorationList decos;
|
||||||
decos.push_back(std::make_unique<ast::BindingDecoration>(2));
|
decos.push_back(std::make_unique<ast::BindingDecoration>(2));
|
||||||
decos.push_back(std::make_unique<ast::SetDecoration>(3));
|
decos.push_back(std::make_unique<ast::SetDecoration>(3));
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ TEST_F(BuilderTest, GlobalVar_WithBuiltin) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
auto v =
|
auto v =
|
||||||
std::make_unique<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
|
std::make_unique<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>> decos;
|
ast::VariableDecorationList decos;
|
||||||
decos.push_back(
|
decos.push_back(
|
||||||
std::make_unique<ast::BuiltinDecoration>(ast::Builtin::kPosition));
|
std::make_unique<ast::BuiltinDecoration>(ast::Builtin::kPosition));
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ TEST_F(BuilderTest, IdentifierExpression_GlobalConst) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
@ -87,7 +87,7 @@ TEST_F(BuilderTest, IdentifierExpression_FunctionConst) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
|
|
@ -47,7 +47,7 @@ TEST_F(BuilderTest, Return_WithValue) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> vals;
|
ast::ExpressionList vals;
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||||
|
|
|
@ -277,8 +277,8 @@ TEST_F(BuilderTest_Type, GenerateStruct_Empty) {
|
||||||
TEST_F(BuilderTest_Type, GenerateStruct) {
|
TEST_F(BuilderTest_Type, GenerateStruct) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> decos;
|
ast::StructMemberDecorationList decos;
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> members;
|
ast::StructMemberList members;
|
||||||
members.push_back(
|
members.push_back(
|
||||||
std::make_unique<ast::StructMember>("a", &f32, std::move(decos)));
|
std::make_unique<ast::StructMember>("a", &f32, std::move(decos)));
|
||||||
|
|
||||||
|
@ -303,8 +303,8 @@ OpMemberName %1 0 "a"
|
||||||
TEST_F(BuilderTest_Type, GenerateStruct_Decorated) {
|
TEST_F(BuilderTest_Type, GenerateStruct_Decorated) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> decos;
|
ast::StructMemberDecorationList decos;
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> members;
|
ast::StructMemberList members;
|
||||||
members.push_back(
|
members.push_back(
|
||||||
std::make_unique<ast::StructMember>("a", &f32, std::move(decos)));
|
std::make_unique<ast::StructMember>("a", &f32, std::move(decos)));
|
||||||
|
|
||||||
|
@ -331,12 +331,12 @@ OpMemberName %1 0 "a"
|
||||||
TEST_F(BuilderTest_Type, GenerateStruct_DecoratedMembers) {
|
TEST_F(BuilderTest_Type, GenerateStruct_DecoratedMembers) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> a_decos;
|
ast::StructMemberDecorationList a_decos;
|
||||||
a_decos.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(0));
|
a_decos.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(0));
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> b_decos;
|
ast::StructMemberDecorationList b_decos;
|
||||||
b_decos.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(8));
|
b_decos.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(8));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> members;
|
ast::StructMemberList members;
|
||||||
members.push_back(
|
members.push_back(
|
||||||
std::make_unique<ast::StructMember>("a", &f32, std::move(a_decos)));
|
std::make_unique<ast::StructMember>("a", &f32, std::move(a_decos)));
|
||||||
members.push_back(
|
members.push_back(
|
||||||
|
|
|
@ -690,8 +690,7 @@ bool GeneratorImpl::EmitUnaryOp(ast::UnaryOpExpression* expr) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitStatementBlock(
|
bool GeneratorImpl::EmitStatementBlock(const ast::StatementList& statements) {
|
||||||
const std::vector<std::unique_ptr<ast::Statement>>& statements) {
|
|
||||||
out_ << " {" << std::endl;
|
out_ << " {" << std::endl;
|
||||||
|
|
||||||
increment_indent();
|
increment_indent();
|
||||||
|
@ -710,7 +709,7 @@ bool GeneratorImpl::EmitStatementBlock(
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitStatementBlockAndNewline(
|
bool GeneratorImpl::EmitStatementBlockAndNewline(
|
||||||
const std::vector<std::unique_ptr<ast::Statement>>& statements) {
|
const ast::StatementList& statements) {
|
||||||
const bool result = EmitStatementBlock(statements);
|
const bool result = EmitStatementBlock(statements);
|
||||||
if (result) {
|
if (result) {
|
||||||
out_ << std::endl;
|
out_ << std::endl;
|
||||||
|
|
|
@ -15,10 +15,8 @@
|
||||||
#ifndef SRC_WRITER_WGSL_GENERATOR_IMPL_H_
|
#ifndef SRC_WRITER_WGSL_GENERATOR_IMPL_H_
|
||||||
#define SRC_WRITER_WGSL_GENERATOR_IMPL_H_
|
#define SRC_WRITER_WGSL_GENERATOR_IMPL_H_
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "src/ast/array_accessor_expression.h"
|
#include "src/ast/array_accessor_expression.h"
|
||||||
#include "src/ast/constructor_expression.h"
|
#include "src/ast/constructor_expression.h"
|
||||||
|
@ -179,13 +177,11 @@ class GeneratorImpl {
|
||||||
/// Handles a brace-enclosed list of statements.
|
/// Handles a brace-enclosed list of statements.
|
||||||
/// @param statements the statements to output
|
/// @param statements the statements to output
|
||||||
/// @returns true if the statements were emitted
|
/// @returns true if the statements were emitted
|
||||||
bool EmitStatementBlock(
|
bool EmitStatementBlock(const ast::StatementList& statements);
|
||||||
const std::vector<std::unique_ptr<ast::Statement>>& statements);
|
|
||||||
/// Handles a brace-enclosed list of statements and trailing newline.
|
/// Handles a brace-enclosed list of statements and trailing newline.
|
||||||
/// @param statements the statements to output
|
/// @param statements the statements to output
|
||||||
/// @returns true if the statements were emitted
|
/// @returns true if the statements were emitted
|
||||||
bool EmitStatementBlockAndNewline(
|
bool EmitStatementBlockAndNewline(const ast::StatementList& statements);
|
||||||
const std::vector<std::unique_ptr<ast::Statement>>& statements);
|
|
||||||
/// Handles statement
|
/// Handles statement
|
||||||
/// @param stmt the statement to emit
|
/// @param stmt the statement to emit
|
||||||
/// @returns true if the statement was emitted
|
/// @returns true if the statement was emitted
|
||||||
|
|
|
@ -43,11 +43,11 @@ TEST_F(GeneratorImplTest, EmitAliasType_Struct) {
|
||||||
ast::type::I32Type i32;
|
ast::type::I32Type i32;
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> members;
|
ast::StructMemberList members;
|
||||||
members.push_back(std::make_unique<ast::StructMember>(
|
members.push_back(std::make_unique<ast::StructMember>(
|
||||||
"a", &f32, std::vector<std::unique_ptr<ast::StructMemberDecoration>>{}));
|
"a", &f32, ast::StructMemberDecorationList{}));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> b_deco;
|
ast::StructMemberDecorationList b_deco;
|
||||||
b_deco.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(4));
|
b_deco.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(4));
|
||||||
members.push_back(
|
members.push_back(
|
||||||
std::make_unique<ast::StructMember>("b", &i32, std::move(b_deco)));
|
std::make_unique<ast::StructMember>("b", &i32, std::move(b_deco)));
|
||||||
|
|
|
@ -37,7 +37,7 @@ TEST_F(GeneratorImplTest, EmitExpression_Call_WithoutParams) {
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, EmitExpression_Call_WithParams) {
|
TEST_F(GeneratorImplTest, EmitExpression_Call_WithParams) {
|
||||||
auto id = std::make_unique<ast::IdentifierExpression>("my_func");
|
auto id = std::make_unique<ast::IdentifierExpression>("my_func");
|
||||||
std::vector<std::unique_ptr<ast::Expression>> params;
|
ast::ExpressionList params;
|
||||||
params.push_back(std::make_unique<ast::IdentifierExpression>("param1"));
|
params.push_back(std::make_unique<ast::IdentifierExpression>("param1"));
|
||||||
params.push_back(std::make_unique<ast::IdentifierExpression>("param2"));
|
params.push_back(std::make_unique<ast::IdentifierExpression>("param2"));
|
||||||
ast::CallExpression call(std::move(id), std::move(params));
|
ast::CallExpression call(std::move(id), std::move(params));
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/break_statement.h"
|
#include "src/ast/break_statement.h"
|
||||||
|
@ -34,7 +33,7 @@ TEST_F(GeneratorImplTest, Emit_Case) {
|
||||||
ast::type::I32Type i32;
|
ast::type::I32Type i32;
|
||||||
auto cond = std::make_unique<ast::IntLiteral>(&i32, 5);
|
auto cond = std::make_unique<ast::IntLiteral>(&i32, 5);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::BreakStatement>());
|
body.push_back(std::make_unique<ast::BreakStatement>());
|
||||||
|
|
||||||
ast::CaseStatement c(std::move(cond), std::move(body));
|
ast::CaseStatement c(std::move(cond), std::move(body));
|
||||||
|
@ -52,7 +51,7 @@ TEST_F(GeneratorImplTest, Emit_Case) {
|
||||||
TEST_F(GeneratorImplTest, Emit_Case_Default) {
|
TEST_F(GeneratorImplTest, Emit_Case_Default) {
|
||||||
ast::CaseStatement c;
|
ast::CaseStatement c;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::BreakStatement>());
|
body.push_back(std::make_unique<ast::BreakStatement>());
|
||||||
|
|
||||||
c.set_body(std::move(body));
|
c.set_body(std::move(body));
|
||||||
|
|
|
@ -12,9 +12,6 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/bool_literal.h"
|
#include "src/ast/bool_literal.h"
|
||||||
#include "src/ast/float_literal.h"
|
#include "src/ast/float_literal.h"
|
||||||
|
@ -81,7 +78,7 @@ TEST_F(GeneratorImplTest, EmitConstructor_Type_Float) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
auto lit = std::make_unique<ast::FloatLiteral>(&f32, -1.2e-5);
|
auto lit = std::make_unique<ast::FloatLiteral>(&f32, -1.2e-5);
|
||||||
std::vector<std::unique_ptr<ast::Expression>> values;
|
ast::ExpressionList values;
|
||||||
values.push_back(
|
values.push_back(
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
||||||
|
|
||||||
|
@ -96,7 +93,7 @@ TEST_F(GeneratorImplTest, EmitConstructor_Type_Bool) {
|
||||||
ast::type::BoolType b;
|
ast::type::BoolType b;
|
||||||
|
|
||||||
auto lit = std::make_unique<ast::BoolLiteral>(&b, true);
|
auto lit = std::make_unique<ast::BoolLiteral>(&b, true);
|
||||||
std::vector<std::unique_ptr<ast::Expression>> values;
|
ast::ExpressionList values;
|
||||||
values.push_back(
|
values.push_back(
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
||||||
|
|
||||||
|
@ -111,7 +108,7 @@ TEST_F(GeneratorImplTest, EmitConstructor_Type_Int) {
|
||||||
ast::type::I32Type i32;
|
ast::type::I32Type i32;
|
||||||
|
|
||||||
auto lit = std::make_unique<ast::IntLiteral>(&i32, -12345);
|
auto lit = std::make_unique<ast::IntLiteral>(&i32, -12345);
|
||||||
std::vector<std::unique_ptr<ast::Expression>> values;
|
ast::ExpressionList values;
|
||||||
values.push_back(
|
values.push_back(
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
||||||
|
|
||||||
|
@ -126,7 +123,7 @@ TEST_F(GeneratorImplTest, EmitConstructor_Type_Uint) {
|
||||||
ast::type::U32Type u32;
|
ast::type::U32Type u32;
|
||||||
|
|
||||||
auto lit = std::make_unique<ast::UintLiteral>(&u32, 12345);
|
auto lit = std::make_unique<ast::UintLiteral>(&u32, 12345);
|
||||||
std::vector<std::unique_ptr<ast::Expression>> values;
|
ast::ExpressionList values;
|
||||||
values.push_back(
|
values.push_back(
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
|
||||||
|
|
||||||
|
@ -144,7 +141,7 @@ TEST_F(GeneratorImplTest, EmitConstructor_Type_Vec) {
|
||||||
auto lit1 = std::make_unique<ast::FloatLiteral>(&f32, 1.f);
|
auto lit1 = std::make_unique<ast::FloatLiteral>(&f32, 1.f);
|
||||||
auto lit2 = std::make_unique<ast::FloatLiteral>(&f32, 2.f);
|
auto lit2 = std::make_unique<ast::FloatLiteral>(&f32, 2.f);
|
||||||
auto lit3 = std::make_unique<ast::FloatLiteral>(&f32, 3.f);
|
auto lit3 = std::make_unique<ast::FloatLiteral>(&f32, 3.f);
|
||||||
std::vector<std::unique_ptr<ast::Expression>> values;
|
ast::ExpressionList values;
|
||||||
values.push_back(
|
values.push_back(
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
|
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
|
||||||
values.push_back(
|
values.push_back(
|
||||||
|
@ -165,13 +162,13 @@ TEST_F(GeneratorImplTest, EmitConstructor_Type_Mat) {
|
||||||
|
|
||||||
ast::type::VectorType vec(&f32, 2);
|
ast::type::VectorType vec(&f32, 2);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> mat_values;
|
ast::ExpressionList mat_values;
|
||||||
|
|
||||||
for (size_t i = 0; i < 3; i++) {
|
for (size_t i = 0; i < 3; i++) {
|
||||||
auto lit1 = std::make_unique<ast::FloatLiteral>(&f32, 1.f + (i * 2));
|
auto lit1 = std::make_unique<ast::FloatLiteral>(&f32, 1.f + (i * 2));
|
||||||
auto lit2 = std::make_unique<ast::FloatLiteral>(&f32, 2.f + (i * 2));
|
auto lit2 = std::make_unique<ast::FloatLiteral>(&f32, 2.f + (i * 2));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> values;
|
ast::ExpressionList values;
|
||||||
values.push_back(
|
values.push_back(
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
|
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
|
||||||
values.push_back(
|
values.push_back(
|
||||||
|
@ -196,14 +193,14 @@ TEST_F(GeneratorImplTest, EmitConstructor_Type_Array) {
|
||||||
ast::type::VectorType vec(&f32, 3);
|
ast::type::VectorType vec(&f32, 3);
|
||||||
ast::type::ArrayType ary(&vec, 3);
|
ast::type::ArrayType ary(&vec, 3);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> ary_values;
|
ast::ExpressionList ary_values;
|
||||||
|
|
||||||
for (size_t i = 0; i < 3; i++) {
|
for (size_t i = 0; i < 3; i++) {
|
||||||
auto lit1 = std::make_unique<ast::FloatLiteral>(&f32, 1.f + (i * 3));
|
auto lit1 = std::make_unique<ast::FloatLiteral>(&f32, 1.f + (i * 3));
|
||||||
auto lit2 = std::make_unique<ast::FloatLiteral>(&f32, 2.f + (i * 3));
|
auto lit2 = std::make_unique<ast::FloatLiteral>(&f32, 2.f + (i * 3));
|
||||||
auto lit3 = std::make_unique<ast::FloatLiteral>(&f32, 3.f + (i * 3));
|
auto lit3 = std::make_unique<ast::FloatLiteral>(&f32, 3.f + (i * 3));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Expression>> values;
|
ast::ExpressionList values;
|
||||||
values.push_back(
|
values.push_back(
|
||||||
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
|
std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
|
||||||
values.push_back(
|
values.push_back(
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/else_statement.h"
|
#include "src/ast/else_statement.h"
|
||||||
|
@ -29,7 +28,7 @@ namespace {
|
||||||
using GeneratorImplTest = testing::Test;
|
using GeneratorImplTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_Else) {
|
TEST_F(GeneratorImplTest, Emit_Else) {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
ast::ElseStatement e(std::move(body));
|
ast::ElseStatement e(std::move(body));
|
||||||
|
@ -46,7 +45,7 @@ TEST_F(GeneratorImplTest, Emit_Else) {
|
||||||
TEST_F(GeneratorImplTest, Emit_ElseWithCondition) {
|
TEST_F(GeneratorImplTest, Emit_ElseWithCondition) {
|
||||||
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
ast::ElseStatement e(std::move(cond), std::move(body));
|
ast::ElseStatement e(std::move(cond), std::move(body));
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace {
|
||||||
using GeneratorImplTest = testing::Test;
|
using GeneratorImplTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_Function) {
|
TEST_F(GeneratorImplTest, Emit_Function) {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
body.push_back(std::make_unique<ast::ReturnStatement>());
|
body.push_back(std::make_unique<ast::ReturnStatement>());
|
||||||
|
|
||||||
|
@ -50,13 +50,13 @@ TEST_F(GeneratorImplTest, Emit_Function) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_Function_WithParams) {
|
TEST_F(GeneratorImplTest, Emit_Function_WithParams) {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
body.push_back(std::make_unique<ast::ReturnStatement>());
|
body.push_back(std::make_unique<ast::ReturnStatement>());
|
||||||
|
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
ast::type::I32Type i32;
|
ast::type::I32Type i32;
|
||||||
std::vector<std::unique_ptr<ast::Variable>> params;
|
ast::VariableList params;
|
||||||
params.push_back(
|
params.push_back(
|
||||||
std::make_unique<ast::Variable>("a", ast::StorageClass::kNone, &f32));
|
std::make_unique<ast::Variable>("a", ast::StorageClass::kNone, &f32));
|
||||||
params.push_back(
|
params.push_back(
|
||||||
|
|
|
@ -12,9 +12,6 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/else_statement.h"
|
#include "src/ast/else_statement.h"
|
||||||
#include "src/ast/identifier_expression.h"
|
#include "src/ast/identifier_expression.h"
|
||||||
|
@ -31,7 +28,7 @@ using GeneratorImplTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_If) {
|
TEST_F(GeneratorImplTest, Emit_If) {
|
||||||
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
ast::IfStatement i(std::move(cond), std::move(body));
|
ast::IfStatement i(std::move(cond), std::move(body));
|
||||||
|
@ -49,15 +46,15 @@ TEST_F(GeneratorImplTest, Emit_If) {
|
||||||
TEST_F(GeneratorImplTest, Emit_IfWithElseIf) {
|
TEST_F(GeneratorImplTest, Emit_IfWithElseIf) {
|
||||||
auto else_cond = std::make_unique<ast::IdentifierExpression>("else_cond");
|
auto else_cond = std::make_unique<ast::IdentifierExpression>("else_cond");
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> else_body;
|
ast::StatementList else_body;
|
||||||
else_body.push_back(std::make_unique<ast::KillStatement>());
|
else_body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::ElseStatement>> elses;
|
ast::ElseStatementList elses;
|
||||||
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_cond),
|
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_cond),
|
||||||
std::move(else_body)));
|
std::move(else_body)));
|
||||||
|
|
||||||
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
ast::IfStatement i(std::move(cond), std::move(body));
|
ast::IfStatement i(std::move(cond), std::move(body));
|
||||||
|
@ -76,14 +73,14 @@ TEST_F(GeneratorImplTest, Emit_IfWithElseIf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_IfWithElse) {
|
TEST_F(GeneratorImplTest, Emit_IfWithElse) {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> else_body;
|
ast::StatementList else_body;
|
||||||
else_body.push_back(std::make_unique<ast::KillStatement>());
|
else_body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::ElseStatement>> elses;
|
ast::ElseStatementList elses;
|
||||||
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_body)));
|
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_body)));
|
||||||
|
|
||||||
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
ast::IfStatement i(std::move(cond), std::move(body));
|
ast::IfStatement i(std::move(cond), std::move(body));
|
||||||
|
@ -104,19 +101,19 @@ TEST_F(GeneratorImplTest, Emit_IfWithElse) {
|
||||||
TEST_F(GeneratorImplTest, Emit_IfWithMultiple) {
|
TEST_F(GeneratorImplTest, Emit_IfWithMultiple) {
|
||||||
auto else_cond = std::make_unique<ast::IdentifierExpression>("else_cond");
|
auto else_cond = std::make_unique<ast::IdentifierExpression>("else_cond");
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> else_body;
|
ast::StatementList else_body;
|
||||||
else_body.push_back(std::make_unique<ast::KillStatement>());
|
else_body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> else_body_2;
|
ast::StatementList else_body_2;
|
||||||
else_body_2.push_back(std::make_unique<ast::KillStatement>());
|
else_body_2.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::ElseStatement>> elses;
|
ast::ElseStatementList elses;
|
||||||
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_cond),
|
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_cond),
|
||||||
std::move(else_body)));
|
std::move(else_body)));
|
||||||
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_body_2)));
|
elses.push_back(std::make_unique<ast::ElseStatement>(std::move(else_body_2)));
|
||||||
|
|
||||||
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
ast::IfStatement i(std::move(cond), std::move(body));
|
ast::IfStatement i(std::move(cond), std::move(body));
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/kill_statement.h"
|
#include "src/ast/kill_statement.h"
|
||||||
|
@ -29,7 +28,7 @@ namespace {
|
||||||
using GeneratorImplTest = testing::Test;
|
using GeneratorImplTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_Loop) {
|
TEST_F(GeneratorImplTest, Emit_Loop) {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
ast::LoopStatement l(std::move(body), {});
|
ast::LoopStatement l(std::move(body), {});
|
||||||
|
@ -45,10 +44,10 @@ TEST_F(GeneratorImplTest, Emit_Loop) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_LoopWithContinuing) {
|
TEST_F(GeneratorImplTest, Emit_LoopWithContinuing) {
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> continuing;
|
ast::StatementList continuing;
|
||||||
continuing.push_back(std::make_unique<ast::NopStatement>());
|
continuing.push_back(std::make_unique<ast::NopStatement>());
|
||||||
|
|
||||||
ast::LoopStatement l(std::move(body), std::move(continuing));
|
ast::LoopStatement l(std::move(body), std::move(continuing));
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/identifier_expression.h"
|
#include "src/ast/identifier_expression.h"
|
||||||
|
@ -32,7 +31,7 @@ using GeneratorImplTest = testing::Test;
|
||||||
TEST_F(GeneratorImplTest, Emit_Regardless) {
|
TEST_F(GeneratorImplTest, Emit_Regardless) {
|
||||||
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::NopStatement>());
|
body.push_back(std::make_unique<ast::NopStatement>());
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/break_statement.h"
|
#include "src/ast/break_statement.h"
|
||||||
|
@ -33,19 +32,19 @@ using GeneratorImplTest = testing::Test;
|
||||||
|
|
||||||
TEST_F(GeneratorImplTest, Emit_Switch) {
|
TEST_F(GeneratorImplTest, Emit_Switch) {
|
||||||
auto def = std::make_unique<ast::CaseStatement>();
|
auto def = std::make_unique<ast::CaseStatement>();
|
||||||
std::vector<std::unique_ptr<ast::Statement>> def_body;
|
ast::StatementList def_body;
|
||||||
def_body.push_back(std::make_unique<ast::BreakStatement>());
|
def_body.push_back(std::make_unique<ast::BreakStatement>());
|
||||||
def->set_body(std::move(def_body));
|
def->set_body(std::move(def_body));
|
||||||
|
|
||||||
ast::type::I32Type i32;
|
ast::type::I32Type i32;
|
||||||
auto case_val = std::make_unique<ast::IntLiteral>(&i32, 5);
|
auto case_val = std::make_unique<ast::IntLiteral>(&i32, 5);
|
||||||
std::vector<std::unique_ptr<ast::Statement>> case_body;
|
ast::StatementList case_body;
|
||||||
case_body.push_back(std::make_unique<ast::BreakStatement>());
|
case_body.push_back(std::make_unique<ast::BreakStatement>());
|
||||||
|
|
||||||
auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val),
|
auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val),
|
||||||
std::move(case_body));
|
std::move(case_body));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::CaseStatement>> body;
|
ast::CaseStatementList body;
|
||||||
body.push_back(std::move(case_stmt));
|
body.push_back(std::move(case_stmt));
|
||||||
body.push_back(std::move(def));
|
body.push_back(std::move(def));
|
||||||
|
|
||||||
|
|
|
@ -110,11 +110,11 @@ TEST_F(GeneratorImplTest, EmitType_Struct) {
|
||||||
ast::type::I32Type i32;
|
ast::type::I32Type i32;
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> members;
|
ast::StructMemberList members;
|
||||||
members.push_back(std::make_unique<ast::StructMember>(
|
members.push_back(std::make_unique<ast::StructMember>(
|
||||||
"a", &i32, std::vector<std::unique_ptr<ast::StructMemberDecoration>>{}));
|
"a", &i32, ast::StructMemberDecorationList{}));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> b_deco;
|
ast::StructMemberDecorationList b_deco;
|
||||||
b_deco.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(4));
|
b_deco.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(4));
|
||||||
members.push_back(
|
members.push_back(
|
||||||
std::make_unique<ast::StructMember>("b", &f32, std::move(b_deco)));
|
std::make_unique<ast::StructMember>("b", &f32, std::move(b_deco)));
|
||||||
|
@ -136,11 +136,11 @@ TEST_F(GeneratorImplTest, EmitType_Struct_WithDecoration) {
|
||||||
ast::type::I32Type i32;
|
ast::type::I32Type i32;
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMember>> members;
|
ast::StructMemberList members;
|
||||||
members.push_back(std::make_unique<ast::StructMember>(
|
members.push_back(std::make_unique<ast::StructMember>(
|
||||||
"a", &i32, std::vector<std::unique_ptr<ast::StructMemberDecoration>>{}));
|
"a", &i32, ast::StructMemberDecorationList{}));
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::StructMemberDecoration>> b_deco;
|
ast::StructMemberDecorationList b_deco;
|
||||||
b_deco.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(4));
|
b_deco.push_back(std::make_unique<ast::StructMemberOffsetDecoration>(4));
|
||||||
members.push_back(
|
members.push_back(
|
||||||
std::make_unique<ast::StructMember>("b", &f32, std::move(b_deco)));
|
std::make_unique<ast::StructMember>("b", &f32, std::move(b_deco)));
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/identifier_expression.h"
|
#include "src/ast/identifier_expression.h"
|
||||||
|
@ -38,7 +37,7 @@ TEST_P(UnaryMethodTest, Emit) {
|
||||||
auto params = GetParam();
|
auto params = GetParam();
|
||||||
|
|
||||||
auto expr = std::make_unique<ast::IdentifierExpression>("expr");
|
auto expr = std::make_unique<ast::IdentifierExpression>("expr");
|
||||||
std::vector<std::unique_ptr<ast::Expression>> ops;
|
ast::ExpressionList ops;
|
||||||
ops.push_back(std::move(expr));
|
ops.push_back(std::move(expr));
|
||||||
|
|
||||||
ast::UnaryMethodExpression method(params.method, std::move(ops));
|
ast::UnaryMethodExpression method(params.method, std::move(ops));
|
||||||
|
@ -62,7 +61,7 @@ TEST_P(UnaryMethodTest_MultiParam, Emit) {
|
||||||
|
|
||||||
auto expr1 = std::make_unique<ast::IdentifierExpression>("expr1");
|
auto expr1 = std::make_unique<ast::IdentifierExpression>("expr1");
|
||||||
auto expr2 = std::make_unique<ast::IdentifierExpression>("expr2");
|
auto expr2 = std::make_unique<ast::IdentifierExpression>("expr2");
|
||||||
std::vector<std::unique_ptr<ast::Expression>> ops;
|
ast::ExpressionList ops;
|
||||||
ops.push_back(std::move(expr1));
|
ops.push_back(std::move(expr1));
|
||||||
ops.push_back(std::move(expr2));
|
ops.push_back(std::move(expr2));
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/identifier_expression.h"
|
#include "src/ast/identifier_expression.h"
|
||||||
|
@ -32,7 +31,7 @@ using GeneratorImplTest = testing::Test;
|
||||||
TEST_F(GeneratorImplTest, Emit_Unless) {
|
TEST_F(GeneratorImplTest, Emit_Unless) {
|
||||||
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
auto cond = std::make_unique<ast::IdentifierExpression>("cond");
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::Statement>> body;
|
ast::StatementList body;
|
||||||
body.push_back(std::make_unique<ast::NopStatement>());
|
body.push_back(std::make_unique<ast::NopStatement>());
|
||||||
body.push_back(std::make_unique<ast::KillStatement>());
|
body.push_back(std::make_unique<ast::KillStatement>());
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "src/ast/binding_decoration.h"
|
#include "src/ast/binding_decoration.h"
|
||||||
|
@ -55,7 +54,7 @@ TEST_F(GeneratorImplTest, EmitVariable_StorageClass) {
|
||||||
TEST_F(GeneratorImplTest, EmitVariable_Decorated) {
|
TEST_F(GeneratorImplTest, EmitVariable_Decorated) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>> decos;
|
ast::VariableDecorationList decos;
|
||||||
decos.push_back(std::make_unique<ast::LocationDecoration>(2));
|
decos.push_back(std::make_unique<ast::LocationDecoration>(2));
|
||||||
|
|
||||||
ast::DecoratedVariable dv;
|
ast::DecoratedVariable dv;
|
||||||
|
@ -72,7 +71,7 @@ TEST_F(GeneratorImplTest, EmitVariable_Decorated) {
|
||||||
TEST_F(GeneratorImplTest, EmitVariable_Decorated_Multiple) {
|
TEST_F(GeneratorImplTest, EmitVariable_Decorated_Multiple) {
|
||||||
ast::type::F32Type f32;
|
ast::type::F32Type f32;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<ast::VariableDecoration>> decos;
|
ast::VariableDecorationList decos;
|
||||||
decos.push_back(
|
decos.push_back(
|
||||||
std::make_unique<ast::BuiltinDecoration>(ast::Builtin::kPosition));
|
std::make_unique<ast::BuiltinDecoration>(ast::Builtin::kPosition));
|
||||||
decos.push_back(std::make_unique<ast::BindingDecoration>(0));
|
decos.push_back(std::make_unique<ast::BindingDecoration>(0));
|
||||||
|
|
Loading…
Reference in New Issue