Disallow single statement var decl in if/while/for without blocks

This commit is contained in:
Leonardo Alt
2018-09-03 18:21:57 +02:00
parent 6e5e05779c
commit 4522c804f3
3 changed files with 26 additions and 2 deletions
+19 -2
View File
@@ -138,9 +138,25 @@ void SyntaxChecker::endVisit(ModifierDefinition const& _modifier)
m_placeholderFound = false;
}
bool SyntaxChecker::visit(WhileStatement const&)
void SyntaxChecker::checkSingleStatementVariableDeclaration(ASTNode const* _statement)
{
auto varDecl = dynamic_cast<VariableDeclarationStatement const*>(_statement);
if (varDecl)
m_errorReporter.syntaxError(_statement->location(), "Invalid variable declaration. Please declare it inside a block.");
}
bool SyntaxChecker::visit(IfStatement const& _ifStatement)
{
checkSingleStatementVariableDeclaration(&_ifStatement.trueStatement());
if (Statement const* _statement = _ifStatement.falseStatement())
checkSingleStatementVariableDeclaration(_statement);
return true;
}
bool SyntaxChecker::visit(WhileStatement const& _whileStatement)
{
m_inLoopDepth++;
checkSingleStatementVariableDeclaration(&_whileStatement.body());
return true;
}
@@ -149,9 +165,10 @@ void SyntaxChecker::endVisit(WhileStatement const&)
m_inLoopDepth--;
}
bool SyntaxChecker::visit(ForStatement const&)
bool SyntaxChecker::visit(ForStatement const& _forStatement)
{
m_inLoopDepth++;
checkSingleStatementVariableDeclaration(&_forStatement.body());
return true;
}
+6
View File
@@ -52,6 +52,12 @@ private:
virtual bool visit(ModifierDefinition const& _modifier) override;
virtual void endVisit(ModifierDefinition const& _modifier) override;
// Reports an error if _statement is a VariableDeclarationStatement.
// Used by if/while/for to check for single statement variable declarations
// without a block.
void checkSingleStatementVariableDeclaration(ASTNode const* _statement);
virtual bool visit(IfStatement const& _ifStatement) override;
virtual bool visit(WhileStatement const& _whileStatement) override;
virtual void endVisit(WhileStatement const& _whileStatement) override;
virtual bool visit(ForStatement const& _forStatement) override;