mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Parse "virtual" keyword
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user