Merge pull request #9164 from ethereum/refactorInContractKind

Replace inContractKind by libraryFunction.
This commit is contained in:
chriseth 2020-06-09 18:22:00 +02:00 committed by GitHub
commit ebdd8fd2b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 19 deletions

View File

@ -328,8 +328,6 @@ void TypeChecker::endVisit(ModifierDefinition const& _modifier)
bool TypeChecker::visit(FunctionDefinition const& _function) bool TypeChecker::visit(FunctionDefinition const& _function)
{ {
bool isLibraryFunction = _function.inContractKind() == ContractKind::Library;
if (_function.markedVirtual()) if (_function.markedVirtual())
{ {
if (_function.annotation().contract->isInterface()) if (_function.annotation().contract->isInterface())
@ -340,7 +338,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
if (_function.isPayable()) if (_function.isPayable())
{ {
if (isLibraryFunction) if (_function.libraryFunction())
m_errorReporter.typeError(7708_error, _function.location(), "Library functions cannot be payable."); m_errorReporter.typeError(7708_error, _function.location(), "Library functions cannot be payable.");
if (_function.isOrdinary() && !_function.isPartOfExternalInterface()) if (_function.isOrdinary() && !_function.isPartOfExternalInterface())
m_errorReporter.typeError(5587_error, _function.location(), "Internal functions cannot be payable."); m_errorReporter.typeError(5587_error, _function.location(), "Internal functions cannot be payable.");
@ -350,15 +348,13 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
{ {
if (var.referenceLocation() != VariableDeclaration::Location::Storage) if (var.referenceLocation() != VariableDeclaration::Location::Storage)
{ {
if (!isLibraryFunction && _function.isPublic()) if (!_function.libraryFunction() && _function.isPublic())
m_errorReporter.typeError(3442_error, var.location(), "Mapping types can only have a data location of \"storage\" and thus only be parameters or return variables for internal or library functions."); m_errorReporter.typeError(3442_error, var.location(), "Mapping types can only have a data location of \"storage\" and thus only be parameters or return variables for internal or library functions.");
else else
m_errorReporter.typeError(5380_error, var.location(), "Mapping types can only have a data location of \"storage\"." ); m_errorReporter.typeError(5380_error, var.location(), "Mapping types can only have a data location of \"storage\"." );
} }
else else
{ solAssert(_function.libraryFunction() || !_function.isPublic(), "Mapping types for parameters or return variables can only be used in internal or library functions.");
solAssert(isLibraryFunction || !_function.isPublic(), "Mapping types for parameters or return variables can only be used in internal or library functions.");
}
} }
else else
{ {
@ -366,7 +362,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
m_errorReporter.typeError(3312_error, var.location(), "Type is required to live outside storage."); m_errorReporter.typeError(3312_error, var.location(), "Type is required to live outside storage.");
if (_function.isPublic()) if (_function.isPublic())
{ {
auto iType = type(var)->interfaceType(isLibraryFunction); auto iType = type(var)->interfaceType(_function.libraryFunction());
if (!iType) if (!iType)
{ {
@ -378,7 +374,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
if ( if (
_function.isPublic() && _function.isPublic() &&
!_function.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::ABIEncoderV2) && !_function.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::ABIEncoderV2) &&
!typeSupportedByOldABIEncoder(*type(var), isLibraryFunction) !typeSupportedByOldABIEncoder(*type(var), _function.libraryFunction())
) )
m_errorReporter.typeError( m_errorReporter.typeError(
4957_error, 4957_error,
@ -435,7 +431,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
_function.body().accept(*this); _function.body().accept(*this);
else if (_function.isConstructor()) else if (_function.isConstructor())
m_errorReporter.typeError(5700_error, _function.location(), "Constructor must be implemented if declared."); m_errorReporter.typeError(5700_error, _function.location(), "Constructor must be implemented if declared.");
else if (isLibraryFunction) else if (_function.libraryFunction())
m_errorReporter.typeError(9231_error, _function.location(), "Library functions must be implemented if declared."); m_errorReporter.typeError(9231_error, _function.location(), "Library functions must be implemented if declared.");
else if (!_function.virtualSemantics()) else if (!_function.virtualSemantics())
m_errorReporter.typeError(5424_error, _function.location(), "Functions without implementation must be marked virtual."); m_errorReporter.typeError(5424_error, _function.location(), "Functions without implementation must be marked virtual.");
@ -1830,7 +1826,7 @@ void TypeChecker::typeCheckFallbackFunction(FunctionDefinition const& _function)
{ {
solAssert(_function.isFallback(), ""); solAssert(_function.isFallback(), "");
if (_function.inContractKind() == ContractKind::Library) if (_function.libraryFunction())
m_errorReporter.typeError(5982_error, _function.location(), "Libraries cannot have fallback functions."); m_errorReporter.typeError(5982_error, _function.location(), "Libraries cannot have fallback functions.");
if (_function.stateMutability() != StateMutability::NonPayable && _function.stateMutability() != StateMutability::Payable) if (_function.stateMutability() != StateMutability::NonPayable && _function.stateMutability() != StateMutability::Payable)
m_errorReporter.typeError( m_errorReporter.typeError(
@ -1857,7 +1853,7 @@ void TypeChecker::typeCheckReceiveFunction(FunctionDefinition const& _function)
{ {
solAssert(_function.isReceive(), ""); solAssert(_function.isReceive(), "");
if (_function.inContractKind() == ContractKind::Library) if (_function.libraryFunction())
m_errorReporter.typeError(4549_error, _function.location(), "Libraries cannot have receive ether functions."); m_errorReporter.typeError(4549_error, _function.location(), "Libraries cannot have receive ether functions.");
if (_function.stateMutability() != StateMutability::Payable) if (_function.stateMutability() != StateMutability::Payable)

View File

@ -276,7 +276,7 @@ void ViewPureChecker::reportMutability(
{ {
// We do not warn for library functions because they cannot be payable anyway. // We do not warn for library functions because they cannot be payable anyway.
// Also internal functions should be allowed to use `msg.value`. // Also internal functions should be allowed to use `msg.value`.
if (m_currentFunction->isPublic() && m_currentFunction->inContractKind() != ContractKind::Library) if (m_currentFunction->isPublic() && !m_currentFunction->libraryFunction())
{ {
if (_nestedLocation) if (_nestedLocation)
m_errorReporter.typeError( m_errorReporter.typeError(

View File

@ -287,11 +287,11 @@ TypeDeclarationAnnotation& EnumDefinition::annotation() const
return initAnnotation<TypeDeclarationAnnotation>(); return initAnnotation<TypeDeclarationAnnotation>();
} }
ContractKind FunctionDefinition::inContractKind() const bool FunctionDefinition::libraryFunction() const
{ {
auto contractDef = dynamic_cast<ContractDefinition const*>(scope()); if (auto const* contractDef = dynamic_cast<ContractDefinition const*>(scope()))
solAssert(contractDef, "Enclosing Scope of FunctionDefinition was not set."); return contractDef->isLibrary();
return contractDef->contractKind(); return false;
} }
FunctionTypePointer FunctionDefinition::functionType(bool _internal) const FunctionTypePointer FunctionDefinition::functionType(bool _internal) const

View File

@ -799,6 +799,7 @@ public:
void accept(ASTConstVisitor& _visitor) const override; void accept(ASTConstVisitor& _visitor) const override;
StateMutability stateMutability() const { return m_stateMutability; } StateMutability stateMutability() const { return m_stateMutability; }
bool libraryFunction() const;
bool isOrdinary() const { return m_kind == Token::Function; } bool isOrdinary() const { return m_kind == Token::Function; }
bool isConstructor() const { return m_kind == Token::Constructor; } bool isConstructor() const { return m_kind == Token::Constructor; }
bool isFallback() const { return m_kind == Token::Fallback; } bool isFallback() const { return m_kind == Token::Fallback; }
@ -825,8 +826,6 @@ public:
/// @returns the external identifier of this function (the hash of the signature) as a hex string. /// @returns the external identifier of this function (the hash of the signature) as a hex string.
std::string externalIdentifierHex() const; std::string externalIdentifierHex() const;
ContractKind inContractKind() const;
TypePointer type() const override; TypePointer type() const override;
TypePointer typeViaContractName() const override; TypePointer typeViaContractName() const override;