Add support for do/while loops

This commit adds support for a standard do <statement> while <expr>;
form of statement.  While loops were already being supported; supporting
a do/while loop mostly involves reusing code from while loops but putting
the conditional checking last.
This commit is contained in:
Rhett Aultman
2016-11-10 07:07:25 -08:00
parent dc8a5f4ef5
commit 4524ad0870
11 changed files with 92 additions and 11 deletions
+6 -2
View File
@@ -1005,18 +1005,22 @@ public:
SourceLocation const& _location,
ASTPointer<ASTString> const& _docString,
ASTPointer<Expression> const& _condition,
ASTPointer<Statement> const& _body
ASTPointer<Statement> const& _body,
bool _isDoWhile
):
BreakableStatement(_location, _docString), m_condition(_condition), m_body(_body) {}
BreakableStatement(_location, _docString), m_condition(_condition), m_body(_body),
m_isDoWhile(_isDoWhile) {}
virtual void accept(ASTVisitor& _visitor) override;
virtual void accept(ASTConstVisitor& _visitor) const override;
Expression const& condition() const { return *m_condition; }
Statement const& body() const { return *m_body; }
bool isDoWhile() const { return m_isDoWhile; }
private:
ASTPointer<Expression> m_condition;
ASTPointer<Statement> m_body;
bool m_isDoWhile;
};
/**
+5 -1
View File
@@ -264,7 +264,11 @@ bool ASTJsonConverter::visit(IfStatement const& _node)
bool ASTJsonConverter::visit(WhileStatement const& _node)
{
addJsonNode(_node, "WhileStatement", {}, true);
addJsonNode(
_node,
_node.isDoWhile() ? "DoWhileStatement" : "WhileStatement",
{},
true);
return true;
}
+1 -1
View File
@@ -208,7 +208,7 @@ bool ASTPrinter::visit(IfStatement const& _node)
bool ASTPrinter::visit(WhileStatement const& _node)
{
writeLine("WhileStatement");
writeLine(_node.isDoWhile() ? "DoWhileStatement" : "WhileStatement");
printSourcePart(_node);
return goDeeper();
}