Merge pull request #8106 from random-internet-cat/move-contract-kind

Move ContractKind from ContractDefinition to file-scope
This commit is contained in:
chriseth
2020-01-08 13:06:26 +01:00
committed by GitHub
11 changed files with 27 additions and 27 deletions
@@ -208,18 +208,18 @@ void ContractLevelChecker::checkAbstractFunctions(ContractDefinition const& _con
if (_contract.abstract())
{
if (_contract.contractKind() == ContractDefinition::ContractKind::Interface)
if (_contract.contractKind() == ContractKind::Interface)
m_errorReporter.typeError(_contract.location(), "Interfaces do not need the \"abstract\" keyword, they are abstract implicitly.");
else if (_contract.contractKind() == ContractDefinition::ContractKind::Library)
else if (_contract.contractKind() == ContractKind::Library)
m_errorReporter.typeError(_contract.location(), "Libraries cannot be abstract.");
else
solAssert(_contract.contractKind() == ContractDefinition::ContractKind::Contract, "");
solAssert(_contract.contractKind() == ContractKind::Contract, "");
}
// For libraries, we emit errors on function-level, so this is fine as long as we do
// not have inheritance for libraries.
if (
_contract.contractKind() == ContractDefinition::ContractKind::Contract &&
_contract.contractKind() == ContractKind::Contract &&
!_contract.abstract() &&
!_contract.annotation().unimplementedFunctions.empty()
)
+4 -4
View File
@@ -327,7 +327,7 @@ bool TypeChecker::visit(StructDefinition const& _struct)
bool TypeChecker::visit(FunctionDefinition const& _function)
{
bool isLibraryFunction = _function.inContractKind() == ContractDefinition::ContractKind::Library;
bool isLibraryFunction = _function.inContractKind() == ContractKind::Library;
if (_function.markedVirtual())
{
@@ -426,7 +426,7 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
if (_function.isConstructor())
m_errorReporter.typeError(_function.location(), "Constructor cannot be defined in interfaces.");
}
else if (m_scope->contractKind() == ContractDefinition::ContractKind::Library)
else if (m_scope->contractKind() == ContractKind::Library)
if (_function.isConstructor())
m_errorReporter.typeError(_function.location(), "Constructor cannot be defined in libraries.");
if (_function.isImplemented())
@@ -1734,7 +1734,7 @@ void TypeChecker::typeCheckFallbackFunction(FunctionDefinition const& _function)
{
solAssert(_function.isFallback(), "");
if (_function.inContractKind() == ContractDefinition::ContractKind::Library)
if (_function.inContractKind() == ContractKind::Library)
m_errorReporter.typeError(_function.location(), "Libraries cannot have fallback functions.");
if (_function.stateMutability() != StateMutability::NonPayable && _function.stateMutability() != StateMutability::Payable)
m_errorReporter.typeError(
@@ -1760,7 +1760,7 @@ void TypeChecker::typeCheckReceiveFunction(FunctionDefinition const& _function)
{
solAssert(_function.isReceive(), "");
if (_function.inContractKind() == ContractDefinition::ContractKind::Library)
if (_function.inContractKind() == ContractKind::Library)
m_errorReporter.typeError(_function.location(), "Libraries cannot have receive ether functions.");
if (_function.stateMutability() != StateMutability::Payable)
+1 -1
View File
@@ -272,7 +272,7 @@ void ViewPureChecker::reportMutability(
{
// We do not warn for library functions because they cannot be payable anyway.
// Also internal functions should be allowed to use `msg.value`.
if (m_currentFunction->isPublic() && m_currentFunction->inContractKind() != ContractDefinition::ContractKind::Library)
if (m_currentFunction->isPublic() && m_currentFunction->inContractKind() != ContractKind::Library)
{
if (_nestedLocation)
m_errorReporter.typeError(
+1 -1
View File
@@ -305,7 +305,7 @@ TypeDeclarationAnnotation& EnumDefinition::annotation() const
return dynamic_cast<TypeDeclarationAnnotation&>(*m_annotation);
}
ContractDefinition::ContractKind FunctionDefinition::inContractKind() const
ContractKind FunctionDefinition::inContractKind() const
{
auto contractDef = dynamic_cast<ContractDefinition const*>(scope());
solAssert(contractDef, "Enclosing Scope of FunctionDefinition was not set.");
+1 -3
View File
@@ -376,8 +376,6 @@ protected:
class ContractDefinition: public Declaration, public Documented
{
public:
enum class ContractKind { Interface, Contract, Library };
ContractDefinition(
SourceLocation const& _location,
ASTPointer<ASTString> const& _name,
@@ -709,7 +707,7 @@ public:
/// @returns the external identifier of this function (the hash of the signature) as a hex string.
std::string externalIdentifierHex() const;
ContractDefinition::ContractKind inContractKind() const;
ContractKind inContractKind() const;
TypePointer type() const override;
+2
View File
@@ -67,4 +67,6 @@ struct FuncCallArguments
bool hasNamedArguments() const { return !names.empty(); }
};
enum class ContractKind { Interface, Contract, Library };
}
+4 -4
View File
@@ -832,15 +832,15 @@ string ASTJsonConverter::location(VariableDeclaration::Location _location)
return {};
}
string ASTJsonConverter::contractKind(ContractDefinition::ContractKind _kind)
string ASTJsonConverter::contractKind(ContractKind _kind)
{
switch (_kind)
{
case ContractDefinition::ContractKind::Interface:
case ContractKind::Interface:
return "interface";
case ContractDefinition::ContractKind::Contract:
case ContractKind::Contract:
return "contract";
case ContractDefinition::ContractKind::Library:
case ContractKind::Library:
return "library";
}
+1 -1
View File
@@ -145,7 +145,7 @@ private:
}
Json::Value inlineAssemblyIdentifierToJson(std::pair<yul::Identifier const* , InlineAssemblyAnnotation::ExternalIdentifierInfo> _info) const;
static std::string location(VariableDeclaration::Location _location);
static std::string contractKind(ContractDefinition::ContractKind _kind);
static std::string contractKind(ContractKind _kind);
static std::string functionCallKind(FunctionCallKind _kind);
static std::string literalTokenKind(Token _token);
static std::string type(Expression const& _expression);
+6 -6
View File
@@ -243,9 +243,9 @@ ASTPointer<ImportDirective> Parser::parseImportDirective()
return nodeFactory.createNode<ImportDirective>(path, unitAlias, move(symbolAliases));
}
std::pair<ContractDefinition::ContractKind, bool> Parser::parseContractKind()
std::pair<ContractKind, bool> Parser::parseContractKind()
{
ContractDefinition::ContractKind kind;
ContractKind kind;
bool abstract = false;
if (m_scanner->currentToken() == Token::Abstract)
{
@@ -255,13 +255,13 @@ std::pair<ContractDefinition::ContractKind, bool> Parser::parseContractKind()
switch (m_scanner->currentToken())
{
case Token::Interface:
kind = ContractDefinition::ContractKind::Interface;
kind = ContractKind::Interface;
break;
case Token::Contract:
kind = ContractDefinition::ContractKind::Contract;
kind = ContractKind::Contract;
break;
case Token::Library:
kind = ContractDefinition::ContractKind::Library;
kind = ContractKind::Library;
break;
default:
solAssert(false, "Invalid contract kind.");
@@ -278,7 +278,7 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
ASTPointer<ASTString> docString;
vector<ASTPointer<InheritanceSpecifier>> baseContracts;
vector<ASTPointer<ASTNode>> subNodes;
std::pair<ContractDefinition::ContractKind, bool> contractKind{};
std::pair<ContractKind, bool> contractKind{};
try
{
if (m_scanner->currentCommentLiteral() != "")
+2 -2
View File
@@ -82,9 +82,9 @@ private:
void parsePragmaVersion(langutil::SourceLocation const& _location, std::vector<Token> const& _tokens, std::vector<std::string> const& _literals);
ASTPointer<PragmaDirective> parsePragmaDirective();
ASTPointer<ImportDirective> parseImportDirective();
/// @returns an std::pair<ContractDefinition::ContractKind, bool>, where
/// @returns an std::pair<ContractKind, bool>, where
/// result.second is set to true, if an abstract contract was parsed, false otherwise.
std::pair<ContractDefinition::ContractKind, bool> parseContractKind();
std::pair<ContractKind, bool> parseContractKind();
ASTPointer<ContractDefinition> parseContractDefinition();
ASTPointer<InheritanceSpecifier> parseInheritanceSpecifier();
Visibility parseVisibilitySpecifier();