Allow marking free functions as suffixes

This commit is contained in:
Kamil Śliwak
2023-05-17 16:28:04 +02:00
parent 8aa57aec24
commit e9197ff30f
103 changed files with 276 additions and 8 deletions
+16 -4
View File
@@ -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,
+2 -1
View File
@@ -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();