Parse "virtual" keyword

This commit is contained in:
Mathias Baumann
2019-11-13 13:28:01 +01:00
parent 8569fe7764
commit 7d4e4b6088
8 changed files with 85 additions and 9 deletions
+42 -3
View File
@@ -466,6 +466,7 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVari
RecursionGuard recursionGuard(*this);
FunctionHeaderParserResult result;
result.isVirtual = false;
result.overrides = nullptr;
VarDeclParserOptions options;
@@ -515,6 +516,14 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVari
result.overrides = parseOverrideSpecifier();
}
else if (!_isStateVariable && token == Token::Virtual)
{
if (result.isVirtual)
parserError("Virtual already specified.");
result.isVirtual = true;
m_scanner->next();
}
else
break;
}
@@ -591,6 +600,7 @@ ASTPointer<ASTNode> Parser::parseFunctionDefinition()
header.visibility,
header.stateMutability,
kind,
header.isVirtual,
header.overrides,
docstring,
header.parameters,
@@ -679,6 +689,7 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(
bool isIndexed = false;
bool isDeclaredConst = false;
bool isVirtual = false;
ASTPointer<OverrideSpecifier> overrides = nullptr;
Declaration::Visibility visibility(Declaration::Visibility::Default);
VariableDeclaration::Location location = VariableDeclaration::Location::Unspecified;
@@ -709,6 +720,14 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(
overrides = parseOverrideSpecifier();
}
else if (_options.isStateVariable && token == Token::Virtual)
{
if (isVirtual)
parserError("Virtual already specified.");
isVirtual = true;
m_scanner->next();
}
else
{
if (_options.allowIndexed && token == Token::Indexed)
@@ -774,6 +793,7 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(
_options.isStateVariable,
isIndexed,
isDeclaredConst,
isVirtual,
overrides,
location
);
@@ -804,13 +824,32 @@ ASTPointer<ModifierDefinition> Parser::parseModifierDefinition()
parameters = createEmptyParameterList();
ASTPointer<OverrideSpecifier> overrides;
bool isVirtual = false;
while(true)
{
if (m_scanner->currentToken() == Token::Override)
{
if (overrides)
parserError("Override already specified.");
overrides = parseOverrideSpecifier();
}
else if (m_scanner->currentToken() == Token::Virtual)
{
if (isVirtual)
parserError("Virtual already specified.");
isVirtual = true;
m_scanner->next();
}
else
break;
}
if (m_scanner->currentToken() == Token::Override)
overrides = parseOverrideSpecifier();
ASTPointer<Block> block = parseBlock();
nodeFactory.setEndPositionFromNode(block);
return nodeFactory.createNode<ModifierDefinition>(name, docstring, parameters, overrides, block);
return nodeFactory.createNode<ModifierDefinition>(name, docstring, parameters, isVirtual, overrides, block);
}
ASTPointer<EventDefinition> Parser::parseEventDefinition()