mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Allow marking free functions as suffixes
This commit is contained in:
@@ -540,7 +540,7 @@ StateMutability Parser::parseStateMutability()
|
||||
return stateMutability;
|
||||
}
|
||||
|
||||
Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVariable)
|
||||
Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVariable, bool _freeFunction)
|
||||
{
|
||||
RecursionGuard recursionGuard(*this);
|
||||
FunctionHeaderParserResult result;
|
||||
@@ -552,7 +552,18 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVari
|
||||
{
|
||||
Token token = m_scanner->currentToken();
|
||||
if (!_isStateVariable && token == Token::Identifier)
|
||||
result.modifiers.push_back(parseModifierInvocation());
|
||||
{
|
||||
if (_freeFunction && currentLiteral() == "suffix")
|
||||
{
|
||||
if (result.usableAsSuffix)
|
||||
parserError(2878_error, "Suffix already specified.");
|
||||
else
|
||||
result.usableAsSuffix = true;
|
||||
advance();
|
||||
}
|
||||
else
|
||||
result.modifiers.push_back(parseModifierInvocation());
|
||||
}
|
||||
else if (TokenTraits::isVisibilitySpecifier(token))
|
||||
{
|
||||
if (result.visibility != Visibility::Default)
|
||||
@@ -662,7 +673,7 @@ ASTPointer<ASTNode> Parser::parseFunctionDefinition(bool _freeFunction)
|
||||
name = make_shared<ASTString>();
|
||||
}
|
||||
|
||||
FunctionHeaderParserResult header = parseFunctionHeader(false);
|
||||
FunctionHeaderParserResult header = parseFunctionHeader(false /* _isStateVariable */, _freeFunction);
|
||||
|
||||
ASTPointer<Block> block;
|
||||
nodeFactory.markEndPosition();
|
||||
@@ -681,6 +692,7 @@ ASTPointer<ASTNode> Parser::parseFunctionDefinition(bool _freeFunction)
|
||||
_freeFunction,
|
||||
kind,
|
||||
header.isVirtual,
|
||||
header.usableAsSuffix,
|
||||
header.overrides,
|
||||
documentation,
|
||||
header.parameters,
|
||||
@@ -1207,7 +1219,7 @@ ASTPointer<FunctionTypeName> Parser::parseFunctionType()
|
||||
RecursionGuard recursionGuard(*this);
|
||||
ASTNodeFactory nodeFactory(*this);
|
||||
expectToken(Token::Function);
|
||||
FunctionHeaderParserResult header = parseFunctionHeader(true);
|
||||
FunctionHeaderParserResult header = parseFunctionHeader(true /* _isStateVariable */, false /* _freeFunction */);
|
||||
return nodeFactory.createNode<FunctionTypeName>(
|
||||
header.parameters,
|
||||
header.returnParameters,
|
||||
|
||||
@@ -69,6 +69,7 @@ private:
|
||||
struct FunctionHeaderParserResult
|
||||
{
|
||||
bool isVirtual = false;
|
||||
bool usableAsSuffix = false;
|
||||
ASTPointer<OverrideSpecifier> overrides;
|
||||
ASTPointer<ParameterList> parameters;
|
||||
ASTPointer<ParameterList> returnParameters;
|
||||
@@ -99,7 +100,7 @@ private:
|
||||
Visibility parseVisibilitySpecifier();
|
||||
ASTPointer<OverrideSpecifier> parseOverrideSpecifier();
|
||||
StateMutability parseStateMutability();
|
||||
FunctionHeaderParserResult parseFunctionHeader(bool _isStateVariable);
|
||||
FunctionHeaderParserResult parseFunctionHeader(bool _isStateVariable, bool _freeFunction);
|
||||
ASTPointer<ASTNode> parseFunctionDefinition(bool _freeFunction = false);
|
||||
ASTPointer<StructDefinition> parseStructDefinition();
|
||||
ASTPointer<EnumDefinition> parseEnumDefinition();
|
||||
|
||||
Reference in New Issue
Block a user