diff --git a/libsolidity/analysis/OverrideChecker.cpp b/libsolidity/analysis/OverrideChecker.cpp index 922070171..0ae26c987 100644 --- a/libsolidity/analysis/OverrideChecker.cpp +++ b/libsolidity/analysis/OverrideChecker.cpp @@ -154,7 +154,7 @@ void OverrideChecker::checkIllegalOverrides(ContractDefinition const& _contract) if (!hasEqualNameAndParameters(*stateVar, **it)) continue; - if ((*it)->visibility() != Declaration::Visibility::External) + if ((*it)->visibility() != Visibility::External) overrideError(*stateVar, **it, "Public state variables can only override functions with external visibility."); else checkOverride(*stateVar, **it); @@ -265,8 +265,8 @@ void OverrideChecker::checkOverride(T const& _overriding, U const& _super) // Visibility change from external to public is fine. // Any other change is disallowed. if (!( - _super.visibility() == FunctionDefinition::Visibility::External && - _overriding.visibility() == FunctionDefinition::Visibility::Public + _super.visibility() == Visibility::External && + _overriding.visibility() == Visibility::Public )) overrideError(_overriding, _super, "Overriding " + overridingName + " visibility differs."); } diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp index c7960d20c..815cf184a 100644 --- a/libsolidity/analysis/ReferencesResolver.cpp +++ b/libsolidity/analysis/ReferencesResolver.cpp @@ -198,21 +198,21 @@ void ReferencesResolver::endVisit(FunctionTypeName const& _typeName) { switch (_typeName.visibility()) { - case VariableDeclaration::Visibility::Internal: - case VariableDeclaration::Visibility::External: + case Visibility::Internal: + case Visibility::External: break; default: fatalTypeError(_typeName.location(), "Invalid visibility, can only be \"external\" or \"internal\"."); return; } - if (_typeName.isPayable() && _typeName.visibility() != VariableDeclaration::Visibility::External) + if (_typeName.isPayable() && _typeName.visibility() != Visibility::External) { fatalTypeError(_typeName.location(), "Only external function types can be payable."); return; } - if (_typeName.visibility() == VariableDeclaration::Visibility::External) + if (_typeName.visibility() == Visibility::External) for (auto const& t: _typeName.parameterTypes() + _typeName.returnParameterTypes()) { solAssert(t->annotation().type, "Type not set for parameter."); diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index a171bcdb0..43642de3c 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -332,7 +332,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function) { if (_function.annotation().contract->isInterface()) m_errorReporter.warning(_function.location(), "Interface functions are implicitly \"virtual\""); - if (_function.visibility() == Declaration::Visibility::Private) + if (_function.visibility() == Visibility::Private) m_errorReporter.typeError(_function.location(), "\"virtual\" and \"private\" cannot be used together."); } @@ -419,7 +419,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function) if (_function.isImplemented()) m_errorReporter.typeError(_function.location(), "Functions in interfaces cannot have an implementation."); - if (_function.visibility() != FunctionDefinition::Visibility::External) + if (_function.visibility() != Visibility::External) m_errorReporter.typeError(_function.location(), "Functions in interfaces must be declared external."); if (_function.isConstructor()) @@ -498,7 +498,7 @@ bool TypeChecker::visit(VariableDeclaration const& _variable) if (!varType->canLiveOutsideStorage()) m_errorReporter.typeError(_variable.location(), "Type " + varType->toString() + " is only valid in storage."); } - else if (_variable.visibility() >= VariableDeclaration::Visibility::Public) + else if (_variable.visibility() >= Visibility::Public) { FunctionType getter(_variable); if (!_variable.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::ABIEncoderV2)) @@ -604,7 +604,7 @@ void TypeChecker::visitManually( bool TypeChecker::visit(EventDefinition const& _eventDef) { - solAssert(_eventDef.visibility() > Declaration::Visibility::Internal, ""); + solAssert(_eventDef.visibility() > Visibility::Internal, ""); unsigned numIndexed = 0; for (ASTPointer const& var: _eventDef.parameters()) { @@ -1742,7 +1742,7 @@ void TypeChecker::typeCheckFallbackFunction(FunctionDefinition const& _function) stateMutabilityToString(_function.stateMutability()) + "\"." ); - if (_function.visibility() != FunctionDefinition::Visibility::External) + if (_function.visibility() != Visibility::External) m_errorReporter.typeError(_function.location(), "Fallback function must be defined as \"external\"."); if (!_function.returnParameters().empty()) { @@ -1769,7 +1769,7 @@ void TypeChecker::typeCheckReceiveFunction(FunctionDefinition const& _function) stateMutabilityToString(_function.stateMutability()) + "\"." ); - if (_function.visibility() != FunctionDefinition::Visibility::External) + if (_function.visibility() != Visibility::External) m_errorReporter.typeError(_function.location(), "Receive ether function must be defined as \"external\"."); if (!_function.returnParameters().empty()) m_errorReporter.typeError(_function.returnParameterList()->location(), "Receive ether function cannot return values."); @@ -1790,7 +1790,7 @@ void TypeChecker::typeCheckConstructor(FunctionDefinition const& _function) stateMutabilityToString(_function.stateMutability()) + "\"." ); - if (_function.visibility() != FunctionDefinition::Visibility::Public && _function.visibility() != FunctionDefinition::Visibility::Internal) + if (_function.visibility() != Visibility::Public && _function.visibility() != Visibility::Internal) m_errorReporter.typeError(_function.location(), "Constructor must be public or internal."); } diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index c45a6d98d..34035d536 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -328,13 +328,13 @@ FunctionTypePointer FunctionDefinition::functionType(bool _internal) const { switch (visibility()) { - case Declaration::Visibility::Default: + case Visibility::Default: solAssert(false, "visibility() should not return Default"); - case Declaration::Visibility::Private: - case Declaration::Visibility::Internal: - case Declaration::Visibility::Public: + case Visibility::Private: + case Visibility::Internal: + case Visibility::Public: return TypeProvider::function(*this, _internal); - case Declaration::Visibility::External: + case Visibility::External: return {}; } } @@ -342,13 +342,13 @@ FunctionTypePointer FunctionDefinition::functionType(bool _internal) const { switch (visibility()) { - case Declaration::Visibility::Default: + case Visibility::Default: solAssert(false, "visibility() should not return Default"); - case Declaration::Visibility::Private: - case Declaration::Visibility::Internal: + case Visibility::Private: + case Visibility::Internal: return {}; - case Declaration::Visibility::Public: - case Declaration::Visibility::External: + case Visibility::Public: + case Visibility::External: return TypeProvider::function(*this, _internal); } } @@ -359,7 +359,7 @@ FunctionTypePointer FunctionDefinition::functionType(bool _internal) const TypePointer FunctionDefinition::type() const { - solAssert(visibility() != Declaration::Visibility::External, ""); + solAssert(visibility() != Visibility::External, ""); return TypeProvider::function(*this); } @@ -518,7 +518,7 @@ bool VariableDeclaration::isExternalCallableParameter() const return false; if (auto const* callable = dynamic_cast(scope())) - if (callable->visibility() == Declaration::Visibility::External) + if (callable->visibility() == Visibility::External) return !isReturnParameter(); return false; @@ -530,9 +530,9 @@ bool VariableDeclaration::isInternalCallableParameter() const return false; if (auto const* funTypeName = dynamic_cast(scope())) - return funTypeName->visibility() == Declaration::Visibility::Internal; + return funTypeName->visibility() == Visibility::Internal; else if (auto const* callable = dynamic_cast(scope())) - return callable->visibility() <= Declaration::Visibility::Internal; + return callable->visibility() <= Visibility::Internal; return false; } @@ -607,13 +607,13 @@ FunctionTypePointer VariableDeclaration::functionType(bool _internal) const return nullptr; switch (visibility()) { - case Declaration::Visibility::Default: + case Visibility::Default: solAssert(false, "visibility() should not return Default"); - case Declaration::Visibility::Private: - case Declaration::Visibility::Internal: + case Visibility::Private: + case Visibility::Internal: return nullptr; - case Declaration::Visibility::Public: - case Declaration::Visibility::External: + case Visibility::Public: + case Visibility::External: return TypeProvider::function(*this); } diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 9a07baafb..7ca665890 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -182,20 +182,18 @@ protected: class Declaration: public ASTNode, public Scopable { public: - /// Visibility ordered from restricted to unrestricted. - enum class Visibility { Default, Private, Internal, Public, External }; - static std::string visibilityToString(Declaration::Visibility _visibility) + static std::string visibilityToString(Visibility _visibility) { switch (_visibility) { - case Declaration::Visibility::Public: + case Visibility::Public: return "public"; - case Declaration::Visibility::Internal: + case Visibility::Internal: return "internal"; - case Declaration::Visibility::Private: + case Visibility::Private: return "private"; - case Declaration::Visibility::External: + case Visibility::External: return "external"; default: solAssert(false, "Invalid visibility specifier."); @@ -602,7 +600,7 @@ public: CallableDeclaration( SourceLocation const& _location, ASTPointer const& _name, - Declaration::Visibility _visibility, + Visibility _visibility, ASTPointer const& _parameters, bool _isVirtual = false, ASTPointer const& _overrides = nullptr, @@ -665,7 +663,7 @@ public: FunctionDefinition( SourceLocation const& _location, ASTPointer const& _name, - Declaration::Visibility _visibility, + Visibility _visibility, StateMutability _stateMutability, Token _kind, bool _isVirtual, @@ -1028,7 +1026,7 @@ public: SourceLocation const& _location, ASTPointer const& _parameterTypes, ASTPointer const& _returnTypes, - Declaration::Visibility _visibility, + Visibility _visibility, StateMutability _stateMutability ): TypeName(_location), m_parameterTypes(_parameterTypes), m_returnTypes(_returnTypes), @@ -1042,9 +1040,9 @@ public: ASTPointer const& parameterTypeList() const { return m_parameterTypes; } ASTPointer const& returnParameterTypeList() const { return m_returnTypes; } - Declaration::Visibility visibility() const + Visibility visibility() const { - return m_visibility == Declaration::Visibility::Default ? Declaration::Visibility::Internal : m_visibility; + return m_visibility == Visibility::Default ? Visibility::Internal : m_visibility; } StateMutability stateMutability() const { return m_stateMutability; } bool isPayable() const { return m_stateMutability == StateMutability::Payable; } @@ -1052,7 +1050,7 @@ public: private: ASTPointer m_parameterTypes; ASTPointer m_returnTypes; - Declaration::Visibility m_visibility; + Visibility m_visibility; StateMutability m_stateMutability; }; diff --git a/libsolidity/ast/ASTEnums.h b/libsolidity/ast/ASTEnums.h index 11e539a8c..3ad329498 100644 --- a/libsolidity/ast/ASTEnums.h +++ b/libsolidity/ast/ASTEnums.h @@ -34,6 +34,9 @@ namespace solidity // How a function can mutate the EVM state. enum class StateMutability { Pure, View, NonPayable, Payable }; +/// Visibility ordered from restricted to unrestricted. +enum class Visibility { Default, Private, Internal, Public, External }; + inline std::string stateMutabilityToString(StateMutability const& _stateMutability) { switch (_stateMutability) diff --git a/libsolidity/ast/ASTForward.h b/libsolidity/ast/ASTForward.h index d950a35f9..b84554563 100644 --- a/libsolidity/ast/ASTForward.h +++ b/libsolidity/ast/ASTForward.h @@ -26,7 +26,12 @@ #include #include -// Forward-declare all AST node types +// Forward-declare all AST node types and related enums. + +namespace langutil +{ +enum class Token : unsigned int; +} namespace dev { diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index e4e9a29ff..2eada7e5d 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -2601,7 +2601,7 @@ FunctionType::FunctionType(EventDefinition const& _event): FunctionType::FunctionType(FunctionTypeName const& _typeName): m_parameterNames(_typeName.parameterTypes().size(), ""), m_returnParameterNames(_typeName.returnParameterTypes().size(), ""), - m_kind(_typeName.visibility() == VariableDeclaration::Visibility::External ? Kind::External : Kind::Internal), + m_kind(_typeName.visibility() == Visibility::External ? Kind::External : Kind::Internal), m_stateMutability(_typeName.stateMutability()) { if (_typeName.isPayable()) @@ -3011,8 +3011,8 @@ MemberList::MemberMap FunctionType::nativeMembers(ContractDefinition const*) con { auto const* functionDefinition = dynamic_cast(m_declaration); solAssert(functionDefinition, ""); - solAssert(functionDefinition->visibility() != Declaration::Visibility::Private, ""); - if (functionDefinition->visibility() != Declaration::Visibility::Internal) + solAssert(functionDefinition->visibility() != Visibility::Private, ""); + if (functionDefinition->visibility() != Visibility::Internal) { auto const* contract = dynamic_cast(m_declaration->scope()); solAssert(contract, ""); diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index f56f72f77..881bd3cab 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -377,23 +377,23 @@ ASTPointer Parser::parseInheritanceSpecifier() return nodeFactory.createNode(name, std::move(arguments)); } -Declaration::Visibility Parser::parseVisibilitySpecifier() +Visibility Parser::parseVisibilitySpecifier() { - Declaration::Visibility visibility(Declaration::Visibility::Default); + Visibility visibility(Visibility::Default); Token token = m_scanner->currentToken(); switch (token) { case Token::Public: - visibility = Declaration::Visibility::Public; + visibility = Visibility::Public; break; case Token::Internal: - visibility = Declaration::Visibility::Internal; + visibility = Visibility::Internal; break; case Token::Private: - visibility = Declaration::Visibility::Private; + visibility = Visibility::Private; break; case Token::External: - visibility = Declaration::Visibility::External; + visibility = Visibility::External; break; default: solAssert(false, "Invalid visibility specifier."); @@ -476,11 +476,11 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVari result.modifiers.push_back(parseModifierInvocation()); else if (TokenTraits::isVisibilitySpecifier(token)) { - if (result.visibility != Declaration::Visibility::Default) + if (result.visibility != Visibility::Default) { // There is the special case of a public state variable of function type. // Detect this and return early. - if (_isStateVariable && (result.visibility == Declaration::Visibility::External || result.visibility == Declaration::Visibility::Internal)) + if (_isStateVariable && (result.visibility == Visibility::External || result.visibility == Visibility::Internal)) break; parserError(string( "Visibility already specified as \"" + @@ -687,7 +687,7 @@ ASTPointer Parser::parseVariableDeclaration( bool isIndexed = false; bool isDeclaredConst = false; ASTPointer overrides = nullptr; - Declaration::Visibility visibility(Declaration::Visibility::Default); + Visibility visibility(Visibility::Default); VariableDeclaration::Location location = VariableDeclaration::Location::Unspecified; ASTPointer identifier; @@ -697,7 +697,7 @@ ASTPointer Parser::parseVariableDeclaration( if (_options.isStateVariable && TokenTraits::isVariableVisibilitySpecifier(token)) { nodeFactory.markEndPosition(); - if (visibility != Declaration::Visibility::Default) + if (visibility != Visibility::Default) { parserError(string( "Visibility already specified as \"" + @@ -1534,7 +1534,7 @@ ASTPointer Parser::parseVariableDeclarationStateme ASTPointer(), name, ASTPointer(), - VariableDeclaration::Visibility::Default + Visibility::Default ); } variables.push_back(var); diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h index e4236a43b..f9b6197b4 100644 --- a/libsolidity/parsing/Parser.h +++ b/libsolidity/parsing/Parser.h @@ -74,7 +74,7 @@ private: ASTPointer overrides; ASTPointer parameters; ASTPointer returnParameters; - Declaration::Visibility visibility = Declaration::Visibility::Default; + Visibility visibility = Visibility::Default; StateMutability stateMutability = StateMutability::NonPayable; std::vector> modifiers; }; @@ -89,7 +89,7 @@ private: std::pair parseContractKind(); ASTPointer parseContractDefinition(); ASTPointer parseInheritanceSpecifier(); - Declaration::Visibility parseVisibilitySpecifier(); + Visibility parseVisibilitySpecifier(); ASTPointer parseOverrideSpecifier(); StateMutability parseStateMutability(); FunctionHeaderParserResult parseFunctionHeader(bool _isStateVariable);